《MFC Windows程序设计》读书笔记 重剑无锋 原创
MFC Windows程序设计读书笔记
第1章. Hello MFC
Windows应用程序必须至少要有一个APP类和对象,以及一个窗口类
1.3.1 应用程序对象 CWinApp
APP对象是全局对象,必须
APP类的InitInstance()虚函数中创建窗口对象,显示之、更新之 1. 创建窗口对象,就自动调用窗口对象的构造函数 2. 显示窗口对象,使之在屏幕上可见
3. 更新窗口对象,就会自动发出WM_PAINT消息,通过消息映射,调用窗口对象的
OnPaint()过程
4. 返回TRUE,表示继续;返回FALSE,程序结束
m_pMainWnd是应用程序对象(CWinAPP及其子类)的数据成员,用于存储对应窗口对象的指针,m_nCmdShow也是它的数据成员,其值通常是SW_SHOWNORMAL,表示窗口处于既不是最大、也不是最小的状态,用于传递给显示窗口的函数,指定窗口的显示状态。
1.3.2 MFC如何使用应用程序对象
在CWinApp theApp;这条语句时,构造函数构造这个全局的应用程序对象,在构造函数中,调用了WinMain()函数,程序就开始从这里执行起走了。
1.3.3 框架窗口对象 CFrameWnd
virtual BOOL Create( LPCTSTR lpszClassName,
// 基于WNDCLASS的类名称,设为null将创建主窗口
// 窗口标题栏文本
// 尺寸,rectDefault是静态成员 // 父窗口指针 // 窗口的菜单 // 扩展样式
// 在文档/视图结构中使用的结构
LPCTSTR lpszWindowName,
DWORD dwStyle = WS_OVERLAPPEDWINDOW, // 样式 const RECT& rect = rectDefault, CWnd* pParentWnd = NULL, DWORD dwExStyle = 0, );
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED |
第1页 共 55页
LPCTSTR lpszMenuName = NULL,
CCreateContext* pContext = NULL
《MFC Windows程序设计》读书笔记 重剑无锋 原创
WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
1.3.4 绘制窗口
WM_PAINT消息的处理函数:OnPaint()负责绘制窗口。 CPaintDC dc(this);
CPaintDC只存在于OnPaint函数中,它的构造函数调用::BeginPaint(),它的析构函数调用::EndPaint(),所以,推荐在栈上创建CPaintDC对象,如果用new创建,则必须显示地用delete删除之。
在窗口客户区显示文本:
dc.DrawText(文本内容,字符数(或-1),矩形区,输出选项);
1.3.5消息映射
消息映射是将消息与消息处理函数映射起来的表。 ? 消息映射的方法: 1、在头文件中: Afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() 2、源文件中:
BEGIN_MESSAGE_MAP(当前类名,父类名) ON_WM_PAINT() END_MESSAGE_MAP()
从上面的代码可以知道:消息映射跟类的其他成员一样,可以通过继承来传递 ? 鼠标左键的消息映射函数原型是:
Afx_msg void OnLButtonDown(UINT nFlags,CPoint point); nFlags 表示虚拟键的状态,取值是以下值的相加(或): MK_CONTROL. MK_LBUTTON MK_MBUTTON MK_RBUTTON MK_SHIFT
例:if ( nFlag & MK_LBUTTON != 0 )
point是设备坐标,可以用CDC::DPtoLP()转换成逻辑坐标。 ? 自定义消息映射
第2页 共 55页
// 一般要放到最后一行
《MFC Windows程序设计》读书笔记 重剑无锋 原创
在头文件中:
#define WM_MYMESSAGE WM_USER+0X100 在源文件中:
ON_MESSAGE(WM_MYMESSAGE , OnMyMessage) 函数原型是:
Afx_msg LRESULT OnMyMessage(WPARAM wParam , LPARAM lParam);
1.3.6 消息映射的工作方式
说明消息映射的几个宏,是如何转换为代码的,以及其执行过程。 了解而已
1.3.7 Windows字符集,_T()宏
“Hello” L(“Hello”)
// 从ANSI字符组成该字符串 // 使用Unicode
// 如果预定义了预处理程序符号_UNICODE,编译器使用Unicode // 字符,否则,使用ANSI字符
_T(“Hello”)
第2章. 在Windows中绘图
2.1 Windows GDI
DC是一种数据结构,它包含了所有GDI需要的关于显示平面的描述信息,也包括相连的物理设备和各种各样的状态信息。
2.1.1 MFC设备描述表
? CDC
CDC* pDC = GetDC(); ReleaseDC(pDC); ? CPaintDC
只存在于OnPaint()函数中 CPaintDC dc(this); 或
CPaintDC* pDC = new CPaintDC(this); // 在堆上创建,手工删除 delete pDC;
// 在栈上创建,自动析构
第3页 共 55页
《MFC Windows程序设计》读书笔记 重剑无锋 原创
? CClientDC 客户区DC ? CWindowDC 客户区和非客户区DC
构造CClientDC或CWindowDC时,传递NULL参数,获得整个屏幕的DC ? CMetaFileDC
用于向GDI元文件画图的DC
2.1.2 设备描述表属性
属性 默认值 Set 文本颜色 Black SetTextColor 背景颜色 White SetBkColor 背景模式 OPAQUE SetBkMode 映射模式 MM_TEXT SetMapMode 绘图模式 R2_COPYPEN SetROP2 当前位置 0,0 MoveTo 当前画笔 BLACK_PEN SelectObject 当前画刷 WHITE_BRUSH SelectObject 当前字体 SYSTEM_FONT SelectObject dc.SetBkMode(TRANSPARENT); // 背景透明 SelectObject可以选入的对象(即所有的GDI对象): CPen,CBrush,CBitmap,CFont,CPalette,CRgn
Get GetTextColor GetBkColor GetBkMode GetMapMode GetROP2 GetCurrentPosition SelectObject SelectObject SelectObject 2.1.3 绘图模式
绘图模式表示:如何将像素点输出到逻辑显示平面上。 CDC::SetROP2()
即:Set Raster Operation to
默认模式是R2_COPYPEN,表示将像素点复制到显示平面上。
例:
dc.SetROP2(R2_NOT);
// 底色反转
2.1.4 映射模式
映射模式用于确定从逻辑坐标到设备坐标的转换方式。 应当密切关注不同映射模式下y的坐标。
第4页 共 55页
《MFC Windows程序设计》读书笔记 重剑无锋 原创
2.1.6 坐标转换
CDC::LPtoDP(); CDC::DPtoLP();
// 逻辑坐标→设备坐标 // 反之
2.1.7 移动原点
CDC::SetWindowOrg(); CDC::SetViewOrg();
// 设置窗口原点
// 设置视口原点
2.1.8 坐标系小结
设备坐标系:举例长短以像素点来计算
逻辑坐标系:原点可以在任何位置,有映射模式、缩放因子、坐标轴方向的不同 用户坐标值:窗口客户区的设备坐标值 屏幕坐标值:原点定于屏幕左上角的设备坐标 CWnd::ClientToScreen(); CWnd::ScreenToClient();
2.1.9 获取设备信息
CDC::GetDeviceCaps(); 可用参数:
HORZSIZE:物理屏幕的宽度(毫米); VERTSIZE:物理屏幕的高度(毫米); HORZRES:屏幕的宽度(像素); VERTRES:屏幕的宽度(像素); PLANES: 位平面数;
BITSPIXEL:每个像素点的位的数目 ??
2.2 用GDI画图
2.2.3 GDI画笔和CPen类
? 创建画笔的三个方法: 1、CPen pen(PS_SOLID , 1 , rgb(...)) ; 2、CPen pen ;
pen.CreatePen(PS_SOLID , 1 , rgb(...)) ;
第5页 共 55页