gpt4 book ai didi

c++ - 如何在 MDI 窗口中找到 CStatusBar 的坐标?

转载 作者:行者123 更新时间:2023-11-28 04:19:59 25 4
gpt4 key购买 nike

我在 OnCreate 处理程序中的 MAINFRAME.cpp 文件中的 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 对象的函数,但都返回了不正确的值。

我做错了什么?

最佳答案

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)并在消息处理程序中找到状态栏矩形。

关于c++ - 如何在 MDI 窗口中找到 CStatusBar 的坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55673531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com