原文地址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如何注册子窗口类和框架类的:

  1. BOOL WINAPI InitializeApplication()
  2. {
  3. WNDCLASS wc;
  4.  
  5. // Register the frame window class.
  6.  
  7. wc.style = ;
  8. wc.lpfnWndProc = (WNDPROC) MPFrameWndProc;
  9. wc.cbClsExtra = ;
  10. wc.cbWndExtra = ;
  11. wc.hInstance = hInst;
  12. wc.hIcon = LoadIcon(hInst, IDMULTIPAD);
  13. wc.hCursor = LoadCursor((HANDLE) NULL, IDC_ARROW);
  14. wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + );
  15. wc.lpszMenuName = IDMULTIPAD;
  16. wc.lpszClassName = szFrame;
  17.  
  18. if (!RegisterClass (&wc) )
  19. return FALSE;
  20.  
  21. // Register the MDI child window class.
  22.  
  23. wc.lpfnWndProc = (WNDPROC) MPMDIChildWndProc;
  24. wc.hIcon = LoadIcon(hInst, IDNOTE);
  25. wc.lpszMenuName = (LPCTSTR) NULL;
  26. wc.cbWndExtra = CBWNDEXTRA;
  27. wc.lpszClassName = szChild;
  28.  
  29. if (!RegisterClass(&wc))
  30. return FALSE;
  31.  
  32. return TRUE;
  33. }

,创建框架窗口和子窗口

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

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

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

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

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

  1. case WM_CREATE:
  2. {
  3. CLIENTCREATESTRUCT ccs;
  4.  
  5. // Retrieve the handle to the window menu and assign the
  6. // first child window identifier.
  7.  
  8. ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), WINDOWMENU);
  9. ccs.idFirstChild = IDM_WINDOWCHILD;
  10.  
  11. // Create the MDI client window.
  12.  
  13. hwndMDIClient = CreateWindow( "MDICLIENT", (LPCTSTR) NULL,
  14. WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
  15. , , , , hwnd, (HMENU) 0xCAC, hInst, (LPSTR) &ccs);
  16.  
  17. ShowWindow(hwndMDIClient, SW_SHOW);
  18. }
  19. break;

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

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

使用多文档接口(Multiple Document Interface) 一的更多相关文章

  1. 学习笔记:javascript 文档对象(document)

    1.documnet函数 方法 描述 close() 关闭用 document.open() 方法打开的输出流,并显示选定的数据. getElementById() 返回对拥有指定 id 的第一个对象 ...

  2. js的常用文档对象,document

    1.document的概念:window的子对象,由于DOM对象模型的默认对象就是window,因此Window对象中的方法和子对象不需要通过Window来引用. - 2.document的组成:属性 ...

  3. mindoc 在线文档接口系统的 docker 制作过程

    说明: mindoc 是一款在线接口文档编辑系统,百度一下就知道了.github地址:https://github.com/lifei6671/mindoc 本机:ubuntu16.04 + dock ...

  4. 复合文档(Compound Document)读写栗子

    复合文件是把磁盘文件系统的管理方式移植到文件中---复合文件. 复合文档是由 Windows 系统通过 COM 提供的, 它能完成像 Windows 目录结构一样复杂的文件结构的存取:提示一下 Win ...

  5. Single document interface和Multiple document interface

    https://en.wikipedia.org/wiki/Single_document_interface https://msdn.microsoft.com/en-us/library/b2k ...

  6. 有关文档碎片(document fragment)的使用方法

    通常情况下改动.删除或者添加DOM元素. 更新DOM会导致浏览器又一次绘制屏幕,也会导 致reflow,这样会带来巨大的开销.我们通常解决这的办法尽量降低更新DOM.这也就意 味着将DOM的改变分批处 ...

  7. MVC WebApi Swagger帮助文档 接口用法

    1.WebApi在解决方案Apps.WebApi中 2.将Apps.WebApi设置为启动项目之后,可以直接浏览到Api的帮助文档,并直接进行调试 3.登录接口 4.登录获取的token来访问其他接口 ...

  8. IIS中使用子目录文件作为默认文档(Default Document)替代重定向

    以前一直以为IIS应用程序的默认文档只能设置根目录下的文件,像index.html,default.aspx等,后来经同事指点,原来子目录或者子应用程序下的文件也可以添加到根应用程序的默认文档列表中. ...

  9. Jquery文档接口遍历

    // children():获取所有子元素 <%@ page language="java" contentType="text/html; charset=utf ...

随机推荐

  1. Spring框架的XML扩展特性

    Spring框架从2.0版本开始,提供了基于Schema风格的XML扩展机制,允许开发者扩展spring配置文件.现在我们来看下怎么实现这个功能,可以参考spring帮助文档中的<Extensi ...

  2. windows下CMake使用图文手册 Part 4

    例子4:链接静态库(.lib) 例子3里面我们构建了date.lib, 这个例子里我们调用这个库. 前提: date.h的头文件在 E:\Playground\CMakeExamples\DateLi ...

  3. html转义字符

    public static String toHTMLString(String in) { StringBuffer out = new StringBuffer(); for (int i = 0 ...

  4. oracle 删除旧的归档文件或跟踪文件

    2016-02-16 可以使用两种方法完成删除旧文件的操作: 一.是使用find命令结合-exec rm; 二.是使用find命令结合使用xargs rm. 例如: 把5天之前的归档文件删除: [or ...

  5. 汇编初入门debug实操

    修改cs:ip的值 jmp 段地址:偏移地址 //在汇编指令中用,不是在debug上用的 如 jmp 2AE3:3 //执行后CS=2AE3H ip=0003H 若只修改IP内容 jmp 某一个合法的 ...

  6. ajax学习总结

    一.ajax简介 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),AJAX 是一种与服务器交换数据的技术,他可以在 ...

  7. 二模12day1解题报告

    T1.笨笨与电影票(ticket) 有n个1和m个0,求每个数前1的个数都大于等于0的个数的排列数. 非常坑的一道题,推导过程很烦.首先求出所有排列数是 C(n+m,m),然后算不合法的个数. 假设存 ...

  8. leetcode-【hard】4. Median of Two Sorted Arrays

    题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  9. mysql 复制表结构、表数据的方法

    From: http://blog.163.com/yaoyingying681@126/blog/static/109463675201191173221759/ MySQL 添加列,修改列,删除列 ...

  10. redis常用总结

    1. 使用redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,li ...