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

posted on 2019-06-16 17:46  yeyeye123  阅读(474)  评论(0编辑  收藏  举报

导航