MFC控件篇之对话框中的消息与数据

MFC中复选框Check控件用法 当复选框ComBox控件勾选时做一种算法,不勾选时,做另一种算法,程序如下所示: if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK1)) {       // 勾选 } else { } IDC_CHECK1是CheckBox控件。   函数功能:该函数可以确定某个按钮控制是否有选中标志,或者三态按钮控制是否为灰色的、选中的、或 阅读详情
在对话框中进行消息映射

利用对话框的一个好处是可以利用ClassWizard对对话框中各个控件产生的消息进行映射,ClassWizrd可以列出各种控件可以使用的消息,并能自动产生代码。在本节中我们以一个例子来讲解如何在对话框中对子窗口消息进行映射同时还讲解如何对对话框中的子窗口进行初始化。

首先我们产生编辑好一个对话框,在对话框中使用的控件和ID号如下表: ID 类型
IDC_RADIO_TEST_1 圆形按钮
IDC_RADIO_TEST_2 圆形按钮
IDC_BUTTON_TEST 按钮
IDC_CHECK_TEST 检查按钮
IDC_TREE_TEST 树形控件
IDC_LIST_CTRL List Ctrl
IDC_TAB_CTRL Tab Ctrl
IDC_LIST_TEST 列表框
IDC_COMBO_TEST 组合框
IDC_EDIT_TEST 输入框
首先我们需要在对话框的OnInitDialog()函数中对各个控件进行初始化,这里我们使用CWnd* GetDlgItem( int nID )来通过ID号得到子窗口指针。(类似的函数还有UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) 通过ID号得到子窗口中输入的数字,int GetDlgItemText( int nID, CString& rString ) 通过ID号得到子窗口中输入的文字)。代码如下:

BOOL CMy54_s1Dlg::OnInitDialog()
{
        CDialog::OnInitDialog();
        /*添加初始化代码*/
        //初始化输入框
        ((CEdit*)GetDlgItem(IDC_EDIT_TEST))->SetWindowText("this is a edit box");
        //初始化列表框
        CListBox* pListB=(CListBox*)GetDlgItem(IDC_LIST_TEST);
        pListB->AddString("item 1");
        pListB->AddString("item 2");
        pListB->AddString("item 3");
        //初始化组合框
        CComboBox* pCB=(CComboBox*)GetDlgItem(IDC_COMBO_TEST);
        pCB->AddString("item 1");
        pCB->AddString("item 2");
        pCB->AddString("item 3");
        //初始化Tab Ctrl
        CTabCtrl* pTab=(CTabCtrl*)GetDlgItem(IDC_TAB_TEST);
        pTab->InsertItem(0,"Tab Page1");
        pTab->InsertItem(1,"Tab Page2");
        pTab->InsertItem(2,"Tab Page3");
        //初始化ListCtrl
        CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST_CTRL);
        pList->InsertColumn(0,"Column 1",LVCFMT_LEFT,100);
        pList->InsertItem(0,"Item 1");
        pList->InsertItem(1,"Item 2");
        pList->InsertItem(2,"Item 3");
        //初始化TreeCtrl
        CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE_TEST);
        pTree->InsertItem("Node1",0,0);
        HTREEITEM hNode=pTree->InsertItem("Node2",0,0);
        pTree->InsertItem("Node2-1",0,0,hNode);
        pTree->InsertItem("Node2-2",0,0,hNode);
        pTree->Expand(hNode,TVE_EXPAND);

        return TRUE;  // return TRUE  unless you set the focus to a control
}

接下来我们需要利用ClassWizard对控件所产生的消息进行映射,打开ClassWizard对话框,选中相关控件的ID,在右边的列表中就会显示出可用的消息。如我们对按钮的消息进行映射,在选中按钮ID(IDC_BUTTON_TEST)后,会看到两个消息,一个是BN_CLICKED,一个是BN_DOUBLECLICKED。双击BN_CLICKED后在弹出的对话框中输入函数名,ClassWizard会产生按钮被按的消息映射。

