1

所以,我有一个CDialog我用了很长时间的资源,我决定给它添加一个状态栏。这是资源:

资源

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

结果

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

///////////////////////////////
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/ 控件与状态栏重叠。如何在资源编辑器中准确设置这些控件,以免发生此问题?应该如何解决?命中n错过?

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。然后停止创建我自己的调整大小图标。我假设两个夹具看起来相同。所以这可能是答案之一。

我尝试使用上面的标志,但不幸的是我不能使用它:

固定杆中的夹持器

这个抓手与我正在使用的另一个抓手不一致,所以我需要保留我原来的抓手。

更新 2

我现在意识到无论如何都会创建夹具,所以我在那里有两个夹具!我现在派生了自己的状态栏类并关闭了默认抓手:

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

    return bRet;
}

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

更新 3

我偶然发现了这一点。理论上,如果我重写这个DrawGripper方法,我应该能够渲染我自己的抓手。不工作。该方法永远不会被调用。

更新 4

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

4

0 回答 0