Windows程序设计「MDIDemo」 范例分析笔记

/*----------------------------------

   MDIDEMO.C -- MDI多重文档界面设计

  ----------------------------------*/

 

#include <windows.h>

#include "resource.h"

 

#define INIT_MENU_POS    0

#define HELLO_MENU_POS   2

#define RECT_MENU_POS    1

 

#define IDM_FIRSTCHILD   50000

 

LRESULT CALLBACK FrameWndProc  (HWND, UINT, WPARAM, LPARAM) ;

BOOL    CALLBACK CloseEnumProc (HWND, LPARAM) ;

LRESULT CALLBACK HelloWndProc  (HWND, UINT, WPARAM, LPARAM) ;

LRESULT CALLBACK RectWndProc   (HWND, UINT, WPARAM, LPARAM) ;

 

     // 用于记录HELLO子窗口数据

 

typedef struct tagHELLODATA

{

     UINT     iColor ;

     COLORREF clrText ;

}

HELLODATA, * PHELLODATA ;

 

     // 用于记录画矩形子窗口大小

 

typedef struct tagRECTDATA

{

     short cxClient ;

     short cyClient ;

}

RECTDATA, * PRECTDATA ;

 

     // global variables

 

TCHAR     szAppName[]    = TEXT ("MDIDemo") ;

TCHAR     szFrameClass[] = TEXT ("MdiFrame") ;

TCHAR     szHelloClass[] = TEXT ("MdiHelloChild") ;

TCHAR     szRectClass[]  = TEXT ("MdiRectChild") ;

HINSTANCE hInst ;

HMENU     hMenuInit, hMenuHello, hMenuRect ;

HMENU     hMenuInitWindow, hMenuHelloWindow, hMenuRectWindow ;

 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

                    PSTR szCmdLine, int iCmdShow)

{

     HACCEL   hAccel ;

     HWND     hwndFrame, hwndClient ;

     MSG      msg ;

     WNDCLASS wndclass ;

    

     hInst = hInstance ;

    

          // 注册 框架窗口类别

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;

     wndclass.lpfnWndProc   = FrameWndProc ;

     wndclass.cbClsExtra    = 0 ;

     wndclass.cbWndExtra    = 0 ;

     wndclass.hInstance     = hInstance ;

     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;

     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;

     wndclass.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1) ;

     wndclass.lpszMenuName  = NULL ;

     wndclass.lpszClassName = szFrameClass ;

    

     if (!RegisterClass (&wndclass))

     {

          MessageBox (NULL, TEXT ("This program requires Windows NT!"),

                      szAppName, MB_ICONERROR) ;

          return 0 ;

     }

       

          // 注册 Hello子窗口类别

     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) ;

         

          // 注册 画矩形子窗口类别

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;

     wndclass.lpfnWndProc   = RectWndProc ;

     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 = szRectClass ;

         

     RegisterClass (&wndclass) ;

 

          // 载入菜单资源

     hMenuInit  = LoadMenu (hInstance, TEXT ("MdiMenuInit")) ;

     hMenuHello = LoadMenu (hInstance, TEXT ("MdiMenuHello")) ;

     hMenuRect  = LoadMenu (hInstance, TEXT ("MdiMenuRect")) ;

    

          // 取得被指定菜单激活的下拉式菜单或子菜单相对于零的位置的句柄

          // 用于创建显示 建立的窗口列表

     hMenuInitWindow  = GetSubMenu (hMenuInit,   INIT_MENU_POS) ;

     hMenuHelloWindow = GetSubMenu (hMenuHello, HELLO_MENU_POS) ;

     hMenuRectWindow  = GetSubMenu (hMenuRect,   RECT_MENU_POS) ;

    

          // 载入 快捷键

     hAccel = LoadAccelerators (hInstance, szAppName) ;

 

          // 创建 框架窗口

     hwndFrame = CreateWindow (szFrameClass, TEXT ("MDI Demonstration"),

                               WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,

                               CW_USEDEFAULT, CW_USEDEFAULT,

                               CW_USEDEFAULT, CW_USEDEFAULT,

                               NULL, hMenuInit, hInstance, NULL) ;

    

          // 获取客户端窗口句柄

     hwndClient = GetWindow (hwndFrame, GW_CHILD) ;

    

     ShowWindow (hwndFrame, iCmdShow) ;

     UpdateWindow (hwndFrame) ;

    

     while (GetMessage (&msg, NULL, 0, 0))

     {

          // TranslateMDISysAccel函数把可能对应特定MDI快捷键的按键转换成WM_SYSCOMMAND消息

          if (!TranslateMDISysAccel (hwndClient, &msg) &&

              !TranslateAccelerator (hwndFrame, hAccel, &msg))

          {

               TranslateMessage (&msg) ;

               DispatchMessage (&msg) ;

          }

     }

          // 清理删去独立的菜单

    

     DestroyMenu (hMenuHello) ;

     DestroyMenu (hMenuRect) ;

    

     return msg.wParam ;

     }

    

LRESULT CALLBACK FrameWndProc (HWND hwnd, UINT message,

                               WPARAM wParam, LPARAM lParam)

{

     static HWND        hwndClient ;

     CLIENTCREATESTRUCT clientcreate ;

     HWND               hwndChild ;

     MDICREATESTRUCT    mdicreate ;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值