当前位置: 首页 > 图文教程 > 开发语言 > VC++ > Windows SDK笔记(七):创建MDI窗口
Windows SDK笔记(七):创建MDI窗口
//MDI框架窗口消息处理函数LRESULT CALLBACK MDIFrameWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ //... //其他消息交给由系统提供的缺省框架处理函数DefFrameProc //其中,第二个参数是客户区窗口句柄 return ::DefFrameProc (hwnd,hwndClient, message, wParam, lParam) ;} 2.注册多个MDI子窗口类、对应提供各MDI子窗口的消息处理函数子窗口消息处理函数中,将未处理消息交由MDIDefMDIChildProc处理 //MDI子窗口消息处理函数LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ //... //... //其他消息交给由系统提供的缺省MDI子窗口处理函数 return ::DefMDIChildProc (hwnd, message, wParam, lParam) ;} 3.在框架窗口的客户区建立MDI管理子窗口MDI子窗口的管理实际上是由框架窗口客户区的"MDILIENT"窗口完成的。 这是一个系统预定义的窗口。 在主窗口收到WM_CREATE消息后: case WM_CREATE:{ hinst=((LPCREATESTRUCT) lParam)->hInstance; //填充CLIENTCREATESTRUCT结构 CLIENTCREATESTRUCT clientcreate ; clientcreate.hWindowMenu = hMenuInitWindow ; //用于添加窗口列表的菜单句柄 clientcreate.idFirstChild = 50000 ; //起始ID hwndClient =CreateWindowEx(0, "MDICLIENT", //类名称为"MDICLIENT" NULL, WS_CHILD |WS_CLIPCHILDREN| WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU)1,//ID hinst, //实例句柄 &clientcreate); //参数}return 0; 窗口的大小没有关系,缺省的框架窗口消息处理函数为让它覆盖整个客户区。 MDI客户区窗口建立后,通过向它发送消息管理子窗口的建立、销毁、排列等等。
case ID_NEW:{ MDICREATESTRUCT mdicreate; mdicreate.szClass = szMDIChildName ; //MDI子窗口的类名称 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 ; SendMessage ( hwndClient, //MDI客户区窗口句柄 WM_MDICREATE, //创建MDI子窗口 0, (LPARAM) (LPMDICREATESTRUCT) &mdicreate //创建参数 ) ;}break; 在消息循环中,用TranslateMDISysAccel处理针对MDI的热键。 while (GetMessage (&msg, NULL, 0, 0)){ if (!TranslateMDISysAccel (hwndClient, &msg) && !TranslateAccelerator (hwndFrame, hAccel, &msg)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; }} 框架窗口在收到WM_COMMAND等通知消息后,应该给当前激活的MDI窗口提供处理机会。 case WM_COMMAND:switch (LOWORD (wParam)){ //针对框架的命令 case ID_ONE: //... return 0; //针对MDI子窗口管理的命令 case IDM_WINDOW_TILE: SendMessage (hwndClient, WM_MDITILE, 0, 0) ; return 0 ; //针对子窗口的命令又子窗口去处理 default: hwndChild = (HWND) SendMessage (hwndClient, WM_MDIGETACTIVE, 0, 0) ; if (IsWindow (hwnd |