MFC CStatic

MFC中控件的样式

控件是用来建立Windows应用程序用户界面的用户界面对象。你所见到的大部分Windows应用程序和对话框只不过是由一些控件所组成的、用来实现程序功能的东西。为了建立有效的应用程序,你必须完全理解在Windows应用程序中应该如何合理的使用控件。有六个基本的控件:CStatic、CButton、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了增强了的控件。你需要理解的是那个控件能做些什么、你应该如何控制它的外表和行为以及如何让控件能响应用户事件。只要掌握了这些,再加上掌握了菜单和对话框,你就可以建立你所想象的任何Windows应用程序。你可以用程序代码来建立控件,也可以使用资源编辑器通过资源文件来建立。当然,对话框编辑器更方便些,它对于已经基本掌握了控件的情况下特别有用。
  下面以CStatic控件为例来说明控件的使用。
  最简单的控件是CStatic, 它是用来显示静态文本的。CStatic类没有任何数据成员,它只有少量的成员函数:构造函数、Create函数(用于获取和设置静态控制上的图标)等等。它不响应用户事件。因为它的简单性,所以最好把它作为学习Windows控件的开端。
  MFC中的CStatic类是用来显示静态文本信息的。这些信息能够可以作为纯信息(例如,显示在信息对话框中的错误消息), 或作为小的标签等。
  CStatic控件还有几种其它的显示格式。你可以通过修改标签的样式来使它表现为矩形、边框或图标等。
  CStatic控件总是作为子窗口的形式出现的。典型情况下,其父窗口是应用程序的主窗口或对话框。正如上一讲所介绍的,用两行代码就可以建立一个静态控件:

CStatic *cs; 
.... 
cs = new CStatic(); 
cs->Create("hello world", 
WS_CHILD|WS_VISIBLE|SS_CENTER, 
CRect(50,80, 150, 150), 
this);

  这两行代码是典型的MFC建立所有控件的代码。调用new来为CStatic类的实例分配内存,然后调用类的构造函数。构造函数是用来完成类所需要的初始化功能的。Create函数建立控件并把它放到屏幕上。

  Create函数有五个参数:
  lpszText指定了要显示的文本。rect控件文本区域的位置、大小和形状。pParentWnd指明CStatic控件的父窗口。该控件会出现在其父窗口中,且其位置是相对于其父窗口的用户区域而言的。nID整数值,表示该控件的标识符。dwStyle最重要的参数。它控制着控件的外观和行为。

CStatic样式
  所有的控件都有各种显示样式。样式是在用Create函数建立控件时传递给它的dwStyle参数所决定的。对CStatic有效的样式简介如下:
  从CWnd继承来的样式:
  WS_CHILD CStatic所必须的。
  WS_VISIBLE 表示该控件对用户应该是可见的。
  WS_DISABLED 表示该控件拒绝接受用户事件。
  WS_BORDER 控件的文本区域带有边框。

