三 MFC编程入门之对话框

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1 创建对话框模板和修改对话框属性

Application Type->Dialog based

 

ID:对话框ID

Caption:对话框标题

Maximize:最大化按钮

Minimize:最小化按钮

Style:对话框类型,overlapped重叠窗口  popup弹出式窗口  child子窗口

System Menu:是否带有标题栏左上角的系统菜单

Title Bar:是否带有标题栏

Font:字体类型和字体大小

Owner Draw :更改控件

 

2 为对话框添加控件

View-> Toolbox(工具箱)

 

3 创建对话框类和添加控件变量

创建对话框类:Resource View->Dialog->Insert Dialog  之后选中对话框,右击,选择AddClass

创建控件变量:选中控件,右击,选择Add Variable

 

DoDataExchange

DoDataExchange()并不是被自动调用的,而是需要我们在程序中调用CDialogEx::UpdateData()函数,

由UpdateData()函数再去自动调用DoDataExchange()的

 

BOOL UpdateData(BOOL bSaveAndValidate =TRUE);

TRUE:控件->变量

FALSE:变量->控件

 

4 为控件添加消息处理函数

a.使用Class Wizard添加消息处理函数:选中控件,右击,选择Class Wizard

b.通过“Add EventHandler...”添加处理函数:选中控件,右击,选择Add Event Handler

c.在按钮的属性视图中添加消息处理函数:选中控件,右击,选择属性,点击Control Events(类似闪电标志)

d.双击按钮添加消息处理函数

 

OnBnClickedAddButton:

// 将各控件中的数据保存到响应的变量

UpdateData(TRUE);

// 将被加数和加数的加和赋值给m_editSum

m_editSum = m_editSummand + m_editAddend;

// 根据各变量值更新相应的控件。和的编辑框会显示m_editSum的值

UpdateData(FALSE);

 

5 设置对话框控件的Tab顺序

主菜单->Format->Tab Order,直接依次点击即可修改

 

6 模态对话框及其弹出过程

模态对话框:其他窗口无法与用户交互

非模态对话框:其他窗口仍能响应用户输入

 

INT_PTR nRes;                            // 用于保存DoModal函数的返回值

CTipDlg tipDlg;                            // 构造对话框类CTipDlg的实例

nRes = tipDlg.DoModal();        // 弹出对话框

if(nRes == IDCANCEL)               // 判断对话框返回值是否为IDCANCEL,如果是则return,否则就继续向下执行

         return;

 

注:都说DoModal返回值为OK或CANCEL键的ID,其实,这种说法是错误的。

在关闭此模态对话框时,返回值(IDOK或IDCANCEL)为关闭对话框所采用的方式,

默认对话框关闭方式有2种:OnOK(); OnCancel();

 

7 非模态对话框的创建及显示

// 如果指针变量m_pTipDlg的值为NULL,则对话框还未创建,需要动态创建

if(NULL == m_pTipDlg)

{

         //创建非模态对话框实例

         m_pTipDlg= new CTipDlg();

         m_pTipDlg->Create(IDD_TIP_DIALOG,this);

}

 

// 显示非模态对话框实例

m_pTipDlg->ShowWindow(SW_SHOW);

 

// 删除非模态对话框对象

delete m_pTipDlg;

 

8 属性页对话框及相关类的介绍

a.分类

一般属相页对话框:通过标签切换各个页面

向导对话框:通过点击next等按钮来切换页面

 

b.相关类

CPpropertyPage : CDialog

用于处理某单个的属性页

(1)构造函数

CPropertyPage();

CPropertyPage(

         UINTnIDTemplate,   //对话框资源ID

         UNITNIDCaption = 0,  //标题字符串资源ID,默认设为0

         DWORDdwSize = sizeof(PROPSHEETPAGE)

);

 

CPropertyPage(

         LPCTSTRlpszTemplateName,

         UNITNIDCaption = 0,

         DWORDdwSize = sizeof(PROPSHEETPAGE)

);

 

(2)CancelToClose

进行某些不可恢复操作后,OK按钮改为Close按钮,并禁用Cancel按钮

 

(3)SetModified

激活或进行Apply按钮

void SetModified(BOOL bChanged = TRUE);

 

(4)可重载函数

OnOK

OnCancel

OnQueryCancel

