虽说现在的应用程序普遍使用标签形式,但是多文档依然作为文档编辑重要形式。例如 ps 、vc6 等。
介绍一些用法:
1、框架窗口:创建一个客户区窗口。类名:MDICLIENT
文档窗口:创建:CreateWindow(...CLIENTCREATESTRUCT)
typedef struct tagCLIENTCREATESTRUCT {
HANDLE hWindowMenu; //要加入文档列表的子菜单的句柄,文档列表菜单
UINT idFirstChild; //与文档列表中的第一个文档窗口相关联的菜单ID
} CLIENTCREATESTRUCT;
2、
typedef struct tagMDICREATESTRUCT { // mdic
LPCTSTR szClass;
LPCTSTR szTitle;
HANDLE hOwner;
int x;
int y;
int cx;
int cy;
DWORD style;
LPARAM lParam;
} MDICREATESTRUCT;
要有一个显示文档列表的菜单
3、消息:
主窗口:不处理的消息:reurn DelFrameProc(hwnd,hwndClient,message,wParam,lParam);
子文档窗口:不处理的消息: return DefMDIChildProc (hwnd, message, wParam, lParam) ;
(1)
WM_MDICREATE //应用程序通过发送 WM_MDICREATE创建一个文档
wParam = 0; // not used; must be zero
lParam = (LPARAM) (LPMDICREATESTRUCT) lpmdic; // creation data
(2)
WM_MDIGETACTIVE //客户区通过发送WM_MDIGETACTIVE获得活动子窗口的句柄
wParam = 0; // not used; must be zero
lParam = (LPBOOL) lpfMaximized; // optional pointer to maximized state flag
(3)
WM_QUERYENDSESSION //其lParam参数可以区分是否关闭
nSource = (UINT) wParam; // 未用
fLogOff = lParam
返回true表示终结,false表示未终结
(4)
WM_MDIDESTROY //发送给客户区结束子文档
wParam = (WPARAM) (HWND) hwndChild; // handle to child to close
lParam = 0;
(5)
WM_MDITILE //以平铺方式重新排列文档。
wParam = (WPARAM) (UINT) fuTile; // tiling flag
lParam = 0;
(6)
WM_MDICASCADE //以层叠方式重新排列文档
wParam = (WPARAM) (UINT) fuCascade; // cascade flag
lParam = 0;
(7)
WM_MDIICONARRANGE //重新排列所有最小化的文档
wParam = 0; // not used; must be zero
lParam = 0; // not used; must be zero
(8)当窗口变成活动或非活动的,都接收此此消息
WM_MDIACTIVATE //主窗口接收时:得到一个活动子窗口
// Message sent to MDI client
wParam = (WPARAM) (HWND) hwndChildAct; // 设定活动子窗口的句柄
lParam = 0; // not used; must be zero
//子文档窗口接收时,
// Message received by MDI child
hwndChildDeact = (HWND) wParam; // 失去活动的窗口
hwndChildAct = (HWND) lParam; // 接受活动的窗口
(9)
WM_MDISETMENU //设置主窗口的菜单。
wParam = (WPARAM) (HMENU) hmenuFrame; // handle to frame menu
lParam = (LPARAM) (HMENU) hmenuWindow; // handle to Window menu ,加入新文档列表的菜单
Windows会在该菜单项上自动添加。
(10)注意:像WM_CHILDACTIVATE 、WM_GETMINMAXINFO 、WM_MENUCHAR 、WM_MOVE 、WM_SETFOCUS 、WM_SIZE 和WM_SYSCOMMAND。要传给DefMDIChildProc处理。故:在这些消息后用break,而不return。
(11)不常用到的
WM_MDIRESTORE = $0223; //程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小
WM_MDINEXT = $0224; //程序 发送此消息给MDI客户窗口激活下一个或前一个窗口
WM_MDIMAXIMIZE = $0225; //程序发送此消息给MDI客户窗口来最大化一个MDI子窗口;
4、加速键的消息循环
while (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateMDISysAccel (hwndClient, &msg) &&
!TranslateAccelerator (hwndFrame, hAccel, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
/////////才掌握,发现现在大多数公司都弃用啦。可惜啊,可惜啊、
posted on 2011-04-11 11:03
Yu_ 阅读(437)
评论(0) 编辑 收藏 引用 所属分类:
Windows程序设计