posts - 34,comments - 2,trackbacks - 0

虽说现在的应用程序普遍使用标签形式,但是多文档依然作为文档编辑重要形式。例如 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_ 阅读(419) 评论(0)  编辑 收藏 引用 所属分类: Windows程序设计

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理