好文档 - 专业文书写作范文服务资料分享网站

Visual_C++MFC入门教程(免费版)

天下 分享 时间: 加入收藏 我要投稿 点赞

木有页眉

你可以看到所有可以进行关联的子窗口ID列表,双击一个ID会弹出一个添加变量的对话框,如图,

填写相关的信息后按下确定按钮就可以了。

然后选中你刚才添加的变量在底部的输入框中输入检查条件,如图。

66

木有页眉

下面我们看一个例子,对话框上的子窗口如图

设置,各子窗口的ID和关联的变量如下表: ID IDC_CHECK_TEST IDC_RADOI_TEST_1 IDC_COMBO_TEST IDC_EDIT_TEST IDC_LIST_TEST 关联的变量 BOOL m_fCheck int m_iSel CString m_szCombo CString m_szEdit CListBox m_lbTest 作用 检查框是否被选中 当前选择的圆形按钮的索引 组合框中选中的文本或是输入的文本 输入框中输入的文本,最大长度为5 列表框对象 这时候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*/)

67

木有页眉

: 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_s1Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(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(\ m_lbTest.AddString(\ m_lbTest.AddString(\ m_lbTest.AddString(\ 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(\ %s\\ncomboBox input is %s\\n\

68

木有页眉

m_iSel,m_fCheck,m_szEdit,m_szCombo); AfxMessageBox(szOut); } //else 未通过检查 }

//通过UpdateData(FALSE)将数据放入窗口 void CMy55_s1Dlg::OnPut() { m_szEdit=\ m_szCombo=\ UpdateData(FALSE); }

在上面的例子中我们看到利用DDX/DDV和UpdateData(BOOL)调用我们可以很方便的存取数据,而且也可以同时进行合法性检查。下载例子代码

5.6 使用属性对话框

属性对话框不同于普通对话框的是它能同时提供多个选项页,而每页都可以由资源编辑器以编辑对话框的方式进行编辑,这样给界面开发带来了方便。同时使用上也遵守普通对话框的规则,所以学习起来很方便。属性对话框由两部分构成:多个属性页(CPropertyPage)和属性对话框(CPropertySheet)。

首先需要编辑属性页,在资源编辑器中选择插入,并且选择属性对话框后就可以插入一个属性页,如图,

或者选择插入一个对话框,然后将其属性中的Style设置为Child,Border设置为Thin也可以,如图。

然后根据这个对话框资源生成一个新类,在选择基类时选择CPropertyPage,ClassWizard会自动生成相关的代码。

69

木有页眉

而对于CPropertySheet也需要生成新类,并且将所有需要加入的属性页对象都作为成员变量。属性对话框也分为有模式和无模式两种,有模式属性对话框使用DoModal()创建,无模式属性对话框使用Create()创建。下面的代码演示了如何创建属性对话框并添加属性页: //修改CPropertySheet派生类的构造函数为如下形式 CSheet::CSheet() :CPropertySheet(\{ m_page1.Construct(IDD_PAGE_1); m_page2.Construct(IDD_PAGE_2); AddPage(&m_page1); AddPage(&m_page2); }

//创建有模式属性对话框 void CMy56_s1Dlg::OnMod() { CSheet sheet; sheet.DoModal(); }

//创建无模式属性对话框 void CMy56_s1Dlg::OnUnm() { CSheet *sheet=new CSheet; sheet->Create(); }

对于属性对话框可以使用下面的一些成员函数:

? ? ? ?

CPropertyPage* CPropertySheet::GetActivePage( )得到当前活动页的指针。 BOOL CPropertySheet::SetActivePage( int nPage )用于设置当前活动页。 int CPropertySheet::GetPageCount()用于得到当前页总数。 void CPropertySheet::RemovePage( int nPage )用于删除一页。

而对于属性页来将主要通过重载一些函数来达到控制的目的:

? ? ? ?

void CPropertyPage::OnOK() 在属性对话框上按下“确定”按钮后被调用 void CPropertyPage::OnCancel() 在属性对话框上按下“取消”按钮后被调用 void CPropertyPage::OnApply() 在属性对话框上按下“应用”按钮后被调用

void CPropertyPage::SetModified( BOOL bChanged = TRUE ) 设置当前页面上的数据被修改标记,这个调用可以使“应用”按钮为允许状态。

此外利用属性对话框你可以生成向导对话框,向导对话框同样拥有多个属性页,但同时只有一页被显示,而且对话框上显示的按钮为“上一步”,“下一步”/“完成”,向导对话框会按照你添加页面的顺序依次显示所有的页。在显示属性对话框前你需要调用void CPropertySheet::SetWizardMode()。使用向导对话框时需要对属性页的BOOL CPropertyPage::OnSetActive( )进行重载,并在其中调用void

CPropertySheet::SetWizardButtons( DWORD dwFlags )来设置向导对话框上显示的按钮。dwFlags的取值可为以下值的“或”操作:

70

Visual_C++MFC入门教程(免费版)

木有页眉你可以看到所有可以进行关联的子窗口ID列表,双击一个ID会弹出一个添加变量的对话框,如图,填写相关的信息后按下确定按钮就可以了。然后选中你刚才添加的变量在底部的输入框中输入检查条件,如图。66木有页眉下面我们看一个例子,对话框上的子窗口如图<
推荐度:
点击下载文档文档为doc格式
5sv4n9qpyw5s23r4ajle
领取福利

微信扫码领取福利

微信扫码分享