OnApply

OnReset

OnKillActive

OnSetActive

OnWizardBack

OnWizardFinish

OnWizardNext

 

CPropertySheet  : CWnd

属性表类,负责加载、打开或删除属相页

(1)构造函数

CPropertySheet();

 

CPropertySheet(

         UNITnIDCaption,    //标题的字符串资源ID

         CWnd*pParentWnd = NULL,

         UINTiSelectPage = 0

);

 

CPropertySheet(

         LPCTSTRpszCaption,//标题字符串

         CWnd*pParentWnd = NULL,//父窗口

         UINTiSelectPage = 0   //活动属性页的索引

);

 

CPropertyPage *GetActivePage() const;   当前活动属性页对象的指针

CPropertyPage *GetPage(int nPage)const;  目标属相页对象的指针

int GetPageCount() const;  属性页的数量

int GettPageIndex(CPropertyPage*pPage);  属性页对象的索引

BOOL SetActivePage(int nPage);

BOOL SetActivePage(CPropertyPage*pPage);  设置某个属性页为活动属性页

void SetTitle(LPCTSTR lpszText, UINTnStyle);  设置标题,nStyle:0或PSH_PROPTITLE

void AddPage(CPropertyPage *pPage);   添加新的属性页

void PressButton(int nButton);   模拟按下某指定的按钮

PSBTN_BACK

PSBTN_NEXT

PSBTN_FINISH

PSBTN_OK

PSBTN_APPLYNOW

PSBTN_CANCEL

PSBTN_HELP

void RemovePage(CPropertyPage *pPage);

void RemovePage(int nPage);   删除某属性页

void SetWizardMode();   设置属性页对话框为向导对话框模式

void SetWizardButtons(DWORD dwFlags);  设置向导按钮  PSWIZB_NEXT, PSWIZB_BACK, PSWIZB_FINISH

void SetFinishText(LPCTSTR lpszText);

 

9 向导对话框的创建及显示

a. 创建属性页对话框资源

Resource View->Dialog->Insert Dialog

 

ID:IDD_SUMMAND_PAGE Caption:被加数页 style:ChildBorder:Thin

ID:IDD_ADDEND_PAGE Caption:被加数页style:Child Border:Thin

ID:IDD_ADD_PAGE Caption:被加数页style:Child Border:Thin

 

b. 创建属性页

创建属性页类:右击属性页对话框,选择“Add Class”

“下一步”按钮添加方法:Class View->Additon->CSummandPage->右击->选择属性->按下“overrides”按钮->找到OnSetActive

 

c. 创建属性表类

Solution ExploreràAddtionàAdd ClassàMFC ClassàAdd

# #include "SummandPage.h"

CSummandPage summandPage;

AddPage(&m_summandPage);  

 

d. 显示向导对话框

在加法计算器对话框中添加使用说明IDC_INSTRUCT_BUTTON按钮,为IDC_INSTRUCT_BUTTON按钮添加点击消息的处理函数OnBnClickedInstructButton

 

// 创建属性表对象  

CAddSheet sheet(_T(""));

// 设置属性对话框为向导对话框

sheet.SetWizardMode();

// 打开模态向导对话框

sheet.DoModal();


10 一般属性对话框的创建及显示

 

11 消息对话框

a. MessageBox

int MessageBox(

LPCTSTR lpszText,                         //需要显示的消息字符串

LPCTSTR lpszCaption=NULL,            //消息对话框的标题字符串

UINT nType=MB_OK);                        //消息对话框的风格和属性,MB_OKCANCEL | MB_ICONQUESTION

 

nType 取值

参数说明

MB_ABORTRETRY

终止重试忽略按钮

MB_OK

确定按钮

MB_OKCANCEL

确定取消按钮

MB_RETRYCANCEL

重试取消按钮

MB_YESNO

按钮

MB_YESNOCANCEL

取消按钮

 

nType 取值

显示图标

MB_ICONEXCLAMTION
MB_ICONWARNING

MB_ICONASTERISK
MB_ICONINFORMATION

MB_ICONQUESTION

MB_ICONHAND
MB_ICONSTOP
MB_ICONERROR

 

 

b. AfxMessageBox

int AfxMessageBox(

LPCTSTR lpszText,

UINT nType=MB_OK,

UINT nIDHelp=0    //此消息的帮助的上下文ID

);

 