然后我们看看对TabCtrl的TCN_SELCHANGE消息进行映射,在TabCtrl的当前页选择发生改变时这个消息会被发送,所以通过映射该消息可以在当前页改变时及时得到通知。

最后我们对输入框的EN_CHANGE消息进行映射,在输入框中的文本改变后该消息会被发送。相关的代码如下:

//头文件中相关的消息处理函数定义
        afx_msg void OnButtonTest();
        afx_msg void OnSelchangeTabTest(NMHDR* pNMHDR, LRESULT* pResult);
        afx_msg void OnChangeEditTest();
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()

//CPP文件中消息映射代码
        ON_BN_CLICKED(IDC_BUTTON_TEST, OnButtonTest)
        ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_TEST, OnSelchangeTabTest)
        ON_EN_CHANGE(IDC_EDIT_TEST, OnChangeEditTest)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

//消息处理函数
void CMy54_s1Dlg::OnButtonTest()
{
        AfxMessageBox("you pressed a button");
}

void CMy54_s1Dlg::OnSelchangeTabTest(NMHDR* pNMHDR, LRESULT* pResult)
{
        TRACE("Tab Select changed/n");       
        *pResult = 0;
}

void CMy54_s1Dlg::OnChangeEditTest()
{
        TRACE("edit_box text changed/n");       
}

对于其他的控件都可以采取类似的方法进行消息映射。此外如果你对各种控件可以使用的消息不熟悉,你可以通过使用对话框,然后利用ClassWizard产生相关代码的方法来进行学习,你也可以将ClassWizard产生的代码直接拷贝到其他需要的地方(不瞒你说,我最开始就是这样学的 :-D 这也算一个小窍门)。

在对话框中进行数据交换和数据检查

MFC提供两种方法在对话框中进行数据交换和数据检查(Dialog data exchange/Dialog data validation),数据交换和数据检查的思想是将某一变量和对话框中的一个子窗口进行关联,然后通过调用BOOL UpdateData( BOOL bSaveAndValidate = TRUE )来指示MFC将变量中数据放入子窗口还是将子窗口中数据取到变量中并进行合法性检查。

在进行数据交换时一个子窗口可以和两种类型的变量相关联,一种是控件(Control)对象,比如说按钮子窗口可以和一个CButton对象相关联,这种情况下你可以通过该对象直接控制子窗口,而不需要象上节中讲的一样使用GetDlgItem(IDC_CONTROL_ID)来得到窗口指针;一种是内容对象,比如说输入框可以和一个CString对象关联,也可以和一个UINT类型变量关联,这种情况下你可以直接设置/获取窗口中的输入内容。

而数据检查是在一个子窗口和一个内容对象相关联时在存取内容时对内容进行合法性检查,比如说当一个输入框和一个CString对象关联时,你可以设置检查CString的对象的最长/最小长度,当输入框和一个UINT变量相关联时你可以设置检查UINT变量的最大/最小值。在BOOL UpdateData( BOOL bSaveAndValidate = TRUE )被调用后,合法性检查会自动进行,如果无法通过检查MFC会弹出消息框进行提示,并返回FALSE。

设置DDX/DDV在VC中非常简单,ClassWizard可以替你完成所有的工作,你只需要打开ClassWizard并选中Member Variables页,你可以看到所有可以进行关联的子窗口ID列表,双击一个ID会弹出一个添加变量的对话框,填写相关的信息后按下确定按钮就可以了。然后选中你刚才添加的变量在底部的输入框中输入检查条件,

