将状态栏添加到CDialog并正确设置控件位置

时间:2018-07-01 19:48:06

标签: mfc statusbar cdialog

因此,我有很长一段时间的CDialog资源,因此决定向其中添加一个状态栏。这是资源:

Resource

所有控件都很好地适合对话框。现在,在运行时是这样的:

Results

我遵循的教程是here,并且在大多数情况下都有效。这是我的设置代码:

///////////////////////////////
m_StatusBar.Create(this); //We create the status bar

m_StatusBar.SetIndicators(indicators, 2); //Set the number of panes 

CRect rect;
GetClientRect(&rect);
//Size the two panes
m_StatusBar.SetPaneInfo(0, ID_INDICATOR_DATE,
    SBPS_NORMAL, 200);
m_StatusBar.SetPaneInfo(1, ID_INDICATOR_MEETING_TYPE, SBPS_STRETCH, 0);

//This is where we actually draw it on the screen
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,
    ID_INDICATOR_DATE);
GetDynamicLayout()->AddItem(m_StatusBar.GetSafeHwnd(), 
    CMFCDynamicLayout::MoveVertical(100), CMFCDynamicLayout::SizeHorizontal(100));
///////////////////////////////

我尝试过没有WindowsBlinds,但问题仍然存在。

所以我的问题是:

1 /控件与状态栏重叠。如何在资源编辑器中准确设置这些控件,以免发生此问题?应该如何解决?想念小姐吗?

2 /“我的对话框”支持使用动态布局调整大小,并且其右下角具有OBM_SIZE

void CResizingDialog::InitialiseResizeIcon(CBitmap& rBmpResize, CStatic& rLblResize, CWnd* pDialog)
{
    CRect rcIcon, rcClient;

    if (pDialog != nullptr)
    {
        rBmpResize.LoadOEMBitmap(OBM_SIZE);
        rLblResize.Create(nullptr, WS_CHILD | WS_VISIBLE | SS_BITMAP,
            CRect(0, 0, 16, 16), pDialog, IDC_STATIC_RESIZE);
        rLblResize.SetBitmap(rBmpResize);

        pDialog->GetClientRect(rcClient);
        rLblResize.GetClientRect(rcIcon);
        rLblResize.SetWindowPos(&CWnd::wndTop,
            rcClient.right - rcIcon.Width(),
            rcClient.bottom - rcIcon.Height(), 0, 0, SWP_NOSIZE);

        CMFCDynamicLayout *pDynamicLayout = pDialog->GetDynamicLayout();
        if (pDynamicLayout != nullptr)
        {
            CMFCDynamicLayout::MoveSettings moveSettings = CMFCDynamicLayout::MoveHorizontalAndVertical(100, 100);
            CMFCDynamicLayout::SizeSettings sizeSettings = CMFCDynamicLayout::SizeNone();

            pDynamicLayout->AddItem(rLblResize.GetSafeHwnd(), moveSettings, sizeSettings);
        }
    }
}

如何避免您现在可以在右下角看到的问题?

更新

看来我应该使用CreateEx并使用这种样式SBARS_SIZEGRIP。然后停止创建自己的调整大小图标。我假设这两个抓爪看起来一样。因此,这可能是答案之一。

我尝试使用上述标志,但不幸的是我无法使用它:

Gripper in stabusbar

该抓取器与我正在使用的另一个抓取器不一致,因此我需要保留原来的抓取器。

更新2

我现在意识到无论如何总是创建抓手,所以我在那里有两个抓手!现在,我派生了自己的statusbar类并关闭了默认的抓爪:

BOOL CCreateReportStatusBar::PreCreateWindow(CREATESTRUCT& cs)
{
    BOOL bRet = CStatusBar::PreCreateWindow(cs);
    cs.style &= ~SBARS_SIZEGRIP;

    return bRet;
}

所以现在我只有一个抓手。但是我的两个问题仍然存在。

更新3

我偶然发现了this。从理论上讲,如果我重写此DrawGripper方法,我应该能够渲染自己的抓手。不起作用永远不会调用该方法。

更新4

我决定不与系统作斗争。我让状态栏绘制了主题抓手,并且调整了我的调整大小对话框类以绘制主题抓手。所以一切都很好。

0 个答案:

没有答案