c. 返回值

IDABORT:终止

IDCANCEL:取消

IDIGNORE:忽略

IDNO:否

IDOK:确定

IDRETRY:重试

IDYES:是

 

12 文件对话框

例子:Example17

a. 成员变量

explicit CFileDialog(

BOOL bOpenFileDialog,   //对话框类型,TRUE:打开文件对话框  FALSE:保存文件对话框

LPCTSTR lpszDefExt = NULL,   //默认的文件扩展名

LPCTSTR lpszFileName = NULL,   //初始文件名

DWORD dwFlags =OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,  //文件对话框的属性

LPCTSTR lpszFilter = NULL,   //文件过滤器,

CWnd *pParentWnd = NULL,  //文件对话框的父窗口的指针

DWORD dwSize = 0,                  //OPENFILENAME结构体的大小

BOOL bVistaStyle = TRUE   //指定文件对话框的风格,TRUE:Vista风格

);

 

OFN_HIDEREADONLY:隐藏只读选项

OFN_OVERWRITEPROMPT:弹出文件覆盖选择选项

 

static TCHAR BASED_CODEszFilter[] = _T("Chart Files (*.xlc)|*.xlc|Worksheet Files(*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files(*.*)|*.*||");

 

// 打开文件对话框

CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this); 

// 保存文件对话框

CFileDialog fileDlg(FALSE, _T("txt"),_T("my"), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter, this);

 

b. 成员函数

GetFileExt()

GetFileName()

GetFileTitle()

GetFolderPath()

GetNextPathName()

GetPathName()

GetReadOnlyPref()

GetStartPosition()

 

13 字体对话框

例子:Example18    TestCtrl

CFontDialog(

LPLOGFONT lplflnitial = NULL,   //字体特征

DWORD dwFlags = CF_EFFECTS|CF_SCREENFONTS,  //选择字体的一个或多个属性

CDC* pdcPrinter = NULL,   //指向一个打印设备上下文的指针

CWnd *pParentWnd = NULL  //指向字体对话框父窗口的指针

);

 

typedef struct tagLOGFONT {

   LONG lfHeight;   //高度

   LONG lfWidth;          //宽度

   LONG lfEscapement;

   LONG lfOrientation;         //方向

   LONG lfWeight;        //粗细

   BYTE lfItalic;              //倾斜

   BYTE lfUnderline;  //下划线

   BYTE lfStrikeOut;

   BYTE lfCharSet;

   BYTE lfOutPrecision;

   BYTE lfClipPrecision;

   BYTE lfQuality;

   BYTE lfPitchAndFamily;

   TCHAR lfFaceName[LF_FACESIZE];  //字体名

} LOGFONT;

 

typedef struct {

   DWORD lStructSize;

   HWND hwndOwner;

   HDC hDC;

   LPLOGFONT lpLogFont;

   INT iPointSize;

   DWORD Flags;

   COLORREF rgbColors;

   LPARAM lCustData;

   LPCFHOOKPROC lpfnHook;

   LPCTSTR lpTemplateName;

    HINSTANCE hInstance;

   LPTSTR lpszStyle;

   WORD nFontType;

   INT nSizeMin;

   INT nSizeMax;

} CHOOSEFONT, *LPCHOOSEFONT;

 

CFont m_font;

LOGFONT lf;

CFontDialog fontdlg(&lf);

m_font.CreateFontIndirect(fontdlg.m_cf.lpLogFont);

 

14 颜色对话框

例子:Example19

a. 成员变量

CColorDialog(

         COLORREFclrInit = 0,  //默认选择颜色的颜色值

         DWORDdwFlags = 0,  //自定义颜色对话框功能和外观的属性值

         CWnd*pParentWnd = NULL  //颜色对话框的父窗口的指针

);

 

b. 成员函数

COLORREF GetColor() const;   //返回所选颜色的COLORREF值

BYTE GetRValue(DWORD rgb);

BYTE GetGValue(DWORD rgb);

BYTE GetBValue(DWORD rgb);

