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


本文出自 “日知其所无” 博客,谢绝转载!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。