【问题标题】:C++ creating window inside anotherC++ 在另一个窗口中创建窗口
【发布时间】:2012-04-10 14:35:07
【问题描述】:

有没有什么办法(如果有,请提出一些建议:))在另一个填充它的窗口内创建窗口,并且始终保持 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_WINDOWPOSCHANGING 在 CallWndRetProc 中的大小变化。

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

【问题讨论】:

  • 有愿望的地方总有办法。
  • 只需使用 WS_CHILD 样式而不是 WS_POPUP
  • 不,我只是在创建子窗口。如果我使用 WS_CHILD 它不会“粘”对吗?它将保持相同的位置,但大小为 const?

标签: c++ position parent win32gui


【解决方案1】:

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

【讨论】:

  • 我尝试使用GetWindowRect(hWnd, RECT);,但没有其他技巧可以使用 lParam 数据吗?编辑:也许有用于创建窗口的样式,可以让窗口更改相对于父窗口的位置(SetWindowPos)?
  • 您可以尝试 WS_CHILD 就像 Flot2011 评论的那样,但是我不熟悉它的含义
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    也许您可以使用父窗口 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 事件传播到底层类仍然有点问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 2010-11-20
      • 2011-08-15
      • 1970-01-01
      相关资源
      最近更新 更多