下面我们看一个例子,对话框上的子窗口设置,各子窗口的ID和关联的变量如下表: ID 关联的变量 作用
IDC_CHECK_TEST BOOL m_fCheck 检查框是否被选中
IDC_RADOI_TEST_1 int m_iSel 当前选择的圆形按钮的索引
IDC_COMBO_TEST CString m_szCombo 组合框中选中的文本或是输入的文本
IDC_EDIT_TEST CString m_szEdit 输入框中输入的文本,最大长度为5
IDC_LIST_TEST CListBox m_lbTest 列表框对象
这时候ClassWizard会自动生成变量定义和相关代码,在对话框的构造函数中可以对变量的初始值进行设置,此外在BOOL CDialog::OnInitDialog()中会调用UpdateData(FALSE),即会将变量中的数据放入窗口中 。相关代码如下:

//头文件中的变量定义,ClassWizard自动产生
// Dialog Data
        //{{AFX_DATA(CMy55_s1Dlg)
        enum { IDD = IDD_MY55_S1_DIALOG };
        CListBox        m_lbTest;
        int                m_iSel;
        CString        m_szEdit;
        CString        m_szCombo;
        BOOL        m_fCheck;
        //}}AFX_DATA
//构造函数中赋初值
CMy55_s1Dlg::CMy55_s1Dlg(CWnd* pParent /*=NULL*/)
        : CDialog(CMy55_s1Dlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CMy55_s1Dlg)
        m_iSel = -1;
        m_szEdit = _T("");
        m_szCombo = _T("");
        m_fCheck = FALSE;
        //}}AFX_DATA_INIT
.....
}
//ClassWizard产生的关联和检查代码
void CMy55_s1DlgDoDataExchange(CDataExchange* pDX)
{
        CDialogDoDataExchange(pDX);
        //{{AFX_DATA_MAP(CMy55_s1Dlg)
        DDX_Control(pDX, IDC_LIST_TEST, m_lbTest);
        DDX_Radio(pDX, IDC_RADIO_TEST_1, m_iSel);
        DDX_Text(pDX, IDC_EDIT_TEST, m_szEdit);
        DDV_MaxChars(pDX, m_szEdit, 5);
        DDX_CBString(pDX, IDC_COMBO_TEST, m_szCombo);
        DDX_Check(pDX, IDC_CHECK_TEST, m_fCheck);
        //}}AFX_DATA_MAP
}
//在OnInitDialog中利用已经关联过的变量m_lbTest
BOOL CMy55_s1Dlg::OnInitDialog()
{
        CDialog::OnInitDialog();
...       
        // TODO: Add extra initialization here
        //设置列表框中数据
        m_lbTest.AddString("String 1");
        m_lbTest.AddString("String 2");
        m_lbTest.AddString("String 3");
        m_lbTest.AddString("String 4");
        return TRUE;  // return TRUE  unless you set the focus to a control
}
//对两个按钮消息处理
//通过UpdateData(TRUE)得到窗口中数据
void CMy55_s1Dlg::OnGet()
{
        if(UpdateData(TRUE))
        {
                //数据合法性检查通过,可以使用变量中存放的数据
                CString szOut;
                szOut.Format("radio =%d /ncheck is %d/nedit input is %
s/ncomboBox input is %s/n",
                                                m_iSel,m_fCheck,m_szEdit,m_szCombo);
                AfxMessageBox(szOut);
        }
        //else 未通过检查
}
//通过UpdateData(FALSE)将数据放入窗口
void CMy55_s1Dlg::OnPut()
{
        m_szEdit="onPut test";
        m_szCombo="onPut test";
        UpdateData(FALSE);
}       


在上面的例子中我们看到利用DDX/DDV和UpdateData(BOOL)调用我们可以很方便的存取数据,而且也可以同时进行合法性检查。
 
VS2019/MFC对话框系列:如何为控件添加消息处理函数 创建对话框类和添加控件变量在上一讲中已经讲过,这一讲的主要内容是如何为控件添加消息处理函数。 MFC为对话框和控件等定义了诸多消息,我们对它们操作时会触发消息,这些消息最终由消息处理函数处理。比如我们点击按钮时就会产生BN_CLICKED消息,修改编辑框内容时会产生EN_CHANGE消息等。一般为了让某种操作达到效果,我们只需要实现某个消息的消息处理函数。当功能实现了想要拥有美观的界面可以借助Toolkit Pro进行界面优化。 Xtreme Toolkit Pro:是屡获殊荣的VC界面库,是MFC开发 阅读详情

