1

有什么办法(如果是,请提出建议:))在另一个填充它的窗口内创建窗口,并且始终保持 100% 的宽度、高度并始终保持与父级相同的位置?简而言之,创建与父窗口相同(大小和移动)的窗口。现在我有这个:

hWnd = CreateWindowEx(WS_EX_TOOLWINDOW,L"Class", L"Title",WS_VISIBLE | WS_POPUP,
                      0, 0, 0, 0,hParent, NULL, GetModuleHandle(NULL), NULL );

我正在检查WM_SIZE或检查WM_WINDOWPOSCHANGINGCallWndRetProc 中的大小变化。

if(msg->message == WM_WINDOWPOSCHANGING && msg->hwnd == hParent){
    WINDOWPOS* pos = (WINDOWPOS*)msg->lParam;
    SetWindowPos(hWnd, 0, pos->x, pos->y, pos->cx, pos->cy, SWP_NOACTIVATE);
}

但是有一个问题,pos相对于 hParents 窗口的坐标和 SetWindowPos 设置相对于整个屏幕的位置。也许有更简单的方法可以将 hWnd 窗口保持在与 hParent 相同的位置?

4

3 回答 3

1

您可以使用GetWindowInfo()来查询窗口的当前屏幕位置。使用它,您可以根据相对坐标计算所需的屏幕位置

于 2012-04-10T14:43:58.123 回答
0

您可以使用 MapWindowPoints 将矩形从一组坐标转换为另一组坐标。要从父客户空间转到屏幕空间,请使用以下命令:

MapWindowPoints(hParent, NULL, &rect, 2);

您可能还会发现使用 MoveWindow 比使用 SetWindowPos 更容易。

于 2012-04-10T15:00:23.607 回答
0

也许您可以使用父窗口 hWnd 或设备上下文来取代在该窗口中的写入,而不是创建一个新窗口

我有一个类似的情况,现有代码要在选项卡窗格中绘制,我所做的是从设备上下文中获取 hWnd,如下所示

示例(OscilloScope 类是创建自己的窗口的类):

static bool bGridVisible = false;
HWND thisWindow = m_wndTabs.GetWindowDC()->GetWindow()->m_hWnd;

RECT rect;
GetWindowRect(&rect);
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;

// draw the grid window
auto function = [&]() {
    bGridVisible = true;
    OscilloScope demo;
    demo.Construct(width, height, 2, 2, false, thisWindow);
    demo.Start();
    bGridVisible = false;
};


if (!bGridVisible) {
    std::thread t([&]() {
        function();
    });

    t.detach();
}

在 OscilloScope 类中,我删除了用于创建窗口的代码,并改为传递“thisWindow”。

示例输出(基本 MFC 项目): 在此处输入图像描述

将 OnPaint 或 OnKey 事件传播到底层类仍然有点问题

于 2020-09-03T09:30:11.087 回答