CStatic固有的样式:
  SS_BLACKFRAME 该控件区域以矩形边界显示。颜色与窗口框架相同。
  SS_BLACKRECT 该控件以填充的矩形显示。颜色与当前的窗口框架相同。
  SS_CENTER 文本居中。
  SS_GRAYFRAME 控件以矩形边框方式显示。颜色与当前桌面相同。
  SS_GRAYRECT 该控件以填充的矩形显示。颜色与当前的桌面相同。
  SS_ICON 控件以图标形式显示。文本作为图标在资源文件的名称。rect参数只控制位置。
  SS_LEFT 文本居左显示。文字可回绕。 
  SS_LEFTNOWORDWRAP 文本居左显示。多余的文字被剪裁。
  SS_NOPREFIX 表示字符串中的"&"字符不表示为加速前缀。
  SS_RIGHT 文本居右显示。文字可回绕。 
  SS_SIMPLE 只简单的显示一行文本。任何CTLCOLOR信息都被其父窗口忽略。
  SS_USERITEM 用户定义项。 
  SS_WHITEFRAME 控件以矩形边框方式显示。颜色与当前窗口背景颜色相同。
  SS_WHITERECT 控件以填充矩形方式显示。颜色与当前窗口背景颜色相同。 

  这些常数中,"SS"(Static Style)开头的表示只能用于CStatic控件。以"WS"(Window Style)开头的常数表示可适用于所有窗口,它们定义在CWnd对象中。CWnd中还有很多以"WS"样式常数。可以在MFC文档中的CWnd::Create函数中找到它们。上面的四种是只用于CStatic对象的。
  CStatic对象至少要带有两个样式:WS_CHILD和WS_VISIBLE。该控件必须作为另一窗口的子窗口来建立。如果不使用WS_VISIBLE,则所建立的控件是看不见的。WS_DISABLED控制着标签对事件的响应,因为CStatic不接收键盘或鼠标事件,所以使用该项是多余的。
  所有的其它样式选项都是可选的,它们控制着标签的外观。在CStatic::Create函数中使用这些可以控制CStatic在屏幕上的显示。

对话框:
  对话框可分为"模式"和"无模式"两类:模式对话框如Open File对话框,在该对话框被关闭之前,用户无法在同一应用程序(更确切地说,似乎在同一用户接口线程里)的其他地方进行工作;而对于无模式对话框如Word中的Find and Replace对话框,在它仍然保留在屏幕上的同时,用户还可以在应用程序的其他窗口中进行工作。这两类对话框的基类都为CDialog,下面分别就在应用程序中使用模式和无模式对话框作些说明。
  模式对话框的使用:
  1、利用对话框编辑器创建包含各种空间的对话框资源。
  2、利用ClassWizard来创建CDialog的派生类。ClassWizard将会生成对话框代码文件:
  CMyDialog::CMyDialog(CWnd * pParent)
   :CDialog(CMyDialog::IDD,pParent)
   {
   }
  3、在对话框代码文件中编写应用所需要的函数。
  4、编辑视图类,通过
  {
  CMyDialog myDlg;
  myDlg.DoModal();
  }
  来激活该对话框。
  其中DoModal()的处理过程如下:
  CDialog::DoModal()
  CMyDialog::OnInitDialog()
  ...其他初始化...
  CDialog::OnInitDialog
  CWnd::UpdateData(false)
  CMyDialog::DoDataExchange()
  用户数据输入...
  用户单击OK按扭
  CMyDialog::OnOk()
  ...其他的确认处理...
  CDialog::OnOK()
  CWnd::UpdateData(TRUE)
  CMyDialog::DoDataExchange()
  CDialog::EndDialog(IDOK)
  {注:层次的递进表示函数的调用关系)

无模式对话框的使用:
  1、利用对话框编辑器创建包含各种空间的对话框资源。
  2、利用ClassWizard来创建CDialog的派生类。ClassWizard将会生成对话框代码文件:
  CMyDialog::CMyDialog(CWnd * pParent)
  :CDialog(CMyDialog::IDD,pParent)
  {
  }//该构造函数是创建模式对话框所用;
  3、在对话框代码文件中的模式对话框构造函数修改成无模式对话框的构造函数
  CMyDialog::CMyDialog(CView * pView)
  {
  }
  及其他需要的函数。
  4、在视图类中通过
  {
  CMyDialog *pDlg=new CMyDialog(this);
  myDlg.Create(IDD);
  }来激活无模式对话框。

  两者的比较(不同点):
  1、使用的构造函数:模式对话框-->以资源ID作为参数的构造函数;无模式对话框-->默认构造函数(无参数).
  2、建立窗口的函数:模式对话框-->DoModal();无模式对话框-->Create(IDD).
  3、删除窗口(即终止)的函数:模式对话框-->EndDialog();无模式对话框-->DestroyWindow().
  注:CDialog::OnOK()和OnCancel()的实现是调用EndDialog(),所以无模式对话框中应该重载OnOK()及OnCancel()函数,加入DestroyWindow()以便删除窗口。
  4、正确删除对话框对象(注意不同于对话框窗口对象):
  模式对话框-->在视图类中DoModal()返回后即可删除对话框对象;无模式对话框-->视图类并不知道对话框何时该删除,故应该通过CMyDialog::PostNcDestroy ( ){delete this;}来删除该对象。该函数在窗口撤消时被应用程序框架调用。

