如何在MDI窗口中找到CStatusBar的坐标?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MDI窗口中找到CStatusBar的坐标?相关的知识,希望对你有一定的参考价值。
我在MAINFRAME.cpp
处理程序的OnCreate
文件中的MDI窗口中创建了一个底部状态栏,如下所示:
static UINT indicators[] =
{
ID_SEPARATOR
};
int MainFrm::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE("Failed to create status bar
");
return -1; // fail to create
}
}
CStatusBar
Create函数如下所示:
virtual BOOL Create(CWnd* pParentWnd,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,
UINT nID = AFX_IDW_STATUS_BAR)
我试图找到这个状态栏的坐标,即它是x
位置,但有一些困难这样做。根据Spy ++在分辨率为1920x1080的显示器上,状态栏的x.top位置= 1055
。
我试过了,但得到了x.top = 66
:
RECT rect;
m_wndStatusBar.GetWindowRect(&rect);
int x_top_pos = rect.top;
我也曾尝试过,但得到了x_top_pos = 2
:
m_wndStatusBar.GetItemRect(0, &rect);
这些是返回RECT
对象的唯一2个函数,但都返回不正确的值。
我究竟做错了什么?
答案
CMainFrame::OnCreate
被称为太早,窗户尚未定位。我在Visual Studio 2015中创建了MDI应用程序,当从OnCreate
调用此代码时:
RECT rect;
m_wndStatusBar.GetWindowRect(&rect);
它给出了矩形{LT(440, 74) RB(440, 74) [0 x 0]}
。所以,你需要稍后调用它。例如,我将代码移动到CreateDockingWindows
:
BOOL CMainFrame::CreateDockingWindows()
{
// ....
RECT rect;
m_wndStatusBar.GetWindowRect(&rect);
return TRUE;
}
rect
是{LT(440, 873) RB(1864, 892) [1424 x 19]}
另一种选择是将用户定义的消息发布到自身(来自CMainFrame::OnCreate
)并在消息处理程序中找到状态栏矩形。
以上是关于如何在MDI窗口中找到CStatusBar的坐标?的主要内容,如果未能解决你的问题,请参考以下文章