簡體   English   中英

C++ 在另一個里面創建 window

[英]C++ creating window inside another

有沒有什么辦法(如果是,請提出建議:))在另一個填充它的內部創建 window 並且始終為 100% 寬度,高度並始終保持與父級相同的 position ? 簡而言之,創建 window,其行為(大小和移動)與父 window 相同。現在我有這個:

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

我正在檢查WM_SIZEWM_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 window 的坐標,而 SetWindowPos 相對於整個屏幕設置 position。 也許有更簡單的方法將 hWnd window 與 hParent 保持在同一個 position 上?

可以使用GetWindowInfo()來查詢window的當前屏幕position。利用它,可以通過相對坐標計算出想要的屏幕position

您可以使用 MapWindowPoints 將矩形從一組坐標轉換為另一組坐標。 從父客戶空間到屏幕空間的 go 使用以下命令:

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

您可能還會發現使用 MoveWindow 而不是 SetWindowPos 更容易。

也許您可以使用父 windows hWnd 或設備上下文來取代寫入該 window 而不是創建新的 window

我有一個類似的情況,現有代碼要在選項卡窗格內繪制,我所做的是像這樣從設備上下文中獲取 hWnd

示例(class OscilloScope 是 class 創建自己的窗口):

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();
}

在 class OscilloScope 中,我刪除了創建 window 的代碼,轉而傳遞了“thisWindow”。

示例 output(基本 MFC 項目): 在此處輸入圖像描述

將 OnPaint 或 OnKey 事件傳播到底層 class 仍然有點問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM