我在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\n");
return -1; // fail to create
}
}
CStatusBar
创建函数如下所示:
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
对象的仅有的两个函数,但是都返回不正确的值。
我在做什么错了?
答案 0 :(得分:1)
CMainFrame::OnCreate
被调用为时过早,窗口尚未定位。从OnCreate
调用此代码时,我在Visual Studio 2015中创建了MDI应用程序:
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
),并在消息处理程序中找到状态栏矩形。