C ++在另一个内部创建窗口

时间:2012-04-10 14:35:07

标签: c++ position parent win32gui

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

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

我在CallWndRetProc中检查WM_SIZEWM_WINDOWPOSCHANGING的大小更改。

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相同的位置上?

3 个答案:

答案 0 :(得分:1)

您可以使用GetWindowInfo()查询窗口的当前屏幕位置。使用此功能,您可以从相对坐标

计算所需的屏幕位置

答案 1 :(得分:0)

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

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

您也可能会发现使用MoveWindow而不是SetWindowPos更容易。

答案 2 :(得分: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项目): enter image description here

将OnPaint或OnKey事件传播到基础类仍然有些问题