相关推荐

MFC对话框程序中列表控件(CListCtrl)的响应消息

缩写 注解 HDN Header Notify LVN ListView control Notify NM Notify Message TVN TreeView control Notify 响应消息 解析 HDN_BEGINTRACK 开始拖动控件顶部的分割线 HDN_BEGINDRAG 开始拖动控件顶部的分栏(item) HDN_BE...

亲亲Friends的博客 3278

MFC checkbox使用方法

MFC中复选框checkbox控件,至少有三种方法对其进行操作,他们是利用Cbutton成员函数GetCheck和SetCheck,第二种是利用CWnd成员函数IsDlgButtonChecked,最后就是把checkbox复选框控件与BOOL型变量相关联。 一、用CButton成员函数 MFC中复选框CheckBox的基类是CButton。那么就可以用GetDlgItem来获取复选框的指针,

dearmango 1万+

开发基于MFC的ActiveX控件的时候的一些消息处理

MFC有PreTranslageMessage() 可以处理一些基于MFC的消息处理。 可是有时候如果你开发一个基于MFC的ActiveX作为容器,内部实现是Win32 或者其他框架会发现,好多消息都不能正常收到。 除非把你现有的内部的控件基于各种MFC的基类实现(会重载各种MFC的PreTranslateMessage)才能收到各种消息。 根本原因是基于MFC的ActiveX控件没有自己的

sesiria的博客 2918

WTL DDX详解

WTL 方式 - 对话框数据交换(DDX) WTL的DDX(对话框数据交换)很像MFC,可以使用很简单的方法将变量和控件关联起来。首先,和前面的例子一样你需要从CWindowImpl派生一个新类,这次我们使用一个新类CEditImpl,因为这次我们使用得是Edit控件。你还需要将#include atlddx.h 添加到stdafx.h中,这样就可以使用DDX代码。 要使主对话框支持D

yuan_hs_hf的专栏 2408

MFC—消息对话框

消息对话框是Windows系统中最常用最简单的一类对话框,假如我们所遇到的提示我们有异常发生或提出询问,都是消息对话框。 MFC提供了两个函数可以直接生成指定风格的消息对话框,这两个函数就是CWnd类的成员函数MessageBox()和全局函数AfxMessageBox()。 1.CWnd::MessageBox()函数        CWnd::MessageBox()的函数原

BeingLucky的博客 1572

【05】MFC入门到精通——MFC 为对话框中的控件添加变量 和 数据交换和检验

本文介绍了为对话框控件添加变量并实现数据交换的步骤:首先通过右键菜单为编辑框控件添加double类型的成员变量(如m_editSummand),这些变量会在Dlg.h头文件和Dlg.cpp初始化函数中自动生成。MFC通过DoDataExchange()函数实现控件与变量之间的数据交换,该函数包含DDX_Text调用语句。数据交换需手动调用UpdateData()函数完成,其参数TRUE表示从控件传值到变量,FALSE则相反。整个过程建立了对话框控件与成员变量的双向数据绑定机制,为后续的消息处理奠定了基础。

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

MFC中的DDX和DDV

DDX:Dialog Data Exchange     如果使用DDX机制,一般会在OnInitDialog消息处理函数或Dialog构造函数中,为对话框对象的成员变量设置了初始值。在对话框显示前,框架的DDX机制将成员变量的值传给对话框中的控件,当调用DoModal或Create函数,对话框即将显示时,这些值也就显示在相应的控件上。     CDialog类的成员函数OnInitDial

机器视觉之家 1562

深入理解MFC对话框与控件的源代码实践

