MFC入门学习

基础知识

而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT就是这种系统。

1、开发需要读写文件的应用程序并且有简单的输入和输出可以利用单文档视结构。

2、开发注重交互的简单应用程序可以使用对话框为基础的窗口,如果文件读写简单这可利用CFile进行。

3、开发注重交互并且文件读写复杂的的简单应用程序可以利用以CFormView为基础视的单文档视结构。

4、利用对话框得到用户输入的数据,在等级提高后可使用就地输入。

5、在对多文档要求不强烈时尽量避免多文档视结构,可以利用分隔条产生单文档多视结构。

6、在要求在多个文档间传递数据时使用多文档视结构。

7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的。

8、尽量避免使用多文档多视结构。

9、不要使用多重继承并尽量减少一个类中封装过多的功能。

CDC::BOOLTextOut( int x, int y, const CString& str )

CDC::intDrawText( const CString& str, LPRECT lpRect, UINT nFormat )

两个函数,对TextOut来讲只能输出单行的文字,而DrawText可以指定在一个矩形中输出单行或多行文字,并且可以规定对齐方式和使用何种风格。nFormat可以是多种以下标记的组合(利用位或操作)以达到选择输出风格的目的。

CDC::SetTextColor(COLORREF crColor )在输出文字时如果希望改变文字的颜色

CDC::SetBkColor(COLORREF crColor )   改变背景色

CDC::SetBkMode(int nBkMode )         需要透明的背景色

COLORREFCDC::GetPixel( int x, int y) 可以得到指定点的颜色

CPen::CreatePen(int nPenStyle, int nWidth, COLORREF crColor )创建画笔

BOOLCreateSolidBrush( COLORREF crColor );        创建一种固定颜色的刷子

BOOLCreateHatchBrush( int nIndex, COLORREF crColor );创建指定颜色和网格的刷子

BOOLCreatePatternBrush( CBitmap* pBitmap );  创建以8*8位图为模板的刷子

intCDC::SetMapMode( int nMapMode )               设置指定映射方式

 

系统默认的映射方式为MM_TEXT即X坐标向右增加,Y坐标向下增加,(0,0)在屏幕左上方,DC中的每一点就是屏幕上的一个象素。

 

多边形学习

•       CreateRectRgn 由矩形创建一个多边形

•       CreateEllipticRgn 由椭圆创建一个多边形

•       CreatePolygonRgn 创建一个有多个点围成的多边形

•       PtInRegion 某点是否在内部

•       CombineRgn 两个多边形相并

•       EqualRgn 两个多边形是否相等

在本节中讲演多边形的意义在于重新在窗口中作图时提高效率。因为引发窗口重绘的原因是某个区域失效,而失效的区域用多边形来表示。假设窗口大小为500*400当上方的另一个窗口从(0,0,10,10)移动到(20,20,30,30)这时(0,0,10,10)区域就失效了,而你只需要重绘这部分区域而不是所有区域,这样你程序的执行效率就会提高。

通过调用API函数int GetClipRgn( HDC hdc, HRGN hrgn)就可以得到失效区域,但是一般用不着那么精确而只需得到包含该区域的最小矩形就可以了,所以可以利用int CDC::GetClipBox( LPRECT lpRect)完成这一功能。

 

在程序运行时CWinApp将创建一个CFrameWnd框架窗口实例,而框架窗口将创建文档模板,然后有文档模板创建文档实例和视实例,并将两者关联。一般来讲我们只需对文档和视进行操作,框架的各种行为已经被MFC安排好了而不需人为干预,这也是M$设计文档-视结构的本意,让我们将注意力放在完成任务上而从界面编写中解放出来。

在应用中一个视对应一个文档,但一个文档可以包含多个视。一个应用中只用一个框架窗口,对多文档界面来讲可能有多个MDI子窗口。每一个视都是一个子窗口,在单文档界面中父窗口即是框架窗口,在多文档界面中父窗口为MDI子窗口。一个多文档应用中可以包含多个文档模板,一个模板定义了一个文档和一个或多个视之间的对应关系。同一个文档可以属于多个模板,但一个模板中只允许定义一个文档。同样一个视也可以属于多个文档模板。

 

