⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfc教程_ mfc和win32.htm

📁 MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://www.vczx.com/tutorial/mfc/mfc2.php -->
<HTML><HEAD><TITLE>MFC教程_ MFC和Win32</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3354" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<OL start=2>
  <P align=justify>
  <LI><A name=_Toc445888977></A><A name=_Toc445782380></A><A 
  name=_Toc452640876></A><A name=_Toc457298941></A><B>MFC和Win32</B> 
  <P></P>
  <OL>
    <P align=justify>
    <LI><B><A name=_Toc445888978></A><A name=_Toc445782381></A><A 
    name=_Toc452640877></A><A name=_Toc457298942></A>MFC Object和Windows 
    Object的关系</B> 
    <P></P></LI></OL></LI></OL>
<P align=justify>MFC中最重要的封装是对Win32 API的封装,因此,理解Windows Object和MFC Object 
(C++对象,一个C++类的实例)之间的关系是理解MFC的关键之一。所谓Windows 
Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象;所谓MFC Object 
(MFC对象)是C++对象,是一个C++类的实例,这里(本书范围内)MFC Object是有特定含义的,指封装Windows Object的C++ 
Object,并非指任意的C++ Object。</P>
<P align=justify>MFC Object 和Windows Object是不一样的,但两者紧密联系。以窗口对象为例:</P><IMG 
height=198 hspace=12 src="MFC教程_ MFC和Win32.files/image106.gif" width=385 
align=left> 
<P align=justify>一个MFC窗口对象是一个C++ 
CWnd类(或派生类)的实例,是程序直接创建的。在程序执行中它随着窗口类构造函数的调用而生成,随着析构函数的调用而消失。而Windows窗口则是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。Windows窗口在MFC窗口对象创建之后,由CWnd类的Create成员函数创建,“窗口句柄”保存在窗口对象的m_hWnd成员变量中。Windows窗口可以被一个程序销毁,也可以被用户的动作销毁。MFC窗口对象和Windows窗口对象的关系如图2-1所示。其他的Windows 
Object和对应的MFC Object也有类似的关系。</P>
<P align=justify></P>
<P align=justify>下面,对MFC Object和Windows 
Object作一个比较。有些论断对设备描述表(MFC类是CDC,句柄是HDC)可能不适用,但具体涉及到时会指出。</P>
<OL>
  <P align=justify>
  <LI>从数据结构上比较 
  <P></P>
  <P align=justify>MFC Object是相应C++类的实例,这些类是MFC或者程序员定义的;</P>
  <P align=justify>Windows Object是Windows系统的内部结构,通过一个句柄来引用;</P>
  <P align=justify>MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows 
  Object的句柄。对于设备描述表CDC类,将保存两个HDC句柄。</P>
  <P align=justify></P>
  <LI>从层次上讲比较 
  <P></P>
  <P align=justify>MFC Object是高层的,Windows Object是低层的;</P>
  <P align=justify>MFC Object封装了Windows Object的大部分或全部功能,MFC 
  Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相应的MFC 
  Object的成员函数。</P>
  <P align=justify></P>
  <LI>从创建上比较 
  <P></P>
  <P align=justify>MFC Object通过构造函数由程序直接创建;Windows Object由相应的SDK函数创建。</P>
  <P align=justify>MFC中,使用这些MFC Object,一般分两步:</P>
  <P align=justify>首先,创建一个MFC Object,或者在STACK中创建,或者在HEAP中创建,这时,MFC 
  Object的句柄实例变量为空,或者说不是一个有效的句柄。</P>
  <P align=justify>然后,调用MFC Object的成员函数创建相应的Windows Object,MFC的句柄变量存储一个有效句柄。</P>
  <P align=justify>CDC(设备描述表类)的创建有所不同,在后面的2.3节会具体说明CDC及其派生类的创建和使用。</P>
  <P align=justify>当然,可以在MFC 
  Object的构造函数中创建相应的Windows对象,MFC的GDI类就是如此实现的,但从实质上讲,MFC Object的创建和Windows 
  Object的创建是两回事。</P>
  <P align=justify></P>
  <LI>从转换上比较 
  <P></P>
  <P align=justify>可以从一个MFC Object得到对应的Windows Object的句柄;一般使用MFC 
  Object的成员函数GetSafeHandle得到对应的句柄。</P>
  <P align=justify>可以从一个已存在的Windows Object创建一个对应的MFC Object; 一般使用MFC 
  Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。</P>
  <P align=justify></P>
  <LI>从使用范围上比较 
  <P></P>
  <P align=justify>MFC Object对系统的其他进程来说是不可见、不可用的;而Windows 
  Object一旦创建,其句柄是整个Windows系统全局的。一些句柄可以被其他进程使用。典型地,一个进程可以获得另一进程的窗口句柄,并给该窗口发送消息。</P>
  <P align=justify>对同一个进程的线程来说,只可以使用本线程创建的MFC Object,不能使用其他线程的MFC Object。</P>
  <P align=justify></P>
  <LI>从销毁上比较 
  <P></P></LI></OL>