菜单:
  菜单栏包含在主框架窗口(MainFrame)中,基类为CMenu.通常有两种应用。应用一:创建主菜单的使用步骤:
  1、利用资源编辑器来编辑菜单。可以加入一个分隔符,可以为菜单项添加快捷键和键盘加速键以及在状态栏中显示提示字符串等属性。 
  2、利用ClassWizard为视图类增加命令消息(COMMAND)控制函数和更新命令UI消息(UPDATE_COMMAND_UI)控制函数。每一菜单项都有一个ID,即命令ID,只有当该ID在0x8000-0xDFFF范围内,才能够发送COMMAND消息。当我们选中某一菜单项时,将会执行相应的命令消息控制函数;每当弹出式菜单第一次显示时,都会调用更新命令用户界面(UI)控制函数。更新命令UI控制函数可以用来对菜单项的显示进行修改,但是注意只适用于弹出式菜单的菜单项,而对长久显示的顶层菜单项则不适用。
  MFC中,应用程序框架提供了一个命令消息传递系统。当应用程序框架接受到框架窗口命令时,它将按如下次序来寻找相应的消息控制函数:
  SDI应用程序:视图-->文档-->SDI主框架窗口-->应用程序
  MDI应用程序:视图-->文档-->MDI子框架窗口-->MDI主框架窗口-->应用程序
  所以,我们几乎在程序中的任何地方对消息进行控制。如果某菜单项在当前命令传递路径中无法找到相应的命令消息控制函数,则此时应用程序框架就可以禁用该菜单项。但如果我们将CFrameWnd的数据成员m_bAutoMenuEnable置成了FALSE,那么我们可以禁用这一特性。
  3、当主框架窗口的Create()或LoadFrame()被调用时,菜单的资源都被直接连到了框架窗口中,因此,我们不必另外专门创建CMenu对象。我们可以通过CWnd的GetMenu()来返回一个CMenu对象的指针,通过该指针来对菜单对象进行访问和更新。
  我们也可以动态创建菜单,方法如下:
{
CMenu menu;
menu.LoadMenu(IDR_MYMENU)//菜单的ID;将菜单从资源中装入;
menu.SetMenu();//将菜单连到框架窗口中;
......
menu.Detach();//将menu对象与菜单独立出来,这样menu对象生存期
//结束后该菜单依然在内存中。
}


应用二:创建浮动的弹出式菜单
  1、利用资源编辑器来编辑菜单。
  2、利用ClassWizard编辑菜单项的命令控制函数。
  3、在视图类中编辑WM_CONTEXTMENU消息控制函数(当鼠标右键弹起时发送此消息)。
void CMyView::OnContextMenu(CWnd *pWnd,CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_MYMENU);
menu.GetSubMenu(0)->TrackPopupMenu
(TPM_LEFTALLGN|TPM_RIGHTBUTTON,point.x,point.y,this);
//显示浮动弹出菜单;
}


MFC中的文档和视图的关系
  文档对象是用来保存程序运行过程中所使用的数据的,视图对象是用来显示数据的,并且允许用户对数据进行编辑,编辑的结果应该再存储在文档对象中。
  1.应用程序类:
  WINDOWS应用程序的初始化、运行和结束都是由应用程序类完成的。应用程序类构成了应用程序执行的主线程。每个MFC程序有且仅有一个从CwinApp类派生的类对象。如CsampleApp theApp。
  2.文档模板:
  应用程序对象使用文档模板存放与应用程序文档、视图和边框窗口有关的信息。应用程序使用文档模板创建文档类对象来存放文档,创建边框窗口类对象来画出视图窗口,创建视图类对象来显示文档,多个视图类对象可以共享一个边框窗口类对象。文档类,视图类和边框窗口类之间的关系由文档模板管理。
  在应用程序类的InitInstance函数中创建并注册文档模板:
