我有两个窗户,一个小一点,另一个大一点。首先创建的窗口将始终位于顶部。BringWindowToTop(hWnd)和SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);都不做任何事情!我也一直在尝试HWND_TOPMOST和HWND_BOTTOM。
似乎使一个窗口在另一个窗口之上的唯一方法是一个正确的创建顺序。但这不是我需要的,我需要马上改变订单。有人知道是什么导致的吗?这些只是旧的普通CreateWindow()实例,它们都具有相同的父实例。任何在互联网上的搜索都不会产生任何结果。需要专家的帮助!
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
HWND make_child(HWND Parent, int x, int y, int color) {
HINSTANCE hInstance = 0;
MSG msg = {0};
WNDCLASS wc = {0};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = CreateSolidBrush(color);//(HBRUSH)(COLOR_WINDOWFRAME);
wc.lpszClassName = (LPCSTR)L"mychildwin";
RegisterClass(&wc);
return CreateWindow("edit",(LPCSTR)"child", WS_BORDER|WS_CHILD|WS_VISIBLE, x,y,100,100,Parent,0,hInstance,NULL);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
MSG msg = {0};
WNDCLASS wc = {0};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = CreateSolidBrush(0xff8080);
wc.lpszClassName = (LPCSTR)L"minwindowsapp";
if (!RegisterClass(&wc)) return 1;
HWND W = CreateWindow(wc.lpszClassName,(LPCSTR)L"Minimal Windows Application", WS_OVERLAPPEDWINDOW|WS_VISIBLE, 0,0,640,480,0,0,hInstance,NULL);
HWND A = make_child(W, 10, 10, 0x88ff00);
HWND B = make_child(W, 70, 70, 0x8888ff);
BringWindowToTop(B);
SetWindowPos(B, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
//REAL PROBLEM WAS HERE: A second call to SetWindowPos
SetWindowPos(handle, 0, 0, 0, new_width, new_height,
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOACTIVATE);
// adding SWP_NOZORDER fixed it..
while(GetMessage(&msg, NULL, 0, 0) > 0) DispatchMessage(&msg);
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_CLOSE: PostQuitMessage(0); break;
default: return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
} 发布于 2013-03-25 08:11:09
根据MSDN-documentation,也有可能将窗口句柄传递到您想要插入的窗口之后。
BOOL WINAPI SetWindowPos(
_In_ HWND hWnd,
_In_opt_ HWND hWndInsertAfter,
_In_ int X,
_In_ int Y,
_In_ int cx,
_In_ int cy,
_In_ UINT uFlags
);当hWndInsertAfter是窗口的句柄时,您的窗口将位于之后的位置。你试过这个吗?
发布于 2013-03-25 09:15:05
好吧,也许有人会发现它真的很有用。因为真正的问题是SetWindowPos和BringWindowToTo都工作得很好,但后来在我真正的应用程序中,我又打电话给SetWindowPos来移动组件,结果又搞砸了ZOrder!
因此,我将SWP_NOZORDER添加到对SetWindowPos的第二个调用中。
https://stackoverflow.com/questions/15610206
复制相似问题