<P align=justify>MFC Object随着析构函数的调用而消失;但Windows Object必须由相应的Windows系统函数销毁。</P>
<P align=justify>设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放。</P>
<P align=justify>当然,可以在MFC Object的析构函数中完成Windows Object的销毁,MFC 
Object的GDI类等就是如此实现的,但是,应该看到:两者的销毁是不同的。</P>
<P align=justify>每类Windows Object都有对应的MFC 
Object,下面用表格的形式列出它们之间的对应关系,如表2-1所示:</P>
<P align=center>表2-1 MFC Object和Windows Object的对应关系</P>
<P align=left>
<TABLE cellSpacing=1 cellPadding=7 width=480 border=1>
  <TBODY>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>描述 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>Windows句柄 </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>MFC Object </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>窗口 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HWND </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CWnd and CWnd-derived classes </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>设备上下文 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HDC </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CDC and CDC-derived classes </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>菜单 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HMENU </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CMenu </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>笔 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HPEN </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CGdiObject类,CPen和CPen-derived classes </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>刷子 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HBRUSH </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CGdiObject类,CBrush和CBrush-derived classes </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>字体 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HFONT </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CGdiObject类,CFont和CFont-derived classes </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>位图 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HBITMAP </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CGdiObject类,CBitmap和CBitmap-derived classes </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>调色板 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HPALETTE </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CGdiObject类,CPalette和CPalette-derived classes </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>区域 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HRGN </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CGdiObject类,CRgn和CRgn-derived classes </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>图像列表 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>HimageLIST </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CimageList和CimageList-derived classes </P></TD></TR>
  <TR>
    <TD vAlign=top width="18%">
      <P align=justify>套接字 </P></TD>
    <TD vAlign=top width="22%">
      <P align=justify>SOCKET </P></TD>
    <TD vAlign=top width="60%">
      <P align=justify>CSocket,CAsynSocket及其派生类 </P></TD></TR></TBODY></TABLE>