MFC 编程入门到精通 MFC入门到精通 由于本科学的是电子信息专业,也就开了一门C,毕业居然去找了一份苦逼的程序猿工作,现在过上了比大学还苦逼的生活,啥都不懂,啥都要学。从最开始的VS是什么鬼都不知道的,到自己的第一个控制台程序,再到自己的第一个MFC程序;从最开始的断点是啥玩意儿,到自己一步步Debug自己的Code。发现自己真傻,隔行如隔山都不知道,还偏要一条路走到黑,梦想着有一天能用自己学的,开发一个牛逼的软... 阅读详情

相关推荐

VS2010MFC编程入门

一、MFC编程入门教程之目录 第1部分:MFC编程入门教程之目录 1.MFC编程入门之前言 鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。但是教程中讲的例子只是一个个简单的例程,并没有可视化窗口。鸡啄米在这套VS2010/MFC编程入门教程中将会给大家讲解怎样使用VS2010进行可视化编程,也就是基...

dkopg24406的专栏 1565

【03】MFC入门到精通——MFC 添加控件 设置属性 及属性说明 ,添加按钮、文本框

本文详细介绍了如何为对话框添加控件并设置属性。首先修改主对话框的标题、边框类型等基本属性,然后依次添加静态文本框、编辑框和按钮控件,分别设置其ID和显示文字。具体包括:添加“被加数”、“加数”、“和”个静态文本框,以及对应的数值输入/显示编辑框,最后添加“计算”和“退出”按钮。每个步骤都配有界面截图说明,最终实现了一个加法计算器的对话框界面。通过合理调整控件位置和对话框大小,使界面布局美观实用。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1296

《新手入门MFC基于对话框的窗口分割

很多新手刚遇到有关MFC窗口分割的项目时都会找度娘询问,结果面对五花八门的答案往往不知所措。我就是其中的一员..经过一番摸索,我终于弄明白几种关于窗口分割的方法.从大的方面来说主要分为:基于文档的和基于对话框的.而基于文档的分割方法又分为基于单文档的和基于多文档的.但是都不会太复杂.这篇文章先讲一下如何用对话框完成文档分割.也算是对自己思路的整理.闲话少叙,开始;     第一步;先建立一个基于

tiaxia1的博客 6242

VC 编程技巧 (一)

<br /><br />(1) 如何通过代码获得应用程序主窗口的 指针? <br />主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。<br />AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED)<br />//使程序最大化.<br /><br />(2) 确定应用程序的路径 <br />Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。<br />Example:<br />

ihustmse的专栏 315

VS2013/MFC编程入门之十对话框:向导对话框的创建及显示)

上一讲讲了属性页对话框和相关的两个类CPropertyPage类和CPropertySheet类,对使用属性页对话框做准备。本节将为大家演示如何创建向导对话框。        仍然以前面的“加法计算器”的例子为基础,在其中加入向导对话框,我们可以用它来说明加法计算器的使用方法,一步一步引导用户操作,这也是比较常见的用法。        加法计算器使用时大概可以分为步:输入被加数、输入

赵小咖的博客 5473

MFC编程入门--对话框(1)

在我们常用的软件中大多都有对话框界面,主界面其实就是个对话框。 创建对话框主要分两大步: 第一,创建对话框资源,主要包括创建新的对话框模板、设置对话框属性和为对话框添加各种控件; 第二,生成对话框类,主要包括新建对话框类、添加控件变量和控件的消息处理函数等。 操作步骤(工具VS2013)       1) 创建一个新的项目 2)选择基于对话框 di 3)选择资源视图, 打开Di

oBuYiSeng的博客 784

MFC 最详细入门教程

MFC 入门教程

freeking101的博客 18万+

【第25节】MFC编程MFC入门的第一课

MFC 即 Microsoft Foundation Classes,是微软公司提供的一个类库。它以 C++ 类的形式封装了 Windows API,并且包含了大量的代码来简化 Windows 应用程序的开发过程。借助 MFC,开发人员能够更便捷地创建具有图形用户界面(GUI)的 Windows 应用程序,减少了直接使用 Windows API 进行编程的复杂性和工作量。学习 MFC,C++ 面向对象编程和 Windows SDK 是必备基础。当下,MFC 在客户端界面开发中热度减退。

攻城狮7号的博客 2657

MFC编程入门级教程

