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