zoukankan      html  css  js  c++  java
  • 使用多文档接口(Multiple Document Interface) 一

    原文地址msdn:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644909(v=vs.85).aspx#creating_frame

    本文将介绍如何执行以下任务:

    1,注册子窗口和框架窗口类。

    2,创建框架窗口和子窗口。

    3,编写主消息循环。

    4,编写框架窗口过程。

    5,编写子窗口过程。

    6,创建子窗口。

    为了说明这些任务,本文包含了一个典型的多文档例程-MultiPad

    一,注册子窗口和框架窗口类

    典型的MDI程序必须注册两种类:它的框架类和子窗口类。如果一个程序支持超过一种以上的文档,(比如表格和曲线)它必须为每一种文档注册窗口类。框架类的结构与非MDI主窗口类相似。MDI子窗口类与非MDI子窗口类略有不同,区别如下:

    1,子窗口类应该有一个图标,因为用户可以像普通窗口程序一样最小化子窗口。

    2,子窗口类的菜单应该为空,因为子窗口不能拥有菜单。

    3,子窗口类应在窗口结构中预留额外的空间,用来为程序关联数据,比如文件名和特定的子窗口。

    下面的例子展示了 Multipad如何注册子窗口类和框架类的:

    BOOL WINAPI InitializeApplication() 
    { 
        WNDCLASS wc; 
     
        // Register the frame window class. 
     
        wc.style         = 0; 
        wc.lpfnWndProc   = (WNDPROC) MPFrameWndProc; 
        wc.cbClsExtra    = 0; 
        wc.cbWndExtra    = 0; 
        wc.hInstance     = hInst; 
        wc.hIcon         = LoadIcon(hInst, IDMULTIPAD); 
        wc.hCursor       = LoadCursor((HANDLE) NULL, IDC_ARROW); 
        wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1); 
        wc.lpszMenuName  = IDMULTIPAD; 
        wc.lpszClassName = szFrame; 
     
        if (!RegisterClass (&wc) ) 
            return FALSE; 
     
        // Register the MDI child window class. 
     
        wc.lpfnWndProc   = (WNDPROC) MPMDIChildWndProc; 
        wc.hIcon         = LoadIcon(hInst, IDNOTE); 
        wc.lpszMenuName  = (LPCTSTR) NULL; 
        wc.cbWndExtra    = CBWNDEXTRA; 
        wc.lpszClassName = szChild; 
     
        if (!RegisterClass(&wc)) 
            return FALSE; 
     
        return TRUE; 
    } 

    ,创建框架窗口和子窗口

    MDI程序在注册完窗口类后就可以创建它的窗口。首先,用CreateWindow或CreateWindowEx方法来创建框架窗口。接着,再次用CreateWindow或CreateWindowEx方法来创建子窗口。程序中子窗口的类名应该被定义为MDICLIENT,MDICLIENT是由系统定义的预注册窗口类,CreateWindow或CreateWindowEx方法中的 lpvParam参数应该指向一个CLIENTCREATESTRUCT 类型的结构。这个结构的成员变量如下表所述:

      hWindowMenu 用于控制MDI子窗口窗口菜单的句柄。子窗口创建后,程序添加子窗口标题到窗口菜单中,作为菜单子项。用户可以通过点击窗口菜单中的标题来激活子窗口。

      idFirstChild 指定第一个子窗口的标识符。创建的第一个子窗口被分配该标识符,随后创建的子窗口被分配增量标识符。当一个子窗口被销毁后,系统立刻重新分配窗口标识符,以保持范围的连续。

    当子窗口标题被添加到窗口菜单后,系统分配一个标识符给子窗口。当用户点击一个子窗口标题时,框架窗口接收到一个WM_COMMAND消息,标识符被包含在wParam参数中随消息一起发送。你需要为idFirstChild成员指定一个不与框架窗口菜单中菜单项标识符相冲突的值。

    Multipad程序的框架窗口过程在处理WM_CREATE消息时,创建了一个MDI子窗口。下面的例子展示了一个子窗口是如何被创建的。

    case WM_CREATE: 
        { 
            CLIENTCREATESTRUCT ccs; 
     
            // Retrieve the handle to the window menu and assign the 
            // first child window identifier. 
     
            ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), WINDOWMENU); 
            ccs.idFirstChild = IDM_WINDOWCHILD; 
     
            // Create the MDI client window. 
     
            hwndMDIClient = CreateWindow( "MDICLIENT", (LPCTSTR) NULL, 
                WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL, 
                0, 0, 0, 0, hwnd, (HMENU) 0xCAC, hInst, (LPSTR) &ccs); 
     
            ShowWindow(hwndMDIClient, SW_SHOW); 
        } 
        break; 

    子窗口的标题被添加到窗口菜单的底部,如果程序通过AppendMenu方法添加字符串到窗口菜单,在窗口菜单重绘后(子窗口创建或销毁),这些字符串会被子窗口标题覆盖。MDI程序应该使用InsertMenu方法来添加字符串到窗口菜单,并确认子窗口标题没有覆盖新加入的字符串。

    使用WS_CLIPCHILDREN样式来创建MDI客户端窗口,以阻止窗口绘制其子窗口。

  • 相关阅读:
    python--触发器, 储存过程, 事务
    python--MySQL权限管理 数据备份还原
    python--MySQL多表查询
    python--MySQl单表查询
    python--MySQL数据库初识
    WPF学习(7)命令
    WPF学习(6)路由事件
    WPF学习(5)依赖属性
    WPF学习(4)逻辑树和可视树
    WPF学习(3)布局
  • 原文地址:https://www.cnblogs.com/visio/p/5935412.html
Copyright © 2011-2022 走看看