[英]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_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 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”。
將 OnPaint 或 OnKey 事件傳播到底層 class 仍然有點問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.