创建自定义对话框类的基本步骤如下:定义类:首先,在项目中定义一个新的C++类,并使其继承自CDialog类。添加控件:使用资源编辑器或代码添加所需的控件,并为每个控件设置合适的ID。实现消息处理函数:为对话框中的控件编写消息处理函数。这通常通过在类中重载虚函数或者处理消息映射宏来完成。初始化对话框:实现OnInitDialog()函数来执行对话框初始化时需要的操作,如设置控件的初始值。数据交换与验证。

weixin_42361478的博客 1089

MFC 复选框选中和是否被选中判断

  MFC中复选框Checkbox控件,查找到有四种方法可对其进行操作。 1,利用CButton成员函数GetCheck和SetCheck。   2,利用CWnd成员函数IsDlgButtonChecked。   3,把CheckBox复选框控件与Value类别BOOL型变量相关联。   4,把CheckBox复选框控件与Control类别CButton类型变量相关联。 ...

爬行的菜鸟的博客 6276

AM243x多核MCU启动流程解析与OSPI Flash烧录实战

嵌入式系统开发中,引导加载器是芯片上电后执行的第一段软件,负责初始化硬件、加载操作系统或应用程序。其工作原理通常遵循多级引导链,从ROM固件到用户可定制的二级引导程序,逐级建立完整的软件运行环境。这一机制的技术价值在于实现可靠的系统启动、支持安全校验,并为多核异构架构提供协同基础。在应用场景上,引导加载器广泛应用于工业控制、汽车电子和物联网设备,确保设备能从非易失性存储器中自主启动。本文聚焦于TI AM243x这类高性能多核MCU,深入剖析其包含RBL和SBL在内的三级启动流程,并详细演示如何通过UART接

weixin_28703451的博客 582

【论文笔记】Reaching agreement in the presence of faults (EIG)

1 问题定义 2 交互一致性 3 单点故障 m=1 n=4 4 多点故障(n>=3m+1) 计算过程 m=2 n=7 5 n<3m+1不能达成协定 6 带认证的算法 7 总结 这篇论文在1980年发表,是1982年著名的拜占庭将军问题论文的前身。作者Leslie Lamport是2013图灵奖得主,两篇论文引用次数分别为5000+和2000+。该论文提出的算法现在被...

zjwreal 2994

如何创建与使用MFC对话框工程

详细的MFC 对话窗的创建与使用介绍

everything is possible,anything is OK. 9920

机械臂控制的基础知识

在现代工业中,机械臂的自动化控制已经成为智能制造的重要一环。控制机械臂涉及多个学科,包括机械设计、运动学、控制理论和编程等。本文将从以下几个方面介绍机械臂控制的核心知识点:机械臂的构成、运动学分析、动力学建模、控制方法及编程实现。

qq_45728381的博客 5470

MFC基础:控件

文章目录 Windows程序分类:EXE的可执行程序、DLL的动态链接库程序、LIB静态链接库程序、SYS的驱动类型程序 EXE的可执行程序分类:小黑屏的控制台程序、非控制台程序(大多数是带界面的程序) Windows API:Windows操作系统应用程序接口 Linux API:Linux操作系统应用程序接口 C/C++语言:虽然能够开发软件,但是只能开发一些简单的小黑屏的应用程序:C/C++程序也调用很多的系统函数、变量或对象:例如printf、cout等等,但是这里的系统指的是编译系统,而非操作系

MOOG007的博客 2860

STM32 BootLoader 入门教程:从原理到 APP 跳转实现

在 STM32 项目开发中,BootLoader 通常用于实现固件升级、程序引导和应用程序校验。本文从最基础的 BootLoader 原理开始,讲解 STM32 内部 Flash 分区设计、APP 地址偏移、向量表重定位、BootLoader 跳转 APP 的核心代码,以及实际开发中常见的问题。本文适合刚开始接触 STM32 BootLoader、IAP 在线升级、串口升级、OTA 升级的开发者阅读。

lidecong133的博客 1668

Apollo Planning决策规划算法代码详细解析 (2):Scenario执行

