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
颜色对话框
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
|