+ -
当前位置:首页 → 问答吧 → 如何像MDI的窗口效果??

如何像MDI的窗口效果??

时间:2011-12-16

来源:互联网

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楼...

作者: okmnjizc   发布时间: 2011-12-16

C/C++ code

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

作者: okmnjizc   发布时间: 2011-12-16

把B的父窗口设置为C。

作者: chinatcp   发布时间: 2011-12-16

引用 2 楼 chinatcp 的回复:
把B的父窗口设置为C。

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

作者: okmnjizc   发布时间: 2011-12-16

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

作者: mayudong1   发布时间: 2011-12-16

引用 4 楼 mayudong1 的回复:
第一反应,当B获得焦点的时候就先把A放到最上面,在把B放到A上面

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

作者: okmnjizc   发布时间: 2011-12-16

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

HWND_TOPMOST

作者: shen_wei   发布时间: 2011-12-16

好像没必要搞这么复杂的吧

作者: gold_water   发布时间: 2011-12-16

引用 6 楼 shen_wei 的回复:
BOOL SetWindowPos(
HWND hWnd,
HWND hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
UINT uFlags
);
激活了那个窗口,那个窗口就置顶。。

HWND_TOPMOST

干嘛弄置顶啊... 真是...

作者: okmnjizc   发布时间: 2011-12-16

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

作者: zhanghaaaa   发布时间: 2011-12-16

引用 7 楼 gold_water 的回复:
好像没必要搞这么复杂的吧

那怎么弄?

引用 9 楼 zhanghaaaa 的回复:
先确定ABC之间的主,子关系再确定下一步

晕~~ A是B父,B是A子,C跟他们没特殊关系

作者: okmnjizc   发布时间: 2011-12-16

热门下载

更多