MFC界面相关
一MFC 的菜单
1 相关类
WIN32 - HMENU
MFC - CMenu 类对象
CMenu - 封装了操作菜单的各种API 函数,还封装了很重要成
员
m_hMenu(保存菜单句柄)
2 菜单使用
2.1 添加菜单资源
2.2 设置菜单(将菜单挂到窗口中)
1)在创建主框架窗口的(Create)过程中
2)在框架窗口的WM_CREATE 消息处理中
CMenu menu;
menu.LoadMenu
CFrameWnd::SetMenu
2.3 设置菜单项状态
ON_WM_INITMENUPOPUP
::CheckMenuItem / CMenu::CheckMenuItem
::EnableMenuItem / CMenu::EnableMenuItem
2.4 命令消息(WM_COMMAND)的处理顺序
Frame-->App(CFrameWnd::OnCmdMsg 函数执行先后顺序
决定)
2.5 上下文(右键)菜单
ON_WM_CONTEXTMENU
::TrackPopupMenu / CMenu::TrackPopupMenu
二工具栏
1 相关类
CToolBarCtrl - 父类为CWnd,封装了关于工具栏控件的操作
CToolBar - 父类为CControlBar,封装工具栏和框架窗口
之间的关系,包含工具栏的创建
2 工具栏的使用
2.1 添加工具栏资源
2.2 创建工具栏
CToolBar::Create / CToolBar::CreateEx
2.3 加载工具栏资源
CToolBar::LoadToolBar
2.4 工具栏的停靠(船坞化)
1)工具栏准备停靠CToolBar::EnableDocking
2)框架窗口允许停靠CFrameWnd::EnableDocking
3)框架窗口确定停靠位置
CFrameWnd::DockControlBar
2.5 工具栏的显示和隐藏
CFrameWnd::ShowControlBar
CWnd::IsWindowVisible - 可以判断窗口显示/隐藏状态
2.6 工具栏
CBRS_TOOLTIPS - 工具栏具有标签提示
CBRS_GRIPPER - 把手/夹子
CBRS_SIZE_DYNAMIC - 工具栏可以变形
练习:添加一个菜单“工具栏”
1 当工具栏显示菜单项勾选, 工具栏隐藏菜单项非勾选
2 菜单项每点击一次工具栏显示/隐藏状态切换一次
3 不要任何变量
三状态栏
1 相关类
CStatusBar - 父类CControlBar,封装了状态各种操作,以及
状态栏的创建
2 状态栏的使用
2.1 创建状态栏
CStatusBar::Create / CStatusBar::CreateEx
2.2 设置状态栏指示器
CStatusBar::SetIndicators
2.3 设置指示器的风格和宽度
CStatusBar::SetPaneInfo
2.4 设置指示器的文本内容
CStatusBar::SetPaneText
一视图窗口
1 相关问题
MFC 视图窗口- 提供了一个用于显示数据窗口,和用户进行交
互
相关类CView 及其子类- 父类CWnd
2 视图窗口的使用
2.1 代码的书写
1)从CView 派生了一个自己的视图窗口类(CMyView)并重
写
父类纯虚函数OnDraw
2)new 了CMyView 类对象,并利用这个对象调用Create 函
数
完成视图窗口的创建
3)第一个视图窗口的ID,一般AFX_IDW_PANE_FIRST
关系图:***************************
theApp
|->m_pMainWnd (pFrame)
|->m_pViewActive(pView)
3 命令消息(WM_COMMAND)处理顺序
View-->Frame-->App
(CFrameWnd::OnCmdMsg 函数执行先后决定)
四窗口切分
1 窗口切分的分类
动态切分- 程序在执行过程中根据用户的需要实时完成切分
最多2*2
静态切分- 窗口创建时就已经完成切分。
CSplitterWnd - 父类为CFrameWnd
2 静态切分
2.1 重写CFrameWnd::OnCreateClient 虚函数
2.2 在这个函数中调用
CSplitterWnd::CreateStatic(创建不规则框架窗口)
2.3 调用CSplitterWnd::CreateView 给不规则框架的客户区
设置视图窗口。
二MFC 绘图
1 绘图设备类
决定图形绘制到哪儿,相当于绘图的纸。
1.1 CDC 类
绘图设备类的顶层父类。封装了一般的绘图设备,例如:
打印机、显示器等。
1.2 CWindowDC 类
父类是CDC 类,封装的是指定窗口的区域。包括窗口的
客户区和非客户区。
1.3 CClientDC 类
父类也是CDC 类,封装的也是指定窗口的区域,但是只
包含客户区。
1.4 CPaintDC 类
父类也是CDC 类,封装的也是指定窗口的区域,也是只
包含客户区。只能用在WM_PAINT 的消息处理函数中。
1.5 CMetaFileDC 类
父类也是CDC 类,与其它DC 区别最大,保存绘制命令的
DC。
保存后,可以通过它重新执行绘制命令绘制图形。
2 CDC 类的使用
2.1 创建DC
virtual BOOL CreateDC(
LPCTSTR lpszDriverName,//设备的驱动名称
LPCTSTR lpszDeviceName,//设备的名称
LPCTSTR lpszOutput, //设备接口
const void* lpInitData//初始化参数
);
如何是显示器设备:
CreateDC("DISPLAY",NULL,NULL,NULL);
2.2 使用
2.3 删除DC
CDC::DeleteDC
3 CWindowDC/CClientDC 的使用
直接构造即可使用
4 CPaintDC
右击窗口类添加WM_PAINT 的消息处理函数使用即可
5 CMetaFileDC 的使用
5.1 创建DC
CMetaFileDC::CreateDC
5.2 在DC 上绘制
5.3 关闭,返回句柄
CMetaFileDC::Close
5.4 使用保存的绘制命令(可以使用多次)
CDC::PlayMetaFile
5.5 删除DC
DeleteMetaFile
绘图对象类
决定使用什么对象绘制,相当于绘图的笔。
一MFC 绘图对象
1 相关类
1.1 CPen-画笔
1.2 CBrush-画刷
1.3 CFont-字体
1.4 CBitmap-位图
1.5 CPalette-调色板,引入调色板可以减少位图所占的空间大小
RGB(0~255,0~255,0~255),24 位真彩色
800*600 的位图,RGB 表示,800*600*3
800*600 的位图,使用调色板(使用颜色表中索引值表示颜
色),
800*600*1
1.6 CRgn-区域,可以通过将两个不同的区域进行几何运算得到
复杂的区域,而且,可以进行多次几何运算。
2 使用
2.1 画笔、画刷和字体的使用步骤:
2.1.1 构造或者创建绘图对象
2.1.2 将绘图对象选入到绘图设备中
2.1.3 使用绘图对象绘制图形
2.1.4 还原默认的绘图对象
2.1.5 删除绘图对象
2.2 位图的使用步骤
2.2.1 定义位图对象,并加载位图资源
2.2.2 创建与当前dc 兼容的dc
2.2.3 将位图对象选入到兼容dc
2.2.4 将位图从兼容dc 拷贝到当前dc
BitBlt/StretchBlt
2.2.5 恢复兼容dc 的位图
2.2.6 删除兼容dc
2.2.7 删除位图对象
2.3 区域的使用步骤
2.3.1 创建几何区域
CRgn::CreateXXX
2.3.2 将两个区域进行几何运算
CRgn::CombineRgn
2.3.3 使用画刷填充几何区域
CDC::FillRgn
2.3.4 使用画刷填充边界
CDC::FrameRgn
使用:CWnd::SetWindowRgn,设置窗口的区域, 使用它
可以创建异形窗口
二简单的鼠标绘图的例子
1 图形的类型,直线、矩形和椭圆。
数据:起点坐标、终点坐标和图形类型
2 处理的消息
LBUTTONDOWM:确定起点坐标,开始绘制
MOUSEMOVE:动态的绘制图形
LBUTTONUP:结束绘制
为画图程序增加保存功能
1 添加图形类,增加对序列化的支持
2 由于需要保存多个图形,所以使用集合类,选择使用CObArray
CObArray 是一个动态的数组,数组元素类型是CObject*
3 在文档类中添加成员变量
CObArray m_ShapeArray;
4 在视图类鼠标弹起的消息处理函数中将图形添加到数组中
5 首先解决重绘问题
在视图的OnDraw()函数中使用文档数据重绘
6 修改DrawShape()函数,增加图形类型参数
7 添加文档类的成员函数ClearShapeArray(),清空集合。
8 实现文档类的Serilize()函数,保存和加载图形数据
9 分别在文档的析构和新建文档时,清空集合
10 为了设置保存的文件类型,修改文档的字符串资源
11 双击打开
//可以通过外部命令打开程序
EnableShellOpen();
//将文件类型写入到注册表
RegisterShellFileTypes(TRUE);
原理:双击某一个文件时,根据文件的后缀在注册表中
查找对应的应用程序,找到后,启动该程序,并且加载
文件数据。
通过在MFC 的工程向导的第四步中的Advanced 按钮中设置
文件类型,程序自动增加以上两句代码
一MFC 对话框
1 分类
模式和非模式两种
2 相关类
CDialog 类-对话框类的父类,用于创建一般的对话框。
CCommonDialog 类-父类是CDialog 类,通用对话框类,包含了
一系列
的可以直接使用的通用对话框,以它子类的方式提供。
文件对话框、颜色对话框、字体对话框、打印对话框
页面设置对话框、查找替换对话框。
CPropertyPage 类-父类也是CDialog 类,属性页对话框。可以完
成
标签式属性页和向导式属性页。
3 CDialog 类的使用
3.1 基于模式对话框的应用程序
3.1.1 添加对话框资源,资源ID 设置为构造函数的参数
3.1.2 创建和显示
CDialog::DoModal()
3.1.3 关闭
CDialog::OnOK()/OnCancel()
3.2 基于非模式对话框的应用程序
3.2.1 添加对话框资源,资源ID 设置为构造函数的参数
3.2.2 创建和显示,与一般框架的创建和显示的过程相同。
3.2.3 关闭,需要程序员自己处理
1 重写CDialog::OnOK/OnCancel 函数,在函数中:
DestroyWindow();
2 重写CWnd::PostNcDestroy 函数,在函数中:
delete this;
3.3 CDialog::DoModal()函数的执行流程
3.3.1 查找和加载对话框资源
3.3.2 将父窗口设置为不可用状态
3.3.3 创建对话框,进入对话框的消息循环
3.3.4 点击OK 或者Cancel 按钮后,退出消息循环
3.3.5 隐藏对话框窗口
3.3.6 将父窗口设置为可用的和活动的状态
3.3.7 销毁对话框窗口
3.3.8 返回DoModal()函数的执行结果
二控件操作
1 控件的初始化放到对话框的消息WM_INITDIALOG 处理函数
中
重写CDialog::OnInitDialog()函数。
控件操作的第一种方式:
通过控件ID 得到控件对象地址,CWnd::GetDlgItem(int nID)
控件操作的第二种方式:
对话框数据交换技术DDX,Do Data Exchange
2 对话框数据交换技术DDX
2.1 DDX 的概念
将控件与类的成员变量绑定,通过操作成员变量的方式间接的
操作控件。
2.2 相关函数
2.2.1 绑定函数
DDX_Control()-控件类型的绑定
DDX_Text()-值类型的绑定
2.2.2 数据交换函数
DoDataExchange()
2.2.3 UpdateData(BOOL)
UpdateData(TRUE)-将用户在控件中输入的数据传递给变量
UpdateData(FALSE)-将变量的值显示到控件上
2.3 原理
2.3.1 DDX_Control,控件类型的绑定
DDX_Control()
{
//1 根据控件的ID,得到控件的句柄
HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
rControl.SubclassWindow(hWndCtrl)
{
Attach(hWnd);
{
//创建映射对象
CHandleMap* pMap = afxMapHWND(TRUE);
pMap->SetPermanent(m_hWnd = hWndNew, this);
{
//以句柄为键,以控件类型的变量的地址为值
//建立映射关系。
m_permanentMap[(LPVOID)h] = permOb;
}
}
}
}
2.3.2 DDX_Text,值类型的绑定
DDX_Text(pDX,IDC_EDIT1,m_strText);
{
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
if (pDX->m_bSaveAndValidate)
{
int nLen = ::GetWindowTextLength(hWndCtrl);
::GetWindowText(hWndCtrl,
value.GetBufferSetLength(nLen), nLen+1);
value.ReleaseBuffer();
}
else
{
AfxSetWindowText(hWndCtrl, value);
}
}
三使用DDX 完成登录的例子
四控件的介绍
1 静态控件
包括图片、静态文本和分组框。默认控件ID 都是IDC_STATIC,
所以不能通过向导绑定成员变量;如需绑定,必须修改控件ID。
图形、静态文本控件对应的控件类是CStatic,而分组框对应
的控件类是CButton。
2 按钮控件
包括一般按钮、复选按钮和单选按钮。三者所对应的控件类都是
CButton。如果需要在同一个对话框上添加多个单选分组时,需要
设置Group 属性。
3 下拉框(组合框)和列表框
组合框中的选项可以单选,也可以编辑。列表框中的选项可以
单选或多选,不可编辑。组合框和列表框中选项其实是字符串。
另外,组合框可以通过属性的方式添加选项。
组合框的控件类是CComboBox;列表框的控件类是CListBox
1 添加选项
CComboBox::AddString
CListBox::AddString
2 删除选项
CComboBox::DeleteString
CListBox::DeleteString
3 清空选项
CComboBox::ResetContent
CListBox::ResetContent
4 查找选项
CComboBox::FindString
CListBox::FindString
5 获取当前选择项
CComboBox::GetCurSel
CListBox::GetCurSel
6 获取选项的数量
CComboBox::GetCount
CListBox::GetCount
7 设置/获取选项的附加数据
CListBox::SetItemData/GetItemData
CComboBox::SetItemData/GetItemData
五简单的动画播放的例子
1 CFileDialog 类的使用
1.1 构造函数
CFileDialog(
BOOL bOpenFileDialog,\\标识是文件打开对话框还是另存为对
话框
LPCTSTR lpszDefExt = NULL,\\默认的扩展名
LPCTSTR lpszFileName = NULL,\\默认的文件名
DWORD dwFlags = OFN_HIDEREADONLY ,\\对话框的风格
LPCTSTR lpszFilter = NULL, \\设置文件类型控件中的选项
CWnd* pParentWnd = NULL\\通常设置为NULL 即可。
);
文件类型过滤的字符串格式:
1 多个选项之间以"|"隔开;
2 每个选项由显示和过滤两部分组成,这两部分以"|"隔开;
3 整个字符串以"||"结束
"视频文件(*.avi)|*.avi|所有文件(*.*)|*.*||";
1.2 创建和显示窗口
CFileDialog::DoModal
1.3 获取选择的文件信息
CFileDialog::GetXXX
六进度条/滑块/旋转按钮三个控件
1 设置/获取控件表示的数值范围
CSpinButtonCtrl::SetRange/GetRange
CProgressCtrl::SetRange/GetRange
CSliderCtrl::SetRange/GetRange
2 设置单位
CSliderCtrl::SetPageSize/SetLineSize
CProgressCtrl::SetStep
一进度条/滑块/旋转按钮三个控件
1 设置/获取控件表示的数值范围
CSpinButtonCtrl::SetRange/GetRange
CProgressCtrl::SetRange/GetRange
CSliderCtrl::SetRange/GetRange
2 设置单位
CSliderCtrl::SetPageSize/SetLineSize
CProgressCtrl::SetStep
3 设置/获取控件的进度
CSpinButtonCtrl::SetPos/GetPos
CProgressCtrl::SetPos/GetPos
CSliderCtrl::SetPos/GetPos
二列表控件
1 相关类
CListCtrl-控件类,父类是CWnd。通常在对话框中使用。
CListView-视图类,父类是CCtrlView。CListView 其实是在
CView 的客户区放置了一个CListCtrl 控件。
CListView=CView+CListCtrl。
2 CListCtrl 的使用
2.1 介绍
控件的风格包括图标、小图标、列表和报表四种。
控件中每个数据项可以包含文本和图标,不同数据项图标
可以不同。如果以报表的方式显示,还可以设置列。
2.2 使用
2.2.1 设计和设置控件的图标列表
CListCtrl::SetImageList
2.2.2 插入数据项
CListCtrl::InsertItem
2.2.3 插入控件的列
CListCtrl::InsertColumn
2.2.4 设置列的文本
CListCtrl::SetItemText
2.2.5 修改控件的显示风格
CWnd::ModifyStyle
2.2.6 设置/获取数据项的附加数据
CListCtrl::SetItemData/GetItemData
2.2.7 设置背景图片
CListCtrl::SetBkImage
注释:设备背景图片,需要Ole 库的初始化,而且,通常
会将字体的背景色设置为透明。
示例:AfxOleInit();
m_wndList.SetBkImage("F:\\bliss.bmp");
m_wndList.SetTextBkColor(CLR_NONE);
...
三树控件
1 相关类
CTreeCtrl-继承自CWnd,控件类,通常在对话框中使用。
CTreeView-继承自CCtrlView,视图类。其实相当于在CView
中包含了一个CTreeCtrl 控件。
2 CTreeCtrl 与CListCtrl 的区别
树控件的节点之间的关系包括父子关系和兄弟关系,只能通过
节点句柄标识某个节点。列表控件的数据项之间是兄弟关系,
数据项是通过索引值标识。
3 使用
几乎所有的成员函数都有节点句柄参数。
3.1 设置图标列表
CTreeCtrl::SetImageList
3.2 插入节点
CTreeCtrl::InsertItem
3.3 设置节点高度
CTreeCtrl::SetItemHeight
3.4 设置节点的展开状态
CTreeCtrl::Expand
...
一属性页对话框
1 分类
标签式-主要用于配置参数、选项等数据
向导式-通常引导用户一步步的选择和设置,最终完成某些功能。
2 相关类
CPropertyPage-页面对话框类
CPropertySheet-表单类(框架)
属性页对话框由一个表单对象+多个页面对象组成。
3 标签式属性页的使用(配置图形的线宽和颜色)
3.1 添加对话框资源,修改语言和字体,生成相应的类,注意
父类选择CPropertyPage。
3.2 添加CPropertySheet 类的派生类CSetupSheet
3.3 在CSetupSheet 类中添加页面对话框类的成员变量,在构造
函数中,添加页面
CSetupSheet::AddPage
3.4 在菜单的处理函数中,创建和显示标签式属性页
CSetupSheet::DoModal
3.5 将应用按钮设置为可用
CPropertyPage::SetModified(TRUE);
3.6 通过添加虚函数的方式添加按钮的处理函数
CPropertyPage::OnApply
CPropertyPage::OnOK
CPropertyPage::OnCancel
4 向导式属性页的使用
4.1 添加对话框资源,修改语言和字体,生成相应的类,注意
父类选择CPropertyPage。
4.2 添加CPropertySheet 类的派生类CSetupSheet
4.3 在CSetupSheet 类中添加页面对话框类的成员变量,在构造
函数中,添加页面
CSetupSheet::AddPage
4.4 设置显示方式为向导模式
CPropertySheet::SetWizardMode
4.5 在菜单的处理函数中,创建和显示标签式属性页
CPropertySheet::DoModal
4.6 设置每个页面的向导按钮
4.6.1 在哪儿设置?
CPropertyPage::OnSetActive()
4.6.2 通过什么函数设置?
GetParent()
CPropertySheet::SetWizardButtons()
4.7 通过添加虚函数的方式添加按钮的处理函数
CPropertyPage::OnWizardBack
CPropertyPage::OnWizardFinish
CPropertyPage::OnWizardNext
本文出自 “日知其所无” 博客,谢绝转载!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。