VC++工程的文件
l *.dsw 工作区文件 保存本工程所在的工作区的信息
l *.opt 工作区选项文件 保存了用户为所建工作区所定制的一些选项
l *.dsp 工程文件 保存了用户所建工程的有关信息
l *.clw 类的信息文件 保存了工程中所有类的相关信息,Classwizard使用此文件对类进行编辑
l *.ncb 非编译的浏览文件 包含了由分析起产生的一些信息,这些信息可被ClassView,WizardBar等使用
l *.rc,Resource.h 主要资源文件及其头文件 其中还包含了标准的MFC资源文件Afxres.rc
l *.rc2 工程的资源文件 用于VC++不能直接进行编辑的资源,以及被多个工程使用的资源。
应用程序的运行过程:
当运行用户应用程序时,程序中的应用程序框架最先获取控制权。然后依次执行以下功能:
l 做部分初始化工作
l 构造应用程序的唯一应用类对象
l 调用WinMain函数
n 获取唯一的应用类对象指针
n 进行一些内部初始化
n 进行应用程序初始化,也就是调用应用类的InitApplication进行初始化。
n 进一步初始化应用程序,也就是调用应用类的InitInstance函数进行初始化;
n 调用应用类的Run函数,运行消息,不断的获取消息和处理消息,知道获取WM_QUIT消息;
n 调用应用类的ExitInstance函数
n 退出应用程序之前的首尾工作。
l 从WinMain函数返回后,删除唯一的应用程序对象,
l 终止应用程序
应用程序窗口
l 边框窗口
n SDI 边框窗口就是主窗口 从CMainFrame派生
n MDI 边框窗口
主边框窗口 从CMDIFrameWnd派生
子边框窗口 从CMDIChildWnd派生
l 视图窗口
文档模板类
InitInstance方法内的主要操作就是:文档模板类的创建。
文档负责数据的存储,视图负责显示。文档通过视图和用户打交道。
l 单文档模板
l 多文档模板
App对象通过并不直接管理文档模板类,而是通过一个内部类CDocManager来管理。CWinApp类包含有一个CDocManager类的对象m_pDocManager,它是指向CDocManager类对象的指针,在CDocManager类中定义了一个指针列表,列表中的每一项都是一个指针,指向每一个文档模板对象。AddDocTemplate(pDocTemplate )就是将文档模板对象的指针添加到列表中。
CDocManager对象m_pDocManager --------------------------- 文档类
App对象 --------------------------------------------- 文档模板对象 --------------------------- 视图类
--------------------------- 窗口类
GetFirstDocPosition GetFirstViewPosition
GetFirstDocTemplatePosition GetNextDoc GetNextView
App对象 ------------------------------------ 文档模板对象 --------------------------- 文档类---------------------------视图类
GetNextDocTemplate AddDocument UpdateAllViews
RemoveDocument AddView,RemoveView
l 单文档模板类只有一个文档对象
l 多文档模板类有一个文档对象列表
l 文档对象有一个视图列表
AfxGetApp
AfxGetInstanceHandle
AfxGetResourceHandle
AfxGetAppName
消息
三种类型的消息:
l 标准的Windows消息 以WM_为前缀的那些消息(WM_COMMAND除外)
l 控件通知消息 由编辑框,列表框等控件或者子窗口发给父窗口的通知消息,以WM_COMMAND为消息名,在消息中含
有消息的通知码,以区分不同的控件通知消息
l 命令消息 由菜单,工具条,加速键等三种用户接口对象发出的消息,以WM_COMMAND为消息名,在消息中含有
命令的标识符。
其中,标准的Windows消息和控件通知消息必须由窗口类的对象接受,也就是直接或者间接的由CWnd类或者其派生类来处理。命令消息则可以由文档类,窗口类,文档模板类以及应用类等对象来处理。所以下面就涉及到命令消息的处理过程。
命令消息的传递途径:
l MDI主边框窗口首先接收到此命令消息;
l 主窗口消息将处理命令的机会让给当前活动的MDI活动子窗口来处理;
l 子窗口消息将处理命令的机会让给当前活动的视图;
l 视图搜索自己的消息映射,查找对应的处理函数,没有则将消息传递给此视图相关联的文档;
l 文档搜索自己的消息映射,查找对应的处理函数,没有则将消息传递给此文档相关联的文档模板对象;
l 文档模板对象搜索自己的消息映射,查找对应的处理函数,没有则将消息回传给子边窗口;
l 子边窗口搜索自己的消息映射,查找对应的处理函数,没有则将消息回传给主边框窗口;
l 主边框窗口搜索自己的消息映射,查找对应的处理函数,没有则将消息回应用对象;
l 如果其中的某个对象处理了命令,则命令传递终止,不再继续。
l 如果所有的对象都没有命令的处理函数,则默认情况下,应用程序框架会禁止使用该命令对象。
对话框
l 消息对话框:
MessageBox(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT nType
);
风格:
l 一般对话框
n 模态对话框
n 非模态对话框
l 属性页对话框
n 一般属性页对话框
n 向导对话框
l 通用对话框
n 文件对话框
n 颜 {MOD}对话框
n 字体对话框
n 页面设置对话框
n 打印对话框
n 查找和替换对话框
n OLE通用对话框
控件
l Picture控件
l Static Text控件
l Edit Box控件
l Spin控件
l Combo Box控件
l Group Box控件
l Radio Botton控件
l Check Box控件
l Button 控件
l Slider控件
l ScrollBar控件
l Tab控件
l Tree控件
l List控件
l Progress控件
l Animate控件
控件栏
l 工具栏
l 状态栏
l 对话框栏
类图结构:
进程和线程
进程
线程
I
线程
II
线程
III
线程
X
代码
数据
地址空间
进程间的通讯:
l 使用同步类控制访问共享数据
七个多线程的同步类:
同步对象:CSyncObject, CSemaphore, CMutex, CCriticalSection, CEvent
同步访问对象:CMultiLock,CSingleLock。
每个同步对象都有一个信号状态,可用时为有信号态,不可用时为无信号态。
同步对象:
CSyncObject包含了Lock,UnLock等基本的函数:
BOOL Lock ( DWORD dwTimeout )
BOOL UnLock()
多线程需要同步控制时,调用Lock函数获取对该同步对象的访问权,之后才能访问共享资源。如果其他线程正使用该资源,则dwTimeout指明了线程等待的实践,缺省INFINITE表示一直等待到同步对象可用。
在程序设计中,首先为需要控制对进程访问的资源创建同步对象,然后在不同的进程中根据需要使用Lock和UnLock函数即可。为了方便使用,可以创建CSingleLock和CMulti
Lock对象来管理和使用这些同步对象。
CSemaphore 信号灯对象:
当应用程序的多个线程要访问资源时,可以使用CSemaphore类进行控制。CSemaphore类对象允许一定数目的线程访问共享资源。在访问资源之前,先要访问信号灯对象,在它成为有信号状态时再对资源进行访问。
CMutex 互斥量对象:
用于顺序地访问某一资源,在任一时刻只允许之多一个线程访问资源。
CEvent 事件对象:
当应用程访问资源之前必须等待某事件的发生时,可以使用CEvent类进行控制。
CCriticalSection 临界区对象:
可以将一段代码放入临界区,并制止多余一个线程同时进入,即只允许一个线程进入临界区。
除CCriticalSection之外,其他的三种同步对象都可以在系统多个进程中使用。
创建一个同步对象时,调用他们的构造函数,如果系统中存在同名的对象并且类型相同,则返回该对象,如果同名但类型不同,则构造失败。
同步对象:封装对同步对象的访问。
CSingleLock:一次只等待一个同步对象时使用。
CMultiLock:当在某个时刻需要使用多个同步对象时使用。
可以使用Lock,IsLock,UnLock等函数来控制对同步对象的访问。
l 使用消息队列
每个线程都有自己的消息队列,工作者线程也不例外。
用户界面线程:
发送消息:PostThreadMessage(UINT message, LPRARM lParam, WPARAM wparam)
处理消息:ON_THREAD_MESSAGE(message,memberFxn)
CSyncObject
CSemaphore
CMutex
CCriticalSection
CEvent
用户界面线程
工作者线程
创建
从CWinThread派生,必须使用DECLARE_DYNCREARE和IMPLEM
ENT_DYNCREARE,必须重载一些成员函数,
启动
AfxBeginThread
AfxBeginThread
终止
l PostQuitMessage
l AfxEndMessage
l TerminateThread
状态
ResumeThread,SuspendThread
优先级
SetThreadProority,GetThreadProority
其他
CWinThread线程和窗口相关,成员m_pMainWnd指向主窗口的指针。
可以通过AfxGetMainWnd()来获取线程的主窗口指针。
获取线程的退出码:GetExitCodeThread