2013-03-25 137 views
0

我有两个窗口,其中一个较小,在其他更大的顶部。首先创建的窗口将始终处于顶层。 BringWindowToTop(hWnd)SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);均无效!我也一直在尝试HWND_TOPMOSTHWND_BOTTOMWinAPI ZOrder困境

看起来使其中一个窗口成为其他窗口的唯一方法是正确的创建顺序。但这不是我所需要的,我需要在飞行中更改订单。任何人都知道是什么原因造成的那些只是老的普通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; 
} 
+0

要发布的任何代码? – 2013-03-25 08:08:31

回答

2

按照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是你的窗口应放置窗口的句柄。你试过这个吗?

+0

是的,通过A和B确实有效!但我认为我越来越疯狂了,因为靠近用户的窗口实际上是根据我的手柄行为的底部窗口。 – exebook 2013-03-25 08:37:04

+1

检查[this](http://msdn.microsoft.com/en-us/library/windows/desktop/ms632599(v = vs.85).aspx#zorder)out,可能有助于解决您的困惑。 – 2013-03-25 08:38:11

1

好的,也许有人会发现它真的有用。因为真正的问题是SetWindowPosBringWindowToTo都能正常工作,但是之后在我的真实应用程序中,我再次打电话给SetWindowPos来移动组件,并且它再次拧紧了ZOrder

所以我加SWP_NOZORDER第二个电话SetWindowPos