MFC进阶教程深入浅出版.笔记第2天
平时也没机会接触到MFC的代码,这次也是项目使然,手上项目涉及到MFC,感觉有点意思,所以在b站找了视频学习,没有上手操作过,只是走马观花,大致了解了这个代码的流程,现在奉上b站的视频链接:MFC进阶教程深入浅出版
以下是课程笔记:
第二天(绘图、文本编程、菜单):
1、简单绘图
2、画刷和画笔的使用
3、插入符使用
4、字体操作
5、菜单相关操作
-------------------------------------------------
0、简单绘图
1、画直线
a)鼠标按下和抬起
b)创建画家对象CClientDC
c)起点和终点
CDC::MoveTo
CDC::LineTo
d)选中所属类 一> 右击 一> 添加变量A//一般添加private,添加完成自动在构造函数处初始化A
CClientDC dc(this);
2、画笔、画刷的使用
a) 定义画家
b) 定义画笔(画刷) CPen, CBrush
c) 把画笔交给画家 CDC::SelectObject
d) 画刷:单色,样式,位图
bool标准 BOOL(windows平台下用)
#include<resource.h> 去掉提示错误线
-------------------------------------------------
一、简单绘图
a)画直线
b)画笔CPen的使用
c)画刷CBrush的使用
d)写字,CFont的使用
CPaintDC只能onpaint()用
CClientDC都可以(app、frame一般不用)
重要的不是学习接口,而是怎么处理问题,流程/前提条件
二、文本编辑器
插入符:创建-显示-移动
1)创建插入符CWnd::CreateSolidCaret()
a)创建CWnd::CreateSolidCaret()
b)显示CWnd::ShowCaret()
c)插入符的高度是根据字体的高度来确定
--------
| 字 |
--------
获取字体信息CDC::GetTextMetrics()
d)设置插入符位置CWnd::SetCaretPos()
2)在字符消息处理函数中写字
a)写字CDC::TextOutW()
b)获取字符串的尺寸信息CDC::GetTextExtent()//所占矩形宽度 而strlen();指元素个数
c)截取字符串(CString)左边指定长度的字符 str =
str.Left(str.GetLength()-1);//元素个数
三、字体渐变
1)定时器的使用
a)设置定时器: CWnd::SetTimer()
b)关闭定时器: CWnd::KillTimer()
c)定时器消息: WM_TIMER
2)视图类中的OnDraw()中,写字CDC::TextOutW()
3)指定区域写字: CDC::DrawText()
4)让窗口失效,产生侧PAINT,间接调用OnDraw()函数: CWnd::Invalidate
四、菜单的相关操作
1)菜单的命令响应函数
a)弹式菜单,ID不可编辑,按下去,弹出一个菜单项
b)非弹式菜单,ID可编辑
c)菜单响应命令消息的路由(顺序)
d)消息类型
[非标准消息]
WM_COMMAND,命令消息、通告消息,CCmdTarget、 CWnd子类子类能接收到非标准消息
[标准消息]
WM_XXXX CWnd子类才能接收到标准消息
[命令消息]
WM_COMMAND:菜单处理函数选中
标准消息: 属性 -> 消息
通告消息: 点击按钮,处理函数
CWnd可以接受任何消息
CCmdTarget不能接受标准消息
2)菜单相关静态操作
在框架类中进行相应操作,在OnCreate()中实现//OnCreate淡化了构造函数,有可能是窗口构造完了之后才处理
A)获取菜单栏:CWnd::GetMenu
B)获取菜单栏中的子菜单:CMenu::GetSubMenu
a)标志菜单:CMenu::GetSubMenu
MF_BYPOSITION:通过位置
MF_BYCOMMAND:通过ID
b)设置默认菜单:CMenu::SetDefaultItem
注意:一个菜单项只能设置一个默认菜单
c)禁用菜单: CMenu::EnableMenuItem
注意:需要把 CFrameWnd::m_bAutoMenuEnable成员变量设置为FALSE
d)分隔线
C)移除菜单CWnd::SetMenu
SetMenu(NULL);
D)装载菜单
a)创建菜单 CMenu::LoadMenu
b)设置菜单 CWnd::SetMenu
d)从CMenu对象中分离Windows菜单 CMenu::Detach
E)菜单命令更新机制
F)快捷菜单,弹出菜单(一定要新建菜单,不能使用框架类的主菜单)
由于鼠标点击的区域是在视图区域,所以需要在视图类中处理
a)处理鼠标右击事件WM_RBUTTONDOWN
b)获取所需的子菜单
c)弹出菜单项 CMenu::TrackPopupMenu
d)客户区坐标转屏幕坐标: CWnd::ClientToScreen
3)菜单相关动态操作
a)创建空菜单CMenu::CreateMenu
b)追加弹式菜单CMenu::AppendMenu(MF_POPUP, )
每个菜单都有一个菜单句柄:CMenu::m_hMenu
重画菜单条:CWnd::DrawMenuBar
c)追加普通菜单CMenu::AppendMenu(MF_STRING, )
d)插入菜单CMenu::InsertMenu
e)删除菜单CMenu::DeleteMenu
五、动态图标
1)定时器: CWnd::SetTimer
a)定时器信号:WM_TIMER
b)设置定时器应该放在OnCreate()
2)加载自定义图标(WinAPI): LoadIcon()
a)将资源ID转换为字符串 MAKEINTRESOURCE()
b)获取应用程序实例:
AfxGetlnstanceHandle()
AfxGetApp()->m_hInstance
3)设置图标(WinAPI)SetClassLong()
窗口句柄: CWnd::m_hWnd