【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
mdi应用不是一个新的概念。如果说子窗口之间可以共享一个frame的话,那么mdi的概念就是,每一个子窗口一个frame。这样frame之间可以有各自的WndProc函数进行处理,使用起来也十分方便。
一般mdi是这么操作的,首先注册一个WNDCLASS,所有信息中最重要的信息就是lpszClassName,如下所示,
// Register the Hello child window class
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = HelloWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof (HANDLE) ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szHelloClass ;
RegisterClass (&wndclass) ;
紧接着创建一个client window。注意这个window是所有子frame的母窗口,它会在main frame创建的时候执行,函数参数中最重要的信息就是"MDICLIENT"这个信息。
case WM_CREATE: // Create the client window
clientcreate.hWindowMenu = hMenuInitWindow ;
clientcreate.idFirstChild = IDM_FIRSTCHILD ;
hwndClient = CreateWindow( TEXT("MDICLIENT"), NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
0, 0, 0, 0, hwnd, (HMENU)1, hInst, (PSTR)&clientcreate) ;
return 0 ;
一切都准备好了,那什么时候开始真正创建子frame呢,其实就是在消息响应的时候。大家可以自己添加一个菜单消息,比如像这样,注意szClass这个变量,它将sub frame和WNDCLASS联系在了一起,
case IDM_FILE_NEWHELLO: // Create a Hello child window
mdicreate.szClass = szHelloClass;
mdicreate.szTitle = TEXT ("Hello") ;
mdicreate.hOwner = hInst ;
mdicreate.x = CW_USEDEFAULT ;
mdicreate.y = CW_USEDEFAULT ;
mdicreate.cx = CW_USEDEFAULT ;
mdicreate.cy = CW_USEDEFAULT ;
mdicreate.style = 0 ;
mdicreate.lParam = 0 ;
hwndChild = CreateWindowEx(WS_EX_MDICHILD,szHelloClass,TEXT ("Hello"),0,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,hwndClient,hMenuInitWindow,hInst,NULL);
return 0 ;
等到真正菜单单击的时候,我们就发现子frame被创建了。如果需要子frame处理特定的消息,只要在HelloWndProc添加对应的代码就可以了。
ps:
a. 目前网上找到的唯一可以执行的代码就是这个地址.。
b. 基本上所有win32 mdi实例代码都来自《windows程序设计》这本书中mdi这一章的demo代码。
c. 对于上面地址提供的代码,大家只要拷贝cpp文件、rc文件、resource.h头文件这三个文件就可以了。有了这三个文件,就可以在任意版本的visual studio上面建工程,运行代码了。