有没有办法(如果是,请建议一些东西:))在另一个填充它的窗口内创建窗口并始终是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_SIZE
或WM_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相同的位置上?
答案 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”。
将OnPaint或OnKey事件传播到基础类仍然有些问题