MFC学习笔记-匡桂明

更新时间:2024-04-06 20:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一讲:

MFC:Microsoft Foundation Class

API: Application Programming Interface

按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各类型的句柄。 WM: Window Message

wParam和lParams都是整型。Specifies additional information about the message. The exact meaning depends on the value of the message member。 WORD:16位的整数。 DWORD:Double WORD time : 表示消息被投递出去的时间。

pt: 指示了消息被投递时光标在屏幕中的位置。

屏幕坐标通常是以左上角为原点,向右X坐标增加,右下Y坐标增加。

DC Device-Context

::GetDC(&hwnd):传入的参数是一个窗口的句柄,这个hwnd可以类比是要画图的那块画布的标识。得到一个DC,用完后要ReleaseDC(),否则会造成内存泄露。 GetDC() 和ReleaseDC()成对使用。 BeginPaint() 和 EndPaint()成对使用。

An application should not call BeginPaint except in response to a WM_PAINT message. Each call to BeginPaint must have a corresponding call to the EndPaint function

第二讲:

在C语言中,结构体里面是不允许有函数的,但是C++中支持结构体中包含函数

在Struct中缺省情况下所有的成员是public的,但是class中缺省的情况下成员是private的

第三讲:

WinMain函数在C:\\Program Files\\Microsoft Visual Studio\\VC98\\MFC\\SRC的APPMODUL.CPP文件中(_tWinMain函数)

全局变量或者全局对象是在main函数加载之前就已经为它们分配内存空间。

带Afx前缀的函数是应用程序框架类函数,这些函数都是全局的函数。

AfxWinMain函数在C:\\Program Files\\Microsoft Visual Studio\\VC98\\MFC\\SRC的WINMAIN.CPP文件中。

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

结构体CREATESTRUCT中的成员和CreateWindowEx函数中的参数完全一致(顺序相反) 结构体CREATESTRUCT的作用:让我们有机会在创建产生窗口之前有机会去修改窗口的外观!

CDoc完成数据的存储和加载 CView完成数据的显示和修改

CWnd的对象并不等于窗口!

CWnd内部定义了一个窗口的handle

CWnd的对象销毁时,关联的窗口也会被销毁。

通常在定义一个变量是会在名字前加上m_(如:m_wnd),表明这个变量是类的成员变量

MFC机制:设计窗口,注册窗口,创建窗口,显示窗口,更新窗口,消息循环

第四讲:

View类窗口已经覆盖在MainFrame窗口之上!所以在窗口上的操作都是对View类窗口的操作!

MFC采用的是消息映射机制!

在后台维护了一个窗口的句柄和C++对象指针的一个对照表。当收到一个消息时(MSG这个结构体的第一个参数就指明了这个消息和哪个窗口相关),通过这个句柄可以找到对应的C++对象的指针,然后通过这个指针传递给基类,基类会调用WinProc函数来处理。在WinProc函数中调用了OnWndMsg函数,真正的消息路由处理是由OnWndMsg函数完成的,在OnWndMsg函数会很据消息种类查找消息映射,在对应的C++类的头文件中查找在DECLARE_MESSAGE_MAP()语句前是否有消息响应函数原型声明,查找在CPP文件中的消息映射的宏(BEGIN_MESSAGE_MAP()与END_MESSAGE_MAP()之间),最终找到消息响应函数。

FromHandle函数由一个hwnd得到对应C++对象的指针。

第五讲:

创建一个插入符,用函数CreateSolidCaret

字体的高度:tmAscent+tmDescent

字符在屏幕显示的长度:可以用函数CDC::GetTextExtent GetTextExtent() VS GetTextMetrics():

GetTextMetrics() 获取的是当前字体信息的度量。

GetTextExtent() 获取的是一个特定字符串在屏幕上显示的宽度和高度。

路径层:BeginPath()打开路径层,EndPath()关闭路径层

创建路径层的作用:SelectClipPath()函数设置一个互操作的模式,来达到一个特殊的效果!

在窗口输出一串文字

OnDraw函数在窗口发生重绘时会被应用程序的框架所调用

第六讲:菜单

在给资源取ID号时,通常用大写字母表示,而且在ID后加一个字母用以标识这是哪种资源,例如图标IDI(Icon),光标IDC(cursor),菜单IDM(menu)

从CWnd派生出来的类既可以接受命令消息,也可以接受标准消息 从CCmdTarget派生出来的类命令消息,不能接受标准消息

WindowProc是CWnd的成员函数。

一个命令消息的路由: CMainFrame→CView

CView自身不响应的话CView→CDoc CDoc不响应的话,将消息返还给CView CView将消息返还给CMainFrame

CMainFrame不响应的话CMainFrame→CApp

分隔符也是一个菜单项!

一个子菜单中只能有一个缺省菜单。

作为一个图形标记菜单,图形标记的位图尺寸是有限定的。可以通过GetSystemMetrics函数获取图形标记位图尺寸的大小。

MFC提供了一种命令更新机制,想自己控制一个菜单项是否能使用,必须先在CMainFrame的构造函数中将m_bAutoMenuEnable设置为False。m_bAutoMenuEnable = FALSE后,MFC将不会去判断哪些项可用哪些项不可用,所有这些都要程序员自己去处理完成。

将整个菜单取消:SetMenu(NULL); 注意:

CMenu menu;

menu.LoadMenu(IDR_MAINFRAME); SetMenu(&menu);

此处的menu是一个局部对象,会出现问题的。

Create a CMenu object on the stack frame as a local, then call CMenu’s member functions to manipulate the new menu as needed. Next, call CWnd::SetMenu to set the menu to a window, followed immediately by a call to the CMenu object’s Detach member function. The CWnd::SetMenu member function sets the window’s menu to the new menu, causes the window to be redrawn to reflect the menu change, and also passes ownership of the menu to the window. The call to Detach detaches the HMENU from the CMenu object, so that when the local CMenu variable passes out of scope, the CMenu object destructor does not attempt to destroy a menu it no longer owns. The menu itself is automatically destroyed when the window is destroyed. 所以在SetMenu后紧接着调用Detach函数menu.Detach();

MFC关于菜单项的命令更新机制:

对话框分为模态对话框和非模态对话框 模态对话框的创建使用DoModal()函数

要使得静态文本控件相应点击事件,必须将其原ID号(ID_STATIC)改变,并且要将其属性中的“样式”中的“通知”选项勾上(可以接收通知命令消息)

窗口从无到有的过程中会发送一个WM_PAINT消息,进行窗口重绘。 OnDraw函数传递的参数是一个CDC的指针,这样我们就可以直接调用CDC里封装的绘图相关函数。

按钮的caption字体改变:点击对话框的属性,对话框的属性中有一个font属性,会改变整个对话框中的文本字体!

对话框分为模态对话框和非模态对话框 模态对话框的创建使用DoModal()函数

要使得静态文本控件相应点击事件,必须将其原ID号(ID_STATIC)改变,并且要将其属性中的“样式”中的“通知”选项勾上(可以接收通知命令消息)

窗口从无到有的过程中会发送一个WM_PAINT消息,进行窗口重绘。 OnDraw函数传递的参数是一个CDC的指针,这样我们就可以直接调用CDC里封装的绘图相关函数。

按钮的caption字体改变:点击对话框的属性,对话框的属性中有一个font属性,会改变整个对话框中的文本字体!

本文来源:https://www.bwwdw.com/article/etbr.html

Top