BOOL CsampleApp::InitInstance()
{
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CsampleDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CsampleView));
AddDocTemplate(pDocTemplate);
return TRUE;
}
  传给CsingleDocTemplate构造函数的第一个参数是资源符号IDR_MAINFRAME,该资源包含边框的图标和选单等,传给CsingleDocTemplate构造函数的其余三个参数是对RUNTIME_CLASS宏的调用,每次调用都返回指定类的信息,从而使应用程序可以动态的创建该类的一个实例,即返回一个指向参数类的对象的指针。AddDocTemplate注册文档模板对象,将文档模板存放在应用程序对象中。
  3.文档和视图的关系:
  在创建MFC的应用程序的框架时,AppWizard为应用程序创建文档和视图类的基本结构。由AppWizard创建的文档类是从CDocument 类派生的,视图类是从CView类派生的。CDocument类为应用程序定义的文档类提供基本功能,而CView类为应用程序定义的视图类提供基本功能。视图是与文档联系在一起的,在文档与用户之间起中介作用。视图在屏幕上显示文档数据并把用户输入转换成对文档的操作。MFC中文档与视图的这种实现方法把数据与数据的显示以及用户对数据所作的操作分离开来。数据的所有更改都通过文档类管理,而视图则调用这个接口来访问和更新数据。视图类对象可以通过CsampleDoc* CsampleView::GetDocument() 函数得到其所属的文档对象的指针,以对文档的数据进行操作。
  文档用于管理应用程序的数据,使用方法如下:
  (1) 从CDocument类派生出各种不同类型的文档类,每种类型对应一种文档。
  (2) 添加用于存储文档数据的成员变量。
  (3) 根据需要重载CDocument类的其他成员函数。
  视图以图形方式显示文档数据、接受用户输入并将其解释成对文档的操作:
  (1) 处理视图类的OnDraw成员函数,该函数负责提供文档数据。调用函数GetDocument()得到文档数据。
  (2) 映射并实现消息处理函数,以便解释用户的输入。
  (3) 根据需要重载CView类的其他成员函数。如:重载OnInitialUpdate,以便进行必要的视图初始化工作,重载OnUpdate,以便在视图即将重新绘制前进行必要的处理。
  应用程序可以是单文档或多文档,每个文档可以有单个或多个视图,但一个视图只隶属于一个文档。最简单的应用是单文档单视图的,MFC也支持单文档多视图。每个文档对象保存有该文档的视图列表,并提供用于添加和删除视图的成员函数,以及在文档数据发生变化时提供UpdateAllView成员函数来更新所有视图。单文档程序中主边框窗口和文档边框窗口重合,合二为一。多文档程序中主边框窗口中有客户窗口,客户窗口中又包含多个文档边框窗口。
  MFC支持以下三种多视图模式:
  (1) 同一文档的多个视图对象,每个对象置于独立的文档边框窗口中。
  (2) 同一文档边框窗口中有同一文档的多个视图对象。如分割窗口。
  (3) 单个文档边框窗口中有不同类的视图对象,多个视图共享单个边框窗口,每个视图从不同的类构造。
  4.MFC中各对象之间的关系:
  (1) 文档中含有该文档的视图列表和指向创建该文档的文档模板的指针。
  (2) 视图中含有指向文档的指针,视图窗口是文档边框窗口的子窗口。
  (3) 文档边框窗口含有指向当前活动视图的指针。
  (4) 文档模板含有已打开文档的一个列表。
  (5) 应用程序对象含有文档模板的一个列表
  (6) Windows跟踪所有已打开的窗口并发送消息给这些窗口。
  通过调用AfxGetApp,任何对象都可以获得指向应用程序对象的指针。
  各对象之间的访问方法:
  文档:调用GetFirstViewPosition和GetNextView函数访问文档的视图列表。调用GetDocTemplate函数获取创建该文档的文档模板的指针。
  视图:调用GetDocument函数获取指向文档的指针。调用GetParentFrame函数获取指向文档边框窗口的指针。
  文档边框窗口:调用GetActiveView函数获取当前视图。调用GetActiveDocument函数获取当前视图的文档。
