PoEdu - Winddows编程班之MFC(一)【Po学校】- 第1课 课堂笔记

MFC (一)

  • 什么是MFC
    • 微软提供的一套应用程序开发框架,MFC如今无法提供一套完善的商业界面,但还是能提供可供使用的简单界面,MFC非常庞大,所以一些企业会弃用MFC,自己实现商业界面;那么为什么还要学习MFC?市面上还有一些常年不更新的软件,需要MFC知识来维护.还一个,初学者需要MFC知识来了解交互界面里面的解决机制。
  • 示例一:EditDemo
    • MFC的使用: 1 “在共享DLL中使用MFC“ 2 ”在静态库中使用MFC“
      • 如果示例发布给别的用户使用,用户的电脑中应该有”DLL“文件,才能正常使用
      • 发布时就选择2 ”在静态库中使用MFC“,此时发布的程序包就比较大
      • 不发布则选择1 ”在共享DLL中使用MFC“
      • 编辑框(Edit Control)
        • Multiline 指定编辑框文本可以折成多行,它还要一个Want Return属性True来配合使用,接收回车
        • Vertical Scroll 垂直滚动条
        • Horizontal Scroll 水平滚动条
      • 按钮(Button)
        • 第一步就是更改 ID
        • 第进一步是更改标题(Caption)
      • 静态文本(Static Text),多来做一些提示信息
    • 事件代码:
      • GetDlgItemTextW() GetDlgItemText系列函数有三个:1 GetDlgItemTextW 2 GetDlgItemText 3 GetDlgItemTextA
        • 区别:W宽字节 A 窄字节 什么也不带的最危险的版本
        • 推荐使用带W的函数,因为三个函数最终会调用W的版本
        • 强烈建议:不使用坑爹的”T“ : 如 _T test(); 它会根据你计算机的编码来给出一个选择,这个选择可能就不是你要的。用T的时候,你不知道他是宽字节,还是窄字节。微软中最坑的就是这些带”T“的。##坑爹之一:只能保证编译通过,不能保证执行通过
        • 不带W和A的函数,会根据VS默认的字符集,来决定是使用W或者是使用A,##坑爹之二
        • 任何时候都统一使用uncode
        • 任何一个不太熟悉的函数使用前,要查看文档,主要看返回值是什么。
      • CString 是微软MFC中的一个类型
        • MFC中所有默认接收类型都是CString类型
  • 示例二:CheckBoxDemo
    • 单选框(Check Box)
      • MFC提供了顶端对齐,水平对齐,等,可以把多个单选框排列整齐
    • 多选框(Radio Button)
    • 获取控件的状态,有两种方式:1,把控件做成一个局部变量,2,使用GetDlgItem()函数
      • 添加控件变量
        • 添加成功后,可能右键,类向导,在类向导中点选成员变量,可以看到控件和成员变量的绑定关系
        • 在这里也是可以添加成员变量的
        • 这些变量的申明将自动的添加到CheckBoxDemoDlg.h文件中申明
      • 添加消息
        • 右键,类向导中,点选”消息“选框,输入”ERA“擦除的头几个字母,下面会有提示,选择WM_ERASEBKGND双击,会自动添加擦除函数的实现代码,我们进去写代码实现就可以了。
        • OnEraseBkgnd()函数,其功能是”擦除背景“,每一次窗口再发生重绘之前,来擦除背景;OnPaint()函数功能是绘画
        • 单选和多选框,都是一个CButton类,CButton类中有一个GetCheck()方法
          • GetCheck()会返回一个bool值,选框选中返回true,没有选中返回flase.
        • 关于RGB(); #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) @以后再了解
        • 关于画刷 CBrush @以后再了解
          • CBrush
            • CBrush:: CBrush
            • CBrush( );
            • CBrush( COLORREF crColor );
            • throw( CResouceException );
            • CBrush( int nIndex, COLORREF crColor );
            • throw( CResouceException );
            • CBrush( CBitmap* pBitmap );
            • throw( CResouceExecption );
          • 参数
            • crColor指定画刷的前景色(RGB方式)。如果画刷是阴影线型的,则指定阴影线的颜色。
            • nIndex指定画刷阴影线采用的风格,取值如下:
            • HS_BDIAGONAL45度的向下影线(从左到右)
            • HS_CROSS水平和垂直方向以网格线作出阴影
            • HS_DIAGCROSS 45度的网格线阴影
            • HS_FDIAGONAL 45度的向上阴影线(从左到右)
            • HS_HORIZONTAL 水平的阴影线
            • HS_VERTICAL 垂直的阴影线
            • pBitmap指向CBitmap对象的指针,该对象指定了画刷要绘制的位图。
          • 说明
            • 类CBrush一共有四个覆盖的构造函数。不带参数的那个构造函数构造一个未初始化的CBrush对象,在使用该对象之前需要另外初始化。如果使用了不带参数的那个构造函数,则必须用CreateSolidBrush、CreateHatchBrush、CreateBrushIndirect、CreatePatternBrush或CreateDIBPatternBrush来初始化返回的CBrush对象。如果使用了带参数的构造函数,则不再需要初始化CBrush对象。带参数的构造函数在出错时会产生一个异常,而不带参数的构造函数总是成功返回。只带有一个参数COLORREF的构造函数用指定的颜色构造一个实线型的画刷。颜色是一个RGB值,可以用WINDOWS.H中的宏RGB构造出来。带两个参数的构造函数构造一个阴影线型的画刷,参数nIndex指定了阴影线模式的指数(index)。参数crColor指定了画刷的颜色。带有一个CBitmap型参数的构造函数构造一个模式化的画刷。参数指定一个位图。该位图应该是已经用CBitmap::CreateBitmap、CBitmap::CreateBitmapIndirect、CBitmap::LoadBitmap或CBitmap::CreateCompatiableBitmap建立或加载的位图。填充模式下的位图的最小尺寸为8像素×8像素。
        • Invalidate()函数用法
          • Invalidate(false)不擦除背景,直接画
          • Invalidate(true)擦除背景
          • InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效
          • InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。
          • Invalidate()之后:(MFC的,顺便了)
          • OnPaint()->OnPrepareDC()->OnDraw()
            • 所以只是刷新在OnPaint()和OnDraw()函数中的绘图语句。其它地方没有影响。
          • Invalidate标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WM_PAINT),需 要处理到WM_PAINT消息时才真正重绘。以为您Invalidate之后还有其他的语句正在执行,程序没有机会去处理WM_PAINT消息,但当函数 执行完毕后,消息处理才得以进行。
          • Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以不管Invalidate放哪里,都是最后的。
          • InvalidateRect(hWnd,&rect,TRUE);向hWnd窗体发出WM_PAINT的消息,强制客户区域重绘制,
          • rect是你指定要刷新的区域,此区域外的客户区域不被重绘,这样防止客户区域的一个局部的改动,而导致整个客户区域重绘而导致闪烁,如果最后的参数为TRUE,则还向窗体发送WM_ERASEBKGND消息,使背景重绘,当然在客户区域重绘之前。
          • UpdateWindow()只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT
            • 如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效,则UpdateWindow将导致Windows用WM_PAINT消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)。这一WM_PAINT消息不进入消息队列,直接由WINDOWS调用窗口过程。窗口过程完成刷新以后立刻退出,WINDOWS将控制返回给程序中UpdateWindow调用之后的语句。
            • UpdateData()顺便说下,这个函数不是刷新界面用的。
            • UpdateData();参数为FALSE时,将界面上控件绑定的变量的数据导到控件内,参数为TRUE时,导入方向则相反。
  • 示例三:ComboBoxDemo
    • 针对下拉列表框的处理函数
      • AddString()、DeleteString() 、 InsertString()、 ResetContent()
        • 四个函数放在一起,他们都是针对下拉列表框的处理函数,
      • AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串.
      • DeleteString(UINT nIndex)为删除指定索引为nIndex的数据.
      • InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容.
      • ResetContent()是清除列表框中所有的内容.
    • 下拉框(Combo Box)
      • Type 3个类型选项: 下拉 列表 简单
      • Data 多项选项添加格式:1;2;3; 和Type中列表属性配合,让其不被修改。 ##但一般不这么用,我们会自己添加。
      • Sort 自动排序 ##但有时不是我们想要的序列,一般禁用。
    • List Box
      • 注意Sort属性的设置
    • 添加
      • AddString()方法
        • CComboBox::AddString
          • int AddString( LPCTSTR lpszString );
        • 返回值:
          • 返回值大于等于0时,是列表中项的下标。出错时,返回CB_ERROR,没有足够的空间存放新的字符串时返回CB_ERRSPACE。
        • 参数:
          • lpszString 指向将要添加的字符串(以null结尾)的指针。
        • 说明:
          • 本函数在组合框中的列表框中添加一个字符串。如果列表框的风格不是CBS_SORT的,则在列表的末尾添加该字符串。否则,该字符串按照排序的次序插入到列表中。
          • 在列表的指定位置插入一项,需使用成员函数InsertString。
        • 请参阅:
          • CComboBox::InsertString, CComboBox::DeleteString, CB_ADDSTRING
      • CComboBox::GetCurSel()
        • GetCurSel()其函数原型为 int CComboBox::GetCurSel();
        • 主要用来确定在组合框中选中了哪一项,返回值为列表框的索引,例如:
        • 做了如下一个列表框:
          • COM1   索引0
          • COM2   索引1
          • COM3   索引2
          • COM4   索引3
          • COM5   索引4
          • 上述的COM1,COM2,COM3,COM4是你自己做的一个组合框中的列表框,后面的索引是我标的,目的就是容易讲的清楚。
        • 假如你用鼠标选择了COM2,则返回值为1,所以索引是从0开始的,你可以根据自己的需要进行相应的处理。
      • 选中的逻辑
        • 让列表框中最新添加项处于被选状态
          • 利用AddString()的返回值来进行判断 ##如果大于-1,则返回下标
            • 如果为真,则选中:m_cobDemo.SetCurSel(nInex);
      • 每次添加成功后,把输入框清空
        •  
    • 删除
      • CComboBox::DeleteString() ##参考上面针对下拉列表的处理函数
      • 选中的逻辑
        • 首先判断是否大于-1
        • 如果大于则删除,否则报错
        • 上面的实现后,发现每一次删除后,又失去了选中状态
          • CComboBox::GetCount()获得列表框中的选项数目
          • 再次在删除后加一个判断,如果nIndex小于列表框的选项数目,选中下一个节点去,否则就选中0项。

posted on 2017-03-17 10:38  zzdoit  阅读(185)  评论(0编辑  收藏  举报

导航