如何在MFC / MDI项目中指定CDialogBar大小?

时间:2009-09-03 06:18:28

标签: c++ mfc

我想知道如何在MFC / MDI项目的MainFrame中创建CDialogBar默认大小时指定它。这是crate对话栏的代码。

    // add Dialog bar window
if (m_wndDlgBar.Create(this, IDD_ADDLGBAR,
    CBRS_RIGHT|CBRS_SIZE_DYNAMIC|CBRS_FLYBY, IDD_ADDLGBAR))
{
    TRACE0("Failed to create DlgBar\n");
    return -1;      // fail to create
}

m_wndDlgBar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndDlgBar);

我尝试调用 MoveWindow() SetWindowPos(),但它们不起作用。我想要实现的目标是在创建对话框时,无论DPI设置是什么,它都具有固定的大小(例如200x300)。如您所知,资源中绘制的对话框的大小将随着DPI设置的更改而改变。所以我希望对话框有固定的大小。

提前致谢!

-bc

2 个答案:

答案 0 :(得分:2)

如果使用自定义CDialogBar继承CDialogBar,则可以使用CalcFixedLayout可覆盖方法。例如:

class CSizingDialogBar : public CDialogBar {
    CSize m_size;
    bool m_forceSize;
public:
    CSizingDialogBar(CWnd* pParentWnd, UINT nID, CSize initialSize) 
    : CDialogBar(
        pParentWnd, nID,
        CBRS_RIGHT|CBRS_SIZE_DYNAMIC|CBRS_FLYBY, nID)
    , m_size(initialSize)
    , m_forceSize(true) {
    }
    ~CSizingDialogBar() {}

    virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz) {
        if (m_forceSize) {
            return m_size;
        }
        else {
            return CDialogBar::CalcFixedLayout( bStretch, bHorz );
        }
    }
};

答案 1 :(得分:0)

CalcFixedLayout工作正常,但如果你不能覆盖方法:

在调用MoveWindow()或SetWindowPos()之前,将CDialogBar m_sizeDefault成员更改为您需要的大小,之后应正确调整大小。实际上你还需要添加边框大小(它们也必须适合窗口)所以我使用的是这样的:

int nEdgeThickness = GetSystemMetrics(SM_CXSIZEFRAME);
pContrBar->m_sizeDefault = CSize(rc->right+nEdgeThickness*2, rc->bottom+nEdgeThickness);

我需要这个来动态改变CDialogBar的大小,所以我知道它何时会调整大小。