MDI主边框窗口:调用MDIGetActive函数获取当前活动的MDI子窗口。
第1章 MFC概述 1 1.1 MFC是一个编程框架 1 1.1.1 封装 1 1.1.2 继承 2 1.1.3 虚拟函数和动态约束 2 1.1.4 MFC的宏观框架体系 2 1.2 MDI应用程序的构成 3 1.2.1 构成应用程序的对象 3 1.2.2 构成应用程序的对象之间的关系 5 1.2.3 构成应用程序的文件 5 第2章 MFC和Win32 9 2.1 MFC Object和Windows Object的关系 9 2.2 Windows Object 12 2.2.1 Windows的注册 12 2.2.2 MFC窗口类CWnd 15 2.2.3 在MFC下创建一个窗口对象 17 2.2.4 MFC窗口的使用 18 2.2.5 在MFC下窗口的销毁 19 2.3 设备描述表 20 2.3.1 设备描述表概述 20 2.3.2 设备描述表在MFC中的实现 22 2.3.3 MFC设备描述表类的使用 24 2.4 GDI对象 25 第3章 CObject类 28 3.1 CObject的结构 28 3.2 CObject类的特性 30 3.3 实现CObject特性的机制 32 3.3.1 DECLARE_DYNAMIC等宏的定义 32 3.3.2 CruntimeClass类的结构与功能 35 3.3.3 动态类信息、动态创建的原理 38 3.3.4 序列化的机制 39 第4章 消息映射的实现 42 4.1 Windows消息概述 42 4.1.1 消息的分类 42 4.1.2 消息结构和消息处理 42 4.2 消息映射的定义和实现 44 4.2.1 MFC处理的三类消息 44 4.2.2 MFC消息映射的实现方法 45 4.2.3 在声明与实现的内部 46 4.2.3.1 消息映射声明的解释 47 4.2.3.2 消息映射实现的解释 49 4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC窗口过程 55 4.4.1 MFC窗口过程的指定 56 4.4.2 对Windows消息的接收和处理 58 4.4.2.1 从窗口过程到消息映射 59 4.4.2.2 Windows消息的查找和匹配 60 4.4.2.3 Windows消息处理函数的调用 62 4.4.2.4 消息映射机制完成虚拟函数功能的原理 63 4.4.3 对命令消息的接收和处理 64 4.4.3.1 MFC标准命令消息的发送 64 4.4.3.2 命令消息的派发和消息的多次处理 67 4.4.3.3 一些消息处理类的OnCmdMsg的实现 69 4.4.3.4 一些消息处理类的OnCommand的实现 71 4.4.4 对控制通知消息的接收和处理 72 4.4.4.1 WM_COMMAND控制通知消息的处理 72 4.4.4.2 WM_NOTIFY消息及其处理: 73 4.4.4.3 消息反射 74 4.4.5 对更新命令的接收和处理 77 4.4.5.1 实现方法 77 4.4.5.2 状态更新命令消息 78 4.4.5.3 类CCmdUI 79 4.4.5.4 自动更新用户接口对象状态的机制 80 4.5 消息的预处理 82 4.6 MFC消息映射的回顾 83 第5章 MFC对象的创建 85 5.1 MFC对象的关系 85 5.1.1 创建关系 85 5.1.2 交互作用关系 86 5.2 MFC提供的接口 87 5.2.1 虚拟函数接口 87 5.2.2 消息映射方法和标准命令消息 91 5.3 MFC对象的创建过程 94 5.3.1 应用程序中典型对象的结构 94 5.3.1.1 应用程序类的成员变量 95 5.3.1.2 CDocument的成员变量 97 5.3.1.3 文档模板的属性 97 5.3.2 WinMain入口函数 99 5.3.2.1 WinMain流程 99 5.3.2.2 MFC空闲处理 101 5.3.3 SDI应用程序的对象创建 102 5.3.3.1 文档模板的创建 102 5.3.3.2 文件的创建或者打开 103 5.3.3.3 SDI边框窗口的创建 112 5.3.3.4 视的创建 115 5.3.3.5 窗口初始化 116 5.3.3.6 视的初始化 120 5.3.3.7 激活边框窗口(处理WM_ACTIVE) 121 5.3.3.8 SDI流程的回顾 122 5.3.4 MDI程序的对象创建 123 5.3.4.1 有别于SDI的主窗口加载过程 124 5.3.4.2 MDI子窗口、视、文档的创建 125 5.3.4.3 MDI子窗口的初始化和窗口的激活 127 第6章 应用程序的退出 131 6.1 边框窗口对WM_CLOSE的处理 131 6.2 窗口的销毁过程 135 6.2.1 DestroyWindow 135 6.2.2 处理WM_DESTROY消息 136 6.2.3 处理WM_NCDESTROY消息 136 6.3 SDI窗口、MDI主、子窗口的关闭 137 第7章 MFC的DLL 139 7.1 DLL的背景知识 139 7.2 调用约定 141 7.2.1 MFC的DLL应用程序的类型 142 7.3 DLL的几点说明 143 7.4 输出函数的方法 145 第8章 MFC的进程和线程 148 8.1 Win32的进程和线程概念 148 8.2 Win32的进程处理简介 148 8.2.1 进程的创建 148 8.2.2 进程的终止 149 8.3 Win32的线程 150 8.3.1 线程的创建 150 8.3.2 线程的终止 150 8.3.3 线程局部存储 151 8.4 线程同步 152 8.4.1 同步对象 152 8.4.2 等待函数 153 8.5 MFC的线程处理 154 8.5.1 创建用户界面线程 155 8.5.2 创建工作者线程 155 8.5.3 AfxBeginThread 155 8.5.4 CreateThread和_AfxThreadEntry 157 8.5.5 线程的结束 160 8.5.6 实现线程的消息循环 161 第9章 MFC的状态 163 9.1 模块状态 163 9.2 模块、进程和线程状态的数据结构 164 9.2.1 层次关系 164 9.2.2 CNoTrackObject类 166 9.2.3 AFX_MODULE_STATE类 166 9.2.4 _AFX_BASE_MODULE_STATE 169 9.2.5 _AFX_THREAD_STATE 169 9.2.6 AFX_MODULE_THREAD_STATE 171 9.3 线程局部存储机制和状态的实现 172 9.3.1 CThreadSlotData和_afxThreadData 173 9.3.1.1 CThreadSlotData的定义 173 9.3.1.2 CThreadSlotData的一些数据成员 174 9.3.1.3 _afxThreadData 175 9.3.2 线程状态_afxThreadState 176 9.3.3 进程模块状态afxBaseModuleState 178 9.3.4 状态对象的创建 180 9.3.4.1 状态对象的创建过程 180 9.3.4.2 创建过程所涉及的几个重要函数的算法 183 9.4 管理状态 184 9.4.1 模块状态切换 184 9.4.2 扩展DLL的模块状态 186 9.4.2.1 _AFX_EXTENSION_MODULE 187 9.4.2.2 扩展DLL的初始化函数 188 9.4.3 核心MFC DLL 190 9.4.4 动态链接的规则DLL的模块状态的实现 190 9.5 状态信息的作用 192 9.5.1.1 模块信息的保存和管理 192 9.5.2 MFC资源、运行类信息的查找 193 9.5.3 模块信息的显示 194 9.5.4 模块-线程状态的作用 196 9.5.4.1 只能访问本线程MFC对象的原因 196 9.5.4.2 实现MFC对象和Windows对象之间的映射 196 9.5.4.3 临时对象的处理 199 9.6 状态对象的删除和销毁 199 第10章 内存分配方式和调试机制 202 10.1 M内存分配 202 10.1.1 内存分配函数 202 10.1.2 C++的new 和 delete操作符 204 10.2 调试手段 204 10.2.1 C运行库提供和支持的调试功能 204 10.2.2 MFC提供的调试手段 205 10.2.3 内存诊断 208 第11章 MFC下的文件类 210 11.1 文件操作的方法 210 11.2 MFC的文件类 210 11.2.1 CFile的结构 211 11.2.1.1 CFile定义的枚举类型 211 11.2.1.2 CFile的其他一些成员变量 212 11.2.1.3 CFile的成员函数 212 11.2.2 CFile的部分实现 213 11.2.3 CFile的派生类 215 第12章 对话框和对话框类CDialog 217 12.1 模式和无模式对话框 217 12.1.1 模式对话框 217 12.1.2 无模式对话框 218 12.2 对话框的MFC实现 219 12.2.1 CDialog的设计和实现 219 12.2.1.1 CDialog的成员变量 219 12.2.1.2 CDialog的成员函数: 219 12.2.2 MFC模式对话框的实现 220 12.2.2.1 MFC对话框过程 220 12.2.2.2 模式对话框窗口过程 221 12.2.2.3 使用原对话框窗口过程作消息的缺省处理 225 12.2.2.4 Dialog命令消息和控制通知消息的处理 226 12.2.2.5 消息预处理和Dialog消息 228 12.2.2.6 模式对话框的消息循环 229 12.2.3 对话框的数据交换 233 12.2.3.1 数据交换的方法 233 12.2.3.2 CDataExchange 234 12.2.3.3 数据交换和验证函数 236 12.2.3.4 UpdateData函数 239 12.3 无模式对话框 240 12.3.1 CScrollView 240 12.3.2 CFormView 242 12.3.2.1 CFormView的创建 243 12.3.2.2 CFormView的消息预处理 245 12.3.2.3 CFormView的输入焦点 247 第13章 MFC工具条和状态栏 248 13.1 Windows控制窗口 248 13.2 MFC的工具条和状态栏类 249 13.2.1 控制窗口的创建 251 13.2.1.1 PreCreateWindow 251 13.2.1.2 控制条的窗口创建 253 13.2.2 控制条的销毁 259 13.2.3 处理控制条的位置 259 13.2.3.1 计算控制条位置的过程和算法 259 13.2.3.2 CFrameWnd的虚拟函数RecalcLayout 260 13.2.3.3 CWnd的成员函数RepositionBars 262 13.2.4 工具条、状态栏和边框窗口的接口 265 13.2.4.1 应用程序在状态栏中显示信息 265 13.2.4.2 状态栏显示菜单项的提示信息 268 13.2.4.3 控制条的消息分发处理 270 13.2.4.4 Tooltip 275 13.2.4.5 禁止和允许 279 13.2.4.6 显示或者隐藏工具栏和状态栏 285 13.2.5 泊位和漂浮 286 第14章 SOCKET类的设计和实现 288 14.1 WinSock基本知识 288 14.1.1 WinSock API 288 14.1.2 Socket的使用 290 14.2 MFC对WinSockt API的封装 291 14.2.1 CAsyncSocket 291 14.2.2 socket对象的创建和捆绑 292 14.2.3 异步网络事件的处理 296 14.3 CSocket 297 14.4 CSocketFile 299
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值