RT
程序有一个主窗口A,然后再创建一个窗口B,然后设置 A是B的父窗口,此时 B就显示在A的范围里了,此时看起来和 MDI窗口差不多...(窗口 A和B 都是用 CreateWindowEx 来创建的)但是如下情况不一样:
我用另一个 窗口C 来遮住 A和B,然后我点击 B的标题栏激活B,此时B是激活了,但是 A和B 还是在 窗口C 的后面... 如果是MDI窗口的话,A和B 是会跑到窗口C的前面来的...请问,我不想用MDI窗口,又想实现我要的效果,如何做啊???
请教大家 ~~ 感谢。
PS:我的代码放于1楼...

解决方案 »

  1.   


    #include <windows.h>LRESULT CALLBACK ProcWindow(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    void QuitWindow();HINSTANCE g_hInstance = 0;
    HWND g_hWnd = 0;HWND g_hWnd1 = 0;////////////   ////////////   ////////////   ////////////   ////////////   ////////////int WINAPI WinMain(
    HINSTANCE _hInstance, // 当前 hInstance句柄
    HINSTANCE _hPrevInstance, // 之前的 hInstance句柄
    LPSTR _lpCmdLine, // 命令行
    int _nCmdShow // 显示状态
    )
    {
    g_hInstance = _hInstance;// 程序(.exe)的图标貌似默认是 资源文件中 的第一个图标??
    WNDCLASS wndcls = {0};
    wndcls.style = CS_HREDRAW | CS_VREDRAW;
    wndcls.lpfnWndProc = ProcWindow;
    wndcls.cbClsExtra = 0;
    wndcls.cbWndExtra = 0;
    wndcls.hInstance = _hInstance;
    wndcls.hIcon = LoadIcon(NULL, IDI_ERROR); // 窗口图标
    wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
    wndcls.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景画刷
    wndcls.lpszMenuName = NULL;
    wndcls.lpszClassName= "Test123";
    // 注册窗口类
    RegisterClass(&wndcls); g_hWnd = CreateWindowEx(
    NULL, //WS_EX_CLIENTEDGE,
    wndcls.lpszClassName,
    "ZC Window",
    WS_OVERLAPPEDWINDOW,
    100, 100,
    800, 600,
    NULL,
    NULL, //g_hMenu,
    _hInstance,
    NULL); ShowWindow(g_hWnd, SW_SHOWNORMAL);
    UpdateWindow(g_hWnd); g_hWnd1 = CreateWindowEx(
    NULL, //WS_EX_CLIENTEDGE,
    wndcls.lpszClassName,
    "ZC Window",
    WS_OVERLAPPEDWINDOW,
    100, 100,
    400, 300,
    NULL,
    NULL, //g_hMenu,
    _hInstance,
    NULL); ShowWindow(g_hWnd1, SW_SHOWNORMAL);
    UpdateWindow(g_hWnd1); SetParent(g_hWnd1, g_hWnd); MSG msg;
    while(GetMessage(&msg, 0, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    } return msg.wParam;
    }LRESULT CALLBACK ProcWindow(
    HWND _hWnd, // 窗口句柄
    UINT _uMsg, // 消息ID(identifier)
    WPARAM _wParam,
    LPARAM _lParam)
    {
    switch (_uMsg)
    {
    case WM_PAINT:
    {
    HDC hDc;
    PAINTSTRUCT ps;
    hDc = BeginPaint(_hWnd, &ps);
    TextOut(hDc, 0, 0, "ASDFG zxcvb", strlen("ASDFG zxcvb"));
    EndPaint(_hWnd, &ps);
    return 0;
    // break;
    }
    case WM_DESTROY:
    {
    QuitWindow();
    return 0;
    }
    }
    return DefWindowProc(_hWnd, _uMsg, _wParam, _lParam);
    }void QuitWindow()
    {
    DestroyWindow(g_hWnd);
    PostQuitMessage(0);
    }
      

  2.   

    这是干嘛啊? 我是要 A和B 都跑到 C的前面去啊,这样一弄,不是把 B弄到C的里面去了么...
    再说我说的 窗口C 是随便一个窗口啊,类似 文件夹,任务管理器 什么的...
      

  3.   

    第一反应,当B获得焦点的时候就先把A放到最上面,在把B放到A上面
      

  4.   

    具体怎么弄??
    我做过这样的:C遮住 A和B时,鼠标点击激活B,
    此时 ,由B激活A,A再激活B,然后B又激活A,A又激活B....循环了...
      

  5.   

    BOOL SetWindowPos( 
      HWND hWnd, 
      HWND hWndInsertAfter, 
      int X, 
      int Y, 
      int cx, 
      int cy, 
      UINT uFlags 
    ); 
    激活了那个窗口,那个窗口就置顶。。HWND_TOPMOST
      

  6.   

    先确定ABC之间的主,子关系再确定下一步
      

  7.   

    那怎么弄?晕~~ A是B父,B是A子,C跟他们没特殊关系
      

  8.   

    非模式。。SetWindowPos置换排序