如何像MDI的窗口效果??
时间:2011-12-16
来源:互联网
程序有一个主窗口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
#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
作者: chinatcp 发布时间: 2011-12-16
把B的父窗口设置为C。
这是干嘛啊? 我是要 A和B 都跑到 C的前面去啊,这样一弄,不是把 B弄到C的里面去了么...
再说我说的 窗口C 是随便一个窗口啊,类似 文件夹,任务管理器 什么的...
作者: okmnjizc 发布时间: 2011-12-16
作者: mayudong1 发布时间: 2011-12-16
第一反应,当B获得焦点的时候就先把A放到最上面,在把B放到A上面
具体怎么弄??
我做过这样的:C遮住 A和B时,鼠标点击激活B,
此时 ,由B激活A,A再激活B,然后B又激活A,A又激活B....循环了...
作者: okmnjizc 发布时间: 2011-12-16
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
BOOL SetWindowPos(
HWND hWnd,
HWND hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
UINT uFlags
);
激活了那个窗口,那个窗口就置顶。。
HWND_TOPMOST
干嘛弄置顶啊... 真是...
作者: okmnjizc 发布时间: 2011-12-16
作者: zhanghaaaa 发布时间: 2011-12-16
好像没必要搞这么复杂的吧
那怎么弄?
先确定ABC之间的主,子关系再确定下一步
晕~~ A是B父,B是A子,C跟他们没特殊关系
作者: okmnjizc 发布时间: 2011-12-16
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28