因此,我有很长一段时间的CDialog
资源,因此决定向其中添加一个状态栏。这是资源:
所有控件都很好地适合对话框。现在,在运行时是这样的:
我遵循的教程是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
。然后停止创建自己的调整大小图标。我假设这两个抓爪看起来一样。因此,这可能是答案之一。
我尝试使用上述标志,但不幸的是我无法使用它:
该抓取器与我正在使用的另一个抓取器不一致,因此我需要保留原来的抓取器。
我现在意识到无论如何总是创建抓手,所以我在那里有两个抓手!现在,我派生了自己的statusbar类并关闭了默认的抓爪:
BOOL CCreateReportStatusBar::PreCreateWindow(CREATESTRUCT& cs)
{
BOOL bRet = CStatusBar::PreCreateWindow(cs);
cs.style &= ~SBARS_SIZEGRIP;
return bRet;
}
所以现在我只有一个抓手。但是我的两个问题仍然存在。
我偶然发现了this。从理论上讲,如果我重写此DrawGripper
方法,我应该能够渲染自己的抓手。不起作用永远不会调用该方法。
我决定不与系统作斗争。我让状态栏绘制了主题抓手,并且调整了我的调整大小对话框类以绘制主题抓手。所以一切都很好。