如何在 MDI window 中找到 CStatusBar 的坐标?
How to find the coordinates of a CStatusBar in an MDI window?
我在 OnCreate
处理程序中的 MAINFRAME.cpp
文件中的 MDI window 中创建了一个底部状态栏,如下所示:
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);
只有这两个 return 是 RECT
对象的函数,但都 return 不正确的值。
我做错了什么?
CMainFrame::OnCreate
调用太早,windows还没有定位。我在 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]}
另一种选择是 post 用户定义的消息给自己(来自 CMainFrame::OnCreate
)并在消息处理程序中找到状态栏矩形。
我在 OnCreate
处理程序中的 MAINFRAME.cpp
文件中的 MDI window 中创建了一个底部状态栏,如下所示:
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);
只有这两个 return 是 RECT
对象的函数,但都 return 不正确的值。
我做错了什么?
CMainFrame::OnCreate
调用太早,windows还没有定位。我在 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]}
另一种选择是 post 用户定义的消息给自己(来自 CMainFrame::OnCreate
)并在消息处理程序中找到状态栏矩形。