MFC (Microsoft Foundation Classes) 是微软公司专门为C++开发者设计的一套应用程序框架和类库。它通过C++类的形式对Windows API进行了高度封装,简化了Windows应用程序的开发过程。MFC提供了一系列预定义的类,这些类对应于Windows编程中的各种基本元素,如窗口、菜单、对话框、控件等,同时也包含了应用程序框架的支持,如文档/视图体系结构、命令路由、消息映射机制等。

new9232的博客 2万+

MFC基于对话框编程

MFC基于对话框编程 目录 基于对话框编程 创建基于对话框MFC 应用程序框架 资源视图 类视图 模态对话框 非模态对话框 对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。 在Visual C++中,对话框既可以单独组成一个简单的应用程序,又可以成为文档/视图结构程序的资源。 创建基于对话框MFC 应用程序框架 程序的创建过程: 选择“文件 | 新建 | 项目”菜单; 在“新建项目”对话框中,选择“ MFC 应用程序 ”,输入工...

baidu_41388533的博客 2929

MFC最详细入门教程[转载]

MFC最详细入门教程,一个非常好的教程,转载记录一下。

XCJandLL的博客 1万+

mfc入门基础()创建对话框

学习

Littlehero_121的博客 4576

C++MFC基于对话框编程——模态(非模态)对话框

C++MFC入门,第一个MFC程序(基于对话框),控件属性,创建类,代码关联ui,模态对话框与非模态对话框,button控件与事件编写

qq_58619891的博客 4015

VS2010/MFC编程入门系列教程

http://www.jizhuomi.com/software/257.html VS2010/MFC编程入门教程之目录和总结        鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC入门学习业已足够。以此教程的知识为基础,学习VS2010/MFC较为深入的内容已非难事。作为本

zy1049677338的博客 3万+

MFC对话框编程详细学习笔记

因最近研究工作要用到MFC,故再次重温了孙鑫老师的MFC对话框编程,因所用的编译软件为VS2008,与视频中孙老师使用的VC++6.0有很大出入,造成很大不便,我通过各方查找,实现了VS2008相对应于VC++6.0的方法。现将对话框编程整个视频的详细内容分享如下,希望对有缘看到的朋友提供方便。笔者水平有限,难免有不足之处,欢迎批评指正。 一.准备工作 1.创建一个MFC Applicatio

Bright_Geek的专栏 5056

MFC对话框获取输入

题目 在MFC调用对话框读入数据,并在客户区输出。 这是《计算机图形学基础教程》的一个习题: 使用MFC设计一个长方形类CRectangle,调用对话框读入长方形的长度和宽度,在客户区输出长方形的周长和面积。 这个书上并没有教怎么用对话框读取输入,我在这之前也完全没接触过MFC对话框。弄了两小时,终于把这道题做出来了。以此文记录一下 参考链接 MFC调用输入对话框并返回输入信息 MFC对话...

乱世之尘 1万+

全面探索Visual C++ MFC编程入门到实践

本文还有配套的精品资源,点击获取 简介:《Visual C++ MFC入门教程》旨在为初学者提供Microsoft Foundation Classes (MFC) 的全面介绍,包括MFC框架概述、VC++开发基础知识、项目创建流程以及Windows API简化使用等。本书详细讲解了MFC架构原理,文档/视图结构,图形界面设计,窗口控件应用,对话框创建和网络编程等关键概念。...

weixin_30765637的博客 1874

MFC对话框编程:从设计到实现的完整示例

MFC(Microsoft Foundation Classes)是一个C++类库,用于开发Windows应用程序。它封装了Windows API,提供了一套面向对象的编程接口,简化了Windows编程MFC图形界面编程主要涉及到窗口、控件、菜单、消息处理等元素的创建和操作。它允许开发者快速构建复杂的用户界面,实现应用程序与用户的交互。

weixin_34374684的博客 1033

MFC程序设计(二)基于对话框编程

向导生成基于对话框MFC应用程序从现在开始,我们将以基于对话框MFC应用程序来讲解MFC应用向导生成基于对话框MFC应用程序对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。在Visual C++中,对话框既可以单独组成一个简单的应用程序,又可以成为文档/视图结构程序的资源。

2301_78838647的博客 2490
上一篇: 二 MFC编程入门之VS2010/MFC应用程序框架
下一篇: 如何处理鼠标离开窗口的消息
vigoss331
博客等级 码龄17年 5粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值