zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    老大叔开博感想
    模板
    Codeforces Round #685 (Div. 2) 题解
    CF830E Perpetual Motion Machine 题解
    THUWC2020游记
    数论
    后缀数组学习笔记
    Codeforces Round #466 (Div. 2)
    博客停写,搬家到www.54kaikai.com
    lda 主题模型--TOPIC MODEL--Gibbslda++结果分析
  • 原文地址:https://www.cnblogs.com/yeyeye123/p/11032293.html
Copyright © 2011-2022 走看看