上一章节讲Scenario的决策逻辑,当确认当前Scenario后,本章节继续深入讲解在代码中,Scenario的执行过程。Scenario的Process()函数根据配置文件顺序执行stage,并判断目前处于哪个stage。当确认好stage后调用该stage对应的Process()函数,来进行具体的规划任务。 码字不易,喜欢的朋友们麻烦点个关注与赞。 在本文你将学到下面这些内容: Scenario的Process()函数的作用于调用方式; Scenario对象的初始化方法; 如何给每个Scen

自动驾驶Player的博客 5609

MFC对话框初始化函数是在哪里?以及如何为MFC的EDIT控件设置默认显示值?

问:对话框初始化函数是哪个? 如果做基于对话框的,会有一个初始化函数OnInitDialog

芒果布丁00的博客 1万+

踩坑2周总结:Python+YOLO26搭建工业级多路视频分析应用,从单路卡顿到16路4K稳跑30FPS

本文分享了工业级多路视频分析系统的实战经验,针对智慧物流园区的车辆违停和人员安全监测需求,提出了一套完整的解决方案。作者通过踩坑实践,总结出多路视频分析的四大核心痛点:视频流解码瓶颈、推理调度混乱、内存占用爆炸和部署兼容性差。 文章详细介绍了技术选型方案,推荐使用FFmpeg+PyAV进行硬件加速解码、YOLO26+TensorRT INT8量化推理、单进程多线程的生产者-消费者架构,以及内存池复用等技术组合。该方案在RTX 4070 Ti上实现了16路4K视频30FPS稳定运行,GPU利用率达85%以上,

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 955

MFC 对话框

MFC 对话框,模态和非模态,动态创建按钮,控件访问等等

qq_61553520的博客 4105

裂缝二维检测:裂缝的长度和宽度检测

这一节,我们需要去整合一下前面的代码,在进行长度和宽度的测量时,需要裂缝的类型、个数、面积的帮助。这一章是本专栏的核心部分。以上代码我均试过,由于本人能力有限,看不懂代码,最终还是没有采用,使用的是最普通检测宽度的方法,即求得骨架总长度后,用总面积求取平均宽度。

m0_62919535的博客 4240

智能车图像处理22-进阶篇14--小s的判断

这篇文章中主要讲述智能车图像处理中 : 小s的判断方法。

taiyuezyh的博客 2568

MFC对话框分割条拖动控件的实现

本文介绍了在MFC中如何利用分割条动态拖动控件

_Santiago的博客 2460

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MFC-对话框与数据交换

       对话框是非常重要的一种窗体,就我看过的应用,除了MDI程序,对话框比文档视图框架用得更多。原因大概有两个,首先对话框可以利用资源编辑器来编辑,这就有了一点快速开发的感觉,尽管比真正的快速开发弱得多;其次,对话框提供一种叫数据交换的方法,让控件与某种数据类型关联起来,比如Edit控件与CString变量关联,对CString变量的操作间接映射到Edit控件,这种方便性是不言而喻的。

colin 7260

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【MFC】学习笔记:对话框中添加控件和控件变量

MFC系列一直被搁置,找不到时间来写学习笔记。今天就先写一篇很基础的对话框里加控件与给控件设置控件变量。 本节不同于其他文章,直接用案例来感受对话框中添加控件和控件变量的理论概述. 创建对话框与修改对话框这里我就不说了,前面写过一篇:MFC学习笔记:创建与修改对话框不知道怎么创建的请跳转上一篇。 - 案例讲解 1.按照创建对话框的步骤创建一个标题为Calculators的基于对话框的工程. 2.切换到资源视图,如果没有,请点击视图->其他窗口->资源视图,就设置出来了。 3.删除掉Calcu.

Cain Xcy的博客 4560

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: MFC控件篇之对话框
下一篇: MFC控件篇之属性对话框
JamesXing
博客等级 码龄20年 30粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值