WinAPI ZOrder的悲哀

WinAPI ZOrder的悲哀,winapi,z-order,Winapi,Z Order,我有两扇窗户,一扇小一扇大。首先创建的窗口将始终位于顶部。既不带窗顶(hWnd)也不带窗顶(hWnd,hWnd_-TOP,0,0,0,SWP_-NOMOVE | SWP_-NOSIZE)什么都不做!我也一直在尝试HWND\u顶部和HWND\u底部 看来,将一个窗口置于另一个窗口之上的唯一方法是正确的创建顺序。但这不是我需要的,我需要在飞行中改变顺序。有人知道这是什么原因吗?这些只是旧的普通CreateWindow()实例,它们都具有相同的父级。互联网上的任何搜索都不会产生任何结果。需要一些专家的

我有两扇窗户,一扇小一扇大。首先创建的窗口将始终位于顶部。
既不带窗顶(hWnd)
也不带窗顶(hWnd,hWnd_-TOP,0,0,0,SWP_-NOMOVE | SWP_-NOSIZE)什么都不做!我也一直在尝试
HWND\u顶部
HWND\u底部

看来,将一个窗口置于另一个窗口之上的唯一方法是正确的创建顺序。但这不是我需要的,我需要在飞行中改变顺序。有人知道这是什么原因吗?这些只是旧的普通
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;
}  
#包括
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM);
HWND生成子项(HWND父项、整数x、整数y、整数颜色){
HINSTANCE HINSTANCE=0;
MSG={0};
WNDCLASS wc={0};
wc.lpfnWndProc=WndProc;
wc.hInstance=hInstance;
wc.hbrBackground=CreateSolidBrush(color);/(HBRUSH)(color_窗框);
wc.lpszClassName=(LPCSTR)L“mychildwin”;
注册类(&wc);
返回CreateWindow(“编辑”,(LPCSTR)“子对象”,WS|u BORDER | WS|u child | WS|u可见,x,y,100100,父对象,0,hInstance,NULL);
}
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、LPSTR lpCmdLine、int nCmdShow){
MSG={0};
WNDCLASS wc={0};
wc.lpfnWndProc=WndProc;
wc.hInstance=hInstance;
wc.hbrBackground=CreateSolidBrush(0xff8080);
wc.lpszClassName=(LPCSTR)L“minwindowsapp”;
如果(!RegisterClass(&wc))返回1;
HWND W=CreateWindow(wc.lpszClassName,(LPCSTR)L“最小窗口应用程序”,WS|u重叠窗口| WS|u可见,0,0640480,0,0,hInstance,NULL);
HWND A=生成子对象(W,10,10,0x88ff00);
HWND B=生成子对象(W,70,70,0x8888ff);
布林温多托(B);
设置窗口位置(B、HWND_TOP、0、0、0、SWP_NOMOVE | SWP_NOSIZE);
//真正的问题在这里:第二次调用SetWindowPos
设置窗口位置(手柄、0、0、新宽度、新高度、,
SWP|U FRAMECHANGED | SWP|U NOMOVE | SWP|U NOOWNERZORDER | SWP|U NOACTIVATE |);
//添加SWP_NOZORDER修复了它。。
while(GetMessage(&msg,NULL,0,0)>0)DispatchMessage(&msg);
返回0;
}
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM){
开关(信息){
案例WM_关闭:PostQuitMessage(0);中断;
默认值:返回DefWindowProc(hWnd、message、wParam、lParam);
}
返回0;
}  
根据-文档,还可以将窗口句柄传递给要插入窗口的窗口

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
);
如果
hwninsertafter
是车窗把手,则车窗应位于之后。您尝试过这个吗?

根据-文档,还可以将窗口句柄传递给您希望插入窗口的窗口

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

如果
hwninsertafter
是车窗把手,则车窗应位于之后。你试过这个吗?

好的,也许有人会发现它真的很有用。因为真正的问题是
SetWindowPos
bringwindowto
都工作得很好,但后来在我真正的应用程序中,我再次调用
SetWindowPos
移动组件,它再次拧紧了ZOrder


所以我在第二次调用
SetWindowPos
时添加了
SWP\u NOZORDER
,好吧,也许有人会发现它真的很有用。因为真正的问题是
SetWindowPos
bringwindowto
都工作得很好,但后来在我真正的应用程序中,我再次调用
SetWindowPos
移动组件,它再次拧紧了ZOrder


所以我在对
SetWindowPos
的第二次调用中添加了
SWP_NOZORDER

是的,传递A和B确实有效!但我觉得我快疯了,因为根据我的手柄的行为,离用户更近的窗口实际上是底部窗口。检查,可能有助于解决您的困惑。是的,通过A和B确实有效!但我觉得我快疯了,因为根据我手柄的行为,离用户更近的窗口实际上是底部窗口。看看,可能有助于解决您的困惑。