`
isiqi
  • 浏览: 16487193 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
在对话框中进行消息映射

利用对话框的一个好处是可以利用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 TRUEunless 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 TRUEunless 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)调用我们可以很方便的存取数据,而且也可以同时进行合法性检查。
分享到:
评论

相关推荐

    MFC中加载duilib对话框;duilib界面中添加MFC控件示例代码。2222

    3. **同步数据**:如果需要在Duilib控件和MFC控件之间共享数据,可以使用数据成员或者消息机制来同步两者的状态。 在提供的压缩包文件"DlbTest"中,可能包含了一个MFC与Duilib结合的示例项目,你可以通过查看源码...

    MFC实现嵌入式对话框,显示子对话框到主对话框中的对应位置

    在MFC中,我们可以通过继承`CDialog`类来创建自定义对话框,并将其作为控件添加到主对话框上。 1. 创建子对话框类: - 创建一个新的派生自`CDialog`的类,例如`CInnerDialog`。 - 在类中定义对话框资源,并在IDD_...

    使控件与对话框同步大小变化

    4. **CDataExchange类**:MFC的CDataExchange类提供了一种机制,用于在对话框初始化和退出时交换数据,但它也可以用来在OnSize函数中更新控件的位置。通过使用DDX_Control宏,你可以轻松地获取控件的新大小并作出...

    MFC实现多个对话框

    本篇将详细介绍如何使用MFC来实现多个对话框,并通过实际的代码示例进行解析。 首先,我们需要理解MFC中的对话框类,主要是CDialog派生类。对话框通常由资源编辑器创建,包含各种控件如按钮、文本框、复选框等。在...

    在VS2013上的MFC树控件操作(连接对话框)

    对话框(Dialog)是MFC应用程序中用于与用户交互的窗口,通常包含各种控件,如按钮、文本框和树控件等。本教程将重点讲解如何在对话框中操作MFC树控件,并解决子节点字符串重复时添加不同对话框的问题。 1. **MFC树...

    MFC做的基于对话框的密码登录

    MFC中的对话框是应用程序与用户交互的重要方式,通常以模态或非模态的形式出现。模态对话框在用户关闭之前阻止了其他操作,而非模态对话框允许用户在与对话框交互的同时进行其他操作。在这个项目中,我们使用的应该...

    MFC中全屏显示对话框

    本篇将详细探讨如何实现MFC中的全屏对话框,并通过提供的源代码进行深入理解。 首先,我们来了解MFC对话框的基本概念。MFC中的对话框(CDialog类)是基于Windows API的对话框窗口的抽象,用于与用户交互。对话框...

    MFC树形控件子对话框

    在这个例子中,我们关注的是MFC中的树形控件(CTreeCtrl)和子对话框(CDialog)的使用。这两个组件在用户界面设计中非常常见,用于提供层次化的数据展示和交互式对话。 首先,让我们详细了解一下MFC树形控件...

    MFC.rar_MFC 对话框_MFC 对话框 交互_对话框

    MFC对话框是MFC库中的关键组件,用于实现用户与应用程序之间的交互。对话框通常包含一组控件,如文本框、按钮、复选框等,用户通过这些控件输入信息或执行特定操作。 对话框在MFC中分为两种类型:模态对话框(Modal...

    MFC模态 非模态对话框 ARX2008+VS2005

    在MFC中,对话框数据的获取和设置通常通过`DoDataExchange()`函数完成,该函数负责在对话框控件与成员变量之间交换数据。数据验证可以在`OnInitDialog()`中或自定义的验证函数中进行,以确保用户输入的有效性。 6. ...

    mfc.rar_MFC word_对话框_对话框控件

    3. 在对话框类中,使用`DDX`(对话框数据交换)和`DDV`(对话框数据验证)宏来处理控件和成员变量之间的数据交换。 4. 实现对话框的`OnInitDialog()`函数,进行初始化设置。 5. 处理对话框的ON_BN_CLICKED等消息,...

    在ObjectARX中使用MFC-标签式对话框 项目源代码

    5. 对话框数据交换:利用MFC的DDX(Dialog Data Exchange)和DDV(Dialog Data Validation)机制,可以方便地在对话框控件和类成员变量之间交换数据,确保用户输入的合法性。 6. 实现命令:如果你的应用需要响应...

    MFC对话框和控件源代码

    在Microsoft Foundation Classes (MFC)库中,对话框和控件是构建用户界面的重要组成部分。MFC是一个C++类库,它为Windows API提供了一层抽象,使得开发Windows应用程序更加方便。下面,我们将深入探讨MFC对话框和...

    MFC+对话框嵌套对话框

    本篇文章将详细探讨如何在MFC中实现对话框的嵌套。 首先,我们要明白对话框在MFC中的实现方式。对话框通常由一个继承自`CDialog`类的自定义类来创建。这个自定义类包含了对话框的逻辑、数据成员和控件成员变量。...

    VS2010+MFC 模态对话框、非模态对话框的显示与打开以及对话框的之间的数据传递

    在本文中,我们将深入探讨如何在VS2010中使用MFC实现模态对话框(Modal Dialog)和非模态对话框(Modeless Dialog)的显示与打开,以及它们之间的数据传递。 首先,模态对话框是一种阻止用户与应用程序其他部分交互...

    MFC中的组合对话框程序

    在Microsoft Foundation Classes (MFC)库中,组合对话框(Combination Dialog)是一种特殊的对话框,它结合了多种控件,以提供用户友好的界面。在这个特定的程序中,我们关注的是组合框(ComboBox)和二叉树控件...

    VC++之MFC类库中文手册(含MFC控件使用手册)

    **VC++ MFC类库中文手册与MFC控件使用手册概述** MFC,全称为Microsoft Foundation Classes,是微软提供的一套C++类库,它为Windows应用程序开发提供了丰富的接口和功能。MFC构建在Windows API之上,为开发者提供了...

    MFC学习之模式对话框

    在Microsoft Foundation Classes (MFC)库中,模式对话框(Modal Dialog Box)是一种常见的用户界面元素,用于与用户进行交互并获取输入。模式对话框在显示时会阻塞父窗口的用户界面,直到用户完成对话框操作并关闭它...

    MFC保存控件数据到xml及读取xml数据到控件

    - 遍历XML文档中的元素,根据元素的ID找到对应的MFC控件。然后,根据元素的属性更新控件的状态。例如,如果找到一个表示EDIT控件的元素,使用SetWindowText()函数设置其文本;对于按钮,使用SetCheck()函数改变其...

    实现MFC对话框应用 基础控件

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC)库来实现一个基于对话框的应用程序,并且重点介绍如何操作和使用基本的对话框控件。MFC是微软为Windows应用程序开发提供的一种C++类库,它封装了...

Global site tag (gtag.js) - Google Analytics