简易文件审计工具的设计与实现 第5页
此模型中,MFC 文档对象将数据读入或写入永久存储区。该文档还可能提供到数据所驻留的任何位置(如在数据库中)的接口。一个单独的视图对象可管理数据显示,包括从在窗口中呈现数据到用户选择和数据编辑。该视图从文档获取显示数据,并将任何数据更改传递回文档。
尽管可以容易地重写或者忽略文档/视图的分离,但在大多数情况下都有颇具说服力的理由需要遵循此模型[5]。最有说服力的理由之一是在需要同一文档的多个视图时,例如同时需要电子数据表格和图表视图。文档/视图模型使一个单独的视图对象得以表示每个数据视图,而对所有视图通用的代码(例如计算引擎)可以驻留在文档中。文档还承担在每次数据更改时更新所有视图的任务。
MFC 文档/视图结构使支持多视图、多文档类型、拆分窗口和其他有价值的用户界面功能变得容易。
对用户和程序员而言,MFC 框架中可见性最大的部分就是文档和视图。在用框架开发应用程序的工作中,编写文档和视图类占了大部分。本文章族描述:
文档和视图的用途以及它们如何在框架内进行交互。
为实现它们所必须做的工作。
文档/视图的核心是四个关键类:
CDocument(或 COleDocument)类支持用于存储或控制程序数据的对象,并为程序员定义的文档类提供基本功能。文档表示数据单元,用户一般用“文件”菜单上的“打开”命令打开它,并用“文件”菜单上的“保存”命令保存它。
CView(或它的许多派生类之一)为程序员定义的视图类提供基本功能。视图被附加到文档并在文档和用户之间充当中介:视图在屏幕上呈现文档的图像并将用户输入解释为对文档的操作。视图还为打印和打印预览呈现图像。
CFrameWnd(或其变体之一)支持在文档的一个或多个视图周围提供框架的对象。
CDocTemplate(或CSingleDocTemplate 或 CMultiDocTemplate)支持一个对象,该对象协调给定类型的一个或多个现有文档并对创建该类型的正确文档、视图和框架窗口对象进行管理。
下图显示了文档及其视图之间的关系。
图2.3 文档视图关系图
类库中的文档/视图实现将数据本身同其显示分开,并且与用户对数据的操作分离。对数据的所有更改都通过文档类管理。视图调用此接口来访问和更新数据。
文档、与文档关联的视图以及给视图加框架的框架窗口都用文档模板创建。文档模板负责创建和管理属于同一种文档类型的所有文档。
2.2.3 运用
MFC应用程序框架的启动,首先定义一个全局的CWinAPP,其为应用程序的一个连接纽带,把各部分都连接起来。接下来调用_tWinMain(),其实质是一个Win32的API宏调用;在那里面,它调用了AfxWinMain(),在这里进行应用程序框架的初始化工作:
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();//pThread是一个CWinThread, 它的run重载函数定义了消息循环的启用
CWinApp* pApp = AfxGetApp();
// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))//初始化
goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())//为与以前版本兼容
goto InitFailure;
// Perform specific initializations
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{
TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();//执行消息循环和处理,PeekMessage() & PumpMessage()
接下来就进入了MFC的消息处理了,这里就开始了消息映射这个话题。首先在头文件声明要使用到的消息映射处理函数,再以DECLARE_MESSAGE_MAP()进行声明。
然后在实现文件里,在BEGIN_毕业论文http://www.751com.cn/ 论文网http://www.lwfree.com/
LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// OnWndMsg does most of the work, except for DefWindowProc call
LRESULT lResult = 0;
if (!OnWndMsg(message, wParam, lParam, &lResult))
lResult = DefWindowProc(message, wParam, lParam);
return lResult;}
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页