调整无模式属性表的大小

Posted

技术标签:

【中文标题】调整无模式属性表的大小【英文标题】:Resizing a modeless property sheet 【发布时间】:2016-03-15 04:18:30 【问题描述】:

我有一个派生自CPropertysheet 的类。它有两个属性页。我已使工作表无模式。但是无法使用鼠标拖动调整大小。如何使属性表可调整大小?

【问题讨论】:

这个链接可能会有所帮助:this 这有帮助吗? support.microsoft.com/en-us/kb/325613 【参考方案1】:

有关模式属性表,请参阅评论部分中的链接。对于无模式版本,使用WS_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);

还将ON_WM_SIZEON_WM_GETMINMAXINFO 添加到消息映射

【讨论】:

编辑:更改OnSize,添加if(nType == SIZE_MINIMIZED) return; 以在窗口最小化时停止调整大小。

以上是关于调整无模式属性表的大小的主要内容,如果未能解决你的问题,请参考以下文章

fastreport怎么调整表格大小?

添加属性 QtCore.Qt.FramelessWindowHint 后如何从边缘调整窗口大小

有哪些算法可用于调整哈希表的大小?

C 无法调整哈希表的大小

CSS样式表控制背景图片大小

如何调整操作表的大小?目标C