Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调整无模式属性页的大小_C++_Visual C++_Mfc - Fatal编程技术网

C++ 调整无模式属性页的大小

C++ 调整无模式属性页的大小,c++,visual-c++,mfc,C++,Visual C++,Mfc,我有一个派生自CPropertysheet的类。它有两个属性页。我已经把床单做成了无模式的。但不可能使用鼠标拖动来调整大小。如何使属性表成为可调整大小的属性表?有关模式属性表,请参阅“注释”部分中的链接。对于非模态版本,使用WS\u THICKFRAME创建属性页。这足以使对话框调整大小。例如: propSheet->Create(this, WS_THICKFRAME | WS_VISIBLE | WS_SYSMENU | WS_POPUP | WS_VISIBLE | WS_

我有一个派生自
CPropertysheet
的类。它有两个属性页。我已经把床单做成了无模式的。但不可能使用鼠标拖动来调整大小。如何使属性表成为可调整大小的属性表?

有关模式属性表,请参阅“注释”部分中的链接。对于非模态版本,使用
WS\u THICKFRAME
创建属性页。这足以使对话框调整大小。例如:

propSheet->Create(this, WS_THICKFRAME | 
    WS_VISIBLE | WS_SYSMENU | WS_POPUP | WS_VISIBLE | WS_CAPTION);
要处理大小调整,请添加以下成员:

class CMyPropertySheet:public CPropertySheet
{
    CRect save_rc;//used in OnSize
    CRect minimum_rc;//used in OnGetMinMaxInfo
    BOOL OnInitDialog();
    void OnSize(UINT nType, int cx, int cy);
    void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);
    ...
};
重载
OnInitDialog
,如下所示:

BOOL CMyPropertySheet::OnInitDialog()
{
    //override for modeless:
    m_bModeless = FALSE;
    m_nFlags |= WF_CONTINUEMODAL;
    BOOL bResult = CPropertySheet::OnInitDialog();
    m_bModeless = TRUE;
    m_nFlags &= ~WF_CONTINUEMODAL;

    //save rectangles for resizing
    GetClientRect(&save_rc); //save the old rect for resizing
    GetClientRect(&minimum_rc); //save the original rect for OnGetMinMaxInfo

    return bResult;
}
其余部分在MSDN示例中解释:

void CMyPropertySheet::OnSize(UINT nType, int cx, int cy)
{
    CPropertySheet::OnSize(nType, cx, cy);

    if(nType == SIZE_MINIMIZED)
        return;

    if (!GetActivePage()) return;
    if (!GetTabControl()) return;

    int dx = cx - save_rc.Width();
    int dy = cy - save_rc.Height();

    //count how many childs are in window
    int count = 0;
    for(CWnd *child = GetWindow(GW_CHILD); child; child = child->GetWindow(GW_HWNDNEXT))
        count++;

    HDWP hDWP = ::BeginDeferWindowPos(count);

    for (CWnd *child = GetWindow(GW_CHILD); child; child = child->GetWindow(GW_HWNDNEXT))
    {
        CRect r;
        child->GetWindowRect(&r);
        ScreenToClient(&r);
        if (child->SendMessage(WM_GETDLGCODE) & DLGC_BUTTON)
        {
            r.left += dx;
            r.top += dy;
            ::DeferWindowPos(hDWP, child->m_hWnd, 0, r.left, r.top, 0, 0, 
                SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
        }
        else
        {
            r.right += dx;
            r.bottom += dy;
            ::DeferWindowPos(hDWP, child->m_hWnd, 0, 0, 0, r.Width(), r.Height(), 
                SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
        }
    }
    ::EndDeferWindowPos(hDWP);
    GetClientRect(&save_rc);
}

void CMyPropertySheet::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
    lpMMI->ptMinTrackSize.x = minimum_rc.Width();
    lpMMI->ptMinTrackSize.y = minimum_rc.Height();
    CPropertySheet::OnGetMinMaxInfo(lpMMI);
}

另外,在消息映射中添加\u WM\u SIZE上的
和\u WM\u GETMINMAXINFO上的

有关模态属性表,请参见注释部分中的链接。对于非模态版本,使用
WS\u THICKFRAME
创建属性页。这足以使对话框调整大小。例如:

propSheet->Create(this, WS_THICKFRAME | 
    WS_VISIBLE | WS_SYSMENU | WS_POPUP | WS_VISIBLE | WS_CAPTION);
要处理大小调整,请添加以下成员:

class CMyPropertySheet:public CPropertySheet
{
    CRect save_rc;//used in OnSize
    CRect minimum_rc;//used in OnGetMinMaxInfo
    BOOL OnInitDialog();
    void OnSize(UINT nType, int cx, int cy);
    void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);
    ...
};
重载
OnInitDialog
,如下所示:

BOOL CMyPropertySheet::OnInitDialog()
{
    //override for modeless:
    m_bModeless = FALSE;
    m_nFlags |= WF_CONTINUEMODAL;
    BOOL bResult = CPropertySheet::OnInitDialog();
    m_bModeless = TRUE;
    m_nFlags &= ~WF_CONTINUEMODAL;

    //save rectangles for resizing
    GetClientRect(&save_rc); //save the old rect for resizing
    GetClientRect(&minimum_rc); //save the original rect for OnGetMinMaxInfo

    return bResult;
}
其余部分在MSDN示例中解释:

void CMyPropertySheet::OnSize(UINT nType, int cx, int cy)
{
    CPropertySheet::OnSize(nType, cx, cy);

    if(nType == SIZE_MINIMIZED)
        return;

    if (!GetActivePage()) return;
    if (!GetTabControl()) return;

    int dx = cx - save_rc.Width();
    int dy = cy - save_rc.Height();

    //count how many childs are in window
    int count = 0;
    for(CWnd *child = GetWindow(GW_CHILD); child; child = child->GetWindow(GW_HWNDNEXT))
        count++;

    HDWP hDWP = ::BeginDeferWindowPos(count);

    for (CWnd *child = GetWindow(GW_CHILD); child; child = child->GetWindow(GW_HWNDNEXT))
    {
        CRect r;
        child->GetWindowRect(&r);
        ScreenToClient(&r);
        if (child->SendMessage(WM_GETDLGCODE) & DLGC_BUTTON)
        {
            r.left += dx;
            r.top += dy;
            ::DeferWindowPos(hDWP, child->m_hWnd, 0, r.left, r.top, 0, 0, 
                SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
        }
        else
        {
            r.right += dx;
            r.bottom += dy;
            ::DeferWindowPos(hDWP, child->m_hWnd, 0, 0, 0, r.Width(), r.Height(), 
                SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
        }
    }
    ::EndDeferWindowPos(hDWP);
    GetClientRect(&save_rc);
}

void CMyPropertySheet::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
    lpMMI->ptMinTrackSize.x = minimum_rc.Width();
    lpMMI->ptMinTrackSize.y = minimum_rc.Height();
    CPropertySheet::OnGetMinMaxInfo(lpMMI);
}

另外,在消息映射上添加
在消息映射上添加
这个链接可能会有帮助:这有帮助吗?这个链接可能会有所帮助:这个有帮助吗?编辑:更改
OnSize
,添加
if(nType==SIZE\u最小化)返回
在最小化窗口时停止调整大小。编辑:更改
OnSize
,添加
if(nType==SIZE\u minimized)返回在最小化窗口时停止调整大小。