接下来看看如何在程序中得到各种对象的指针:

  • 全局函数AfxGetApp可以得到CWinApp应用类指针
  • AfxGetApp()->m_pMainWnd为框架窗口指针
  • 在框架窗口中:CFrameWnd::GetActiveDocument得到当前活动文档指针
  • 在框架窗口中:CFrameWnd::GetActiveView得到当前活动视指针
  • 在视中:CView::GetDocument得到对应的文档指针
  • 在文档中:CDocument::GetFirstViewPosition,CDocument::GetNextView用来遍历所有和文档关联的视。    
  • 在文档中:CDocument::GetDocTemplate得到文档模板指针
  • 在多文档界面中:CMDIFrameWnd::MDIGetActive得到当前活动的MDI子窗口    

一般来讲用户输入消息(如菜单选择,鼠标,键盘等)会先发往视,如果视未处理则会发往框架窗口。所以定义消息映射时定义在视中就可以了,如果一个应用同时拥有多个视而当前活动视没有对消息进行处理则消息会发往框架窗口。

视图中是没有菜单的,在框架窗口中才有,所以只有用AfxGetApp()->m_pMainWnd->GetMenu()才能得到应用的菜单指针。

一般来说用户的输入/输出基本都是通过视进行,但一些例外的情况下可能需要和框架直接发生作用,而在多视的情况下如何在视之间传递数据。

在使用菜单时大家会发现当一个菜单没有进行映射处理时为禁止状态,在多视的情况下菜单的状态和处理映射是和当前活动视相联系的,这样MFC可以保证视能正确的接收到各种消息,但有时候也会产生不便。有一个解决办法就是在框架中对消息进行处理,这样也可以保证当前文档可以通过框架得到当前消息。

视的初始化,当一个文档被打开或是新建一个文档时视图的CView::OnInitialUpdate()会被调用,你可以通过重载该函数对视进行初始化,并在结束前调用父类的OnInitialUpdate,因为这样可以保证OnUpdate会被调用。

文档中内容的清除,当文档被关闭时(比如退出或是新建前上一个文档清除)void CDocument::DeleteContents ()会被调用,你可以通过重载该函数来进行清理工作。

当使用者通过视修改了数据时,应该调用GetDocument()->SetModifiedFlag(TRUE)通知文档数据已经被更新,这样在关闭文档时会自动询问用户是否保存数据。

怎样使类具有序列化功能呢?你需要以下的工作:

  • 该类从CObject派生。
  • 在类声明中包括DECLARE_SERIAL宏定义。
  • 提供一个缺省的构造函数。
  • 在类中实现Serialze函数
  • 使用IMPLEMENT_SERIAL指明类名和版本号

 

MFC中提供了丰富的视类供开发者使用,下面对各个类进行介绍:

CView类是最基本的视类只支持最基本的操作。

CScrollView类提供了滚动的功能,你可以利用void CScrollView::SetScrollSizes( int nMapMode, SIZE sizeTotal,

                  const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault)设置滚动尺寸,和坐标映射模式。

                  但是在绘图和接收用户输入时需要对坐标进行转换。

CFormView类提供用户在资源文件中定义界面的能力,并可以将子窗口和变量进行绑定。

                  通过UpdateData函数让数据在变量和子窗口间交换。

CTreeView类利用TreeCtrl界面作为视界面,通过调用

                CTreeCtrl& CTreeView::GetTreeCtrl( ) const得到CTreeCtrl的引用。

CListView类利用ListCtrl界面作为视界面,通过调用

                CTreeCtrl& CTreeView::GetTreeCtrl( ) const得到CListCtrl的引用。

                 有问题吧?待验证

CEditView类利用Edit接收用户输入,它具有输入框的一切功能。

                 通过调用CEdit& CEditView::GetEditCtrl( ) const得到Edit&的引用。

void CEditView::SetPrinterFont( CFont* pFont )可以设置打印字体。

                CRichEditView类作为Rich Text Edit(富文本输入)的视类,提供了可以按照格式显示文本的能力,

                在使用时需要CRichEditDoc的支持。

你可能感兴趣的:(框架,工作,活动,文档,mfc,任务)