<P></P>
<P align=justify></P>
<P align=justify> </P>
<P align=justify>
<HR width="0%" SIZE=1>
表2-1中的OBJECT分以下几类: 
<P></P>
<P align=justify>Windows对象,</P>
<P align=justify>设备上下文对象,</P>
<P align=justify>GDI对象(BITMAP,BRUSH,FONT,PALETTE,PEN,RGN),</P>
<P align=justify>菜单,</P>
<P align=justify>图像列表,</P>
<P align=justify>网络套接字接口。</P>
<P align=justify>从广义上来看,文档对象和文件可以看作一对MFC Object和Windows 
Object,分别用CDocument类和文件句柄描述。</P>
<P align=justify>后续几节分别对前四类作一个简明扼要的论述。</P>
<OL>
  <OL>
    <P align=justify>
    <LI><A name=_Toc445888979></A><A name=_Toc445782382></A><A 
    name=_Toc452640878></A><A name=_Toc457298943></A><B>Windows Object</B> 
    <P></P>
    <P align=justify>用SDK的Win32 
    API编写各种Windows应用程序,有其共同的规律:首先是编写WinMain函数,编写处理消息和事件的窗口过程WndProc,在WinMain里头注册窗口(Register 
    Window),创建窗口,然后开始应用程序的消息循环。</P>
    <P align=justify>MFC应用程序也不例外,因为MFC是一个建立在SDK 
    API基础上的编程框架。对程序员来说所不同的是:一般情况下,MFC框架自动完成了Windows登记、创建等工作。</P>
    <P align=justify>下面,简要介绍MFC Window对Windows Window的封装。</P>
    <OL>
      <P align=justify>
      <LI><A name=_Toc445888980></A><A name=_Toc445782383></A><A 
      name=_Toc452640879></A><A name=_Toc457298944></A><B>Windows的注册</B> 
      <P></P></LI></OL></LI></OL></OL>
<P align=justify>一个应用程序在创建某个类型的窗口前,必须首先注册该“窗口类”(Windows 
Class)。注意,这里不是C++类的类。Register Window把窗口过程、窗口类型以及其他类型信息和要登记的窗口类关联起来。</P>
<OL>
  <P align=justify>
  <LI>“窗口类”的数据结构 
  <P></P>
  <P 
  align=justify>“窗口类”是Windows系统的数据结构,可以把它理解为Windows系统的类型定义,而Windows窗口则是相应“窗口类”的实例。Windows使用一个结构来描述“窗口类”,其定义如下:</P>
  <P align=justify>typedef struct _WNDCLASSEX { </P>
  <P align=justify>UINT cbSize; //该结构的字节数</P>
  <P align=justify>UINT style; //窗口类的风格</P>
  <P align=justify>WNDPROC lpfnWndProc; //窗口过程</P>
  <P align=justify>int cbClsExtra; </P>
  <P align=justify>int cbWndExtra; </P>
  <P align=justify>HANDLE hInstance; //该窗口类的窗口过程所属的应用实例</P>
  <P align=justify>HICON hIcon; //该窗口类所用的像标</P>
  <P align=justify>HCURSOR hCursor; //该窗口类所用的光标</P>
  <P align=justify>HBRUSH hbrBackground; //该窗口类所用的背景刷</P>
  <P align=justify>LPCTSTR lpszMenuName; //该窗口类所用的菜单资源</P>
  <P align=justify>LPCTSTR lpszClassName; //该窗口类的名称</P>
  <P align=justify>HICON hIconSm; //该窗口类所用的小像标</P>
  <P align=justify>} WNDCLASSEX; </P>
  <P 
  align=justify>从“窗口类”的定义可以看出,它包含了一个窗口的重要信息,如窗口风格、窗口过程、显示和绘制窗口所需要的信息,等等。关于窗口过程,将在后面消息映射等有关章节作详细论述。</P>
  <P 
  align=justify>Windows系统在初始化时,会注册(Register)一些全局的“窗口类”,例如通用控制窗口类。应用程序在创建自己的窗口时,首先必须注册自己的窗口类。在MFC环境下,有几种方法可以用来注册“窗口类”,下面分别予以讨论。</P>
  <P align=justify></P>
  <LI>调用AfxRegisterClass注册 
  <P></P>
  <P align=justify>AfxRegisterClass函数是MFC全局函数。AfxRegisterClass的函数原型:</P>
  <P align=justify>BOOL AFXAPI AfxRegisterClass(WNDCLASS *lpWndClass);</P>
  <P align=justify>参数lpWndClass是指向WNDCLASS结构的指针,表示一个“窗口类”。</P>
  <P 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -