【问题标题】:MFC: Changing from CDialog to CWnd now the CStatusBar doesn't show?MFC:从 CDialog 更改为 CWnd 现在 CStatusBar 不显示?
【发布时间】:2020-12-06 22:37:01
【问题描述】:

为了解决在最小化主窗口时最小化CDialog 的问题,我决定尝试使用CWnd。那行得通,但现在CStatusBar 没有显示?我可能遗漏了什么,或者有什么要求要显示?

新的CWnd 是这样创建的:

CString classname=AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, 0, 0,  LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE (IDR_MAINFRAME)));
m_pDlgNowACWnd->CreateEx(0, classname, NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CRect(0, 0, 0, 0), NULL, 0)

OnInitDialog() 中的初始化现在是 OnCreate() 执行 nroaml m_StatusBar.Create(this) 然后进一步初始化它:

EnableDynamicLayout(FALSE);

// set our own height so we can scale
CStatusBarCtrl &statusctrl=m_StatusBar.GetStatusBarCtrl();
statusctrl.SetMinHeight(g_DPIHelper.Scale(20));

m_StatusBar.SetIndicators(indicators, _countof(indicators));

m_StatusBar.SetPaneInfo (0, ID_SEPARATOR, SBPS_NORMAL|SBPS_STRETCH, 0); 
m_StatusBar.SetPaneInfo (sliderPane, ID_SEPARATOR, SBPS_NORMAL, g_DPIHelper.Scale(128)); 
m_StatusBar.SetPaneInfo (textPane, ID_SEPARATOR, SBPS_NORMAL|SBPS_POPOUT, g_DPIHelper.Scale(30)); 
// add this to workaround the GetSystemMatrix() issue above.
m_StatusBar.SetPaneInfo (STATUSBARspacerPane, ID_SEPARATOR, SBPS_NORMAL, 25); 

// this is needed to calc location and size of bar
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, IDC_VIEW_ACHILDCWND);

EnableDynamicLayout();

auto pdlmanager=GetDynamicLayout();
if (pdlmanager) {
  if (pdlmanager->Create(this)) {
    pdlmanager->AddItem(m_CWndView.GetSafeHwnd(), CMFCDynamicLayout::MoveNone(), CMFCDynamicLayout::SizeHorizontalAndVertical(100, 100));
    pdlmanager->AddItem(m_StatusBar.GetSafeHwnd(), CMFCDynamicLayout::MoveVertical(100),   CMFCDynamicLayout::SizeHorizontal(100));
  }
}

这是一个状态栏,上面有一个滑块和一些文字。

主要的CDialog 现在CWnd 有两个孩子CWndCStatusBar。对话框/窗口的初始大小为 0,然后在显示对话框/窗口时调整大小以正确大小。

知道从CDialog 转换为CWnd 时我可能遗漏了什么或做错了什么吗?

其他一切正常,只是 CStatusBar 没有显示?

谢谢。

更新:

CStatusBar 的高度似乎为零。我做了一个测试,将CWnd 创建为CRect(0, 0, 10, 50) 而不是全零,并且CStatusBar 显示(尽管高度为11,比它应该短得多)。使用CWnd 时,statusctrl.SetMinHeight(g_DPIHelper.Scale(20)) 调用似乎不起作用?调整大小在RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, IDC_VIEW_ACHILDCWND); 中进行@Create())。

【问题讨论】:

  • 请注意,CDialog 经常使用对话单位进行测量,而几乎所有其他东西都使用像素。它们非常不同。
  • 我不明白这个问题。如果你想最小化一个对话框和父对话框为什么你需要做所有这些工作?
  • 我希望它们分开,而不是两者。

标签: winapi mfc statusbar


【解决方案1】:

由于CStatusBar 的高度在OnCreate() 期间创建和计算后不会改变,因此创建的CWnd 的大小需要足够高,以达到所需的CStatusBar 最小高度。所以不要这样:

m_pDlgNowACWnd->CreateEx(0, classname, NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CRect(0, 0, 0, 0), NULL, 0);

这样做:

CRect rccreate(0, 0, 0, MYDLG_STATUSBAR_MINHEIGHT);
CalcWindowRect(&rccreate);
m_pDlgNowACWnd->CreateEx(0, classname, NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE, rccreate, NULL, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多