精华内容
下载资源
问答
  • MFC创建属性对话框(1)

    千次阅读 2016-05-21 15:05:23
    创建属性页常用的两个类是CPropertyPage类和CPropertySheet类,CPropertyPage类表示单个属性页面,后者表示整体属性对话框;大家可以MSDN详细了解这两个类; 二:创建向导对话框 1:首先创建一个

    一:属性页对话框

    属性页对话框包括一般属性页对话框和向导对话框;共同特点是集多个对话框于一身,一般属性页对话框通过标签来回切换,而向导对话框通过按钮来回切换;

    创建属性页常用的两个类是CPropertyPage类和CPropertySheet类,CPropertyPage类表示单个属性页面,后者表示整体属性对话框;大家可以在MSDN中详细了解这两个类;

    二:创建向导对话框

    1:首先创建一个基于对话框的MFC程序,在资源里insert三个对话框表示属性页面,但是对话框的属性要重新设置:style为child类型,border为thin类型;
         这里介绍一下三种dialog style类型:
    child 类型:子窗口,子窗口只能出现在另一个窗口之中,子窗口多余的部分会被裁剪;而且子窗口不能含有菜单栏;
    popup类型:弹出式窗口,通常以对话框和消息框的形式与用户对话;可以没有标题栏;
    overlapped类型,重叠式窗口,通常用于应用程序主窗口;

        border类型为边界类型;none;thin;resizing和dialog frame,一般都用dialog frame;

     2:然后给每一个对话框添加一个类,基类是CPropertyPage;CPage_1;CPage_2;CPage_3,添加完类之后,重写OnSetActive()函数
    BOOL CPage_1::OnSetActive()
    {
    	// TODO: 在此添加专用代码和/或调用基类
    	CPropertySheet* psheet = (CPropertySheet*)GetParent();  //得到父类窗口的指针;
    	psheet->SetWizardButtons(PSWIZB_NEXT);                   //有一个下一步按钮;
    	return CPropertyPage::OnSetActive();
    }
    BOOL CPage_2::OnSetActive()
    {
    	// TODO: 在此添加专用代码和/或调用基类
    	CPropertySheet* psheet = (CPropertySheet*)GetParent();
    
    	psheet->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT);      //有上一步和下一步按钮;
    	return CPropertyPage::OnSetActive();
    }
    BOOL CPage_3::OnSetActive()
    {
    	// TODO: 在此添加专用代码和/或调用基类
    	CPropertySheet* psheet = (CPropertySheet*)GetParent();
    	psheet->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);       //上一步和完成按钮
    	return CPropertyPage::OnSetActive();
    }

    3:有了三个属性页面之后,还需要一个属性表来包含他们,即需要在类视图中添加一个继承CPropertySheet的类CProSheet;同时需要包含三个属性页的头文件,创建三个属性页对象;
    #pragma once
    #include"Page_1.h"
    #include"Page_2.h"
    #include"Page_3.h"
    // CProSheet
    class CProSheet : public CPropertySheet
    {
    	DECLARE_DYNAMIC(CProSheet)
    
    public:
    	CProSheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    	CProSheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    	virtual ~CProSheet();
    
    protected:
    	DECLARE_MESSAGE_MAP()
    public:
    	CPage_1 page_1;     //创建三个属性页对象;
    	CPage_2 page_2;
    	CPage_3 page_3;
    };
    

    4:在CProSheet的构造函数中初始化属性表单,把三个属性页面添加到属性表单;
    CProSheet::CProSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
    	:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
    {
    	AddPage(&page_1);
    	AddPage(&page_2);
    	AddPage(&page_3);
    }
    
    CProSheet::CProSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
    	:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
    {
    	AddPage(&page_1);
    	AddPage(&page_2);
    	AddPage(&page_3);
    }
    5:最后,在button上添加消息响应函数;单击该button时就会弹出该属性表;
    void CProPageDlg::OnBnClickedPage()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	CProSheet sheet(_T(""));
    	sheet.SetWizardMode();                       //以向导的形式显示;
    	sheet.DoModal();
    }





    展开全文
  • 常用对话框:属性对话框()

    千次阅读 2014-12-08 06:56:37
    仍然以前面的“加法计算器”的例子为基础,其中加入向导对话框,我们可以用它来说明加法计算器的使用方法,一步一步引导用户操作,这也是比较常见的用法。  加法计算器使用时大概可以分为三步:输入被加数、输入...

    仍然以前面的“加法计算器”的例子为基础,在其中加入向导对话框,我们可以用它来说明加法计算器的使用方法,一步一步引导用户操作,这也是比较常见的用法。

           加法计算器使用时大概可以分为三步:输入被加数、输入加数、点“计算”按钮。

           鸡啄米就详细说明向导对话框的创建步骤:

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

           根据创建对话框模板和修改对话框属性中所讲方法,在“Resource View”的Dialog”节点上点右键,然后在右键菜单中选择“Insert Dialog”创建第一个对话框模板,对话框的ID属性设置为IDD_SUMMAND_PAGE,Caption属性改为“被加数页”,Style属性在下拉列表中选择“Child”,Border属性在下拉列表中选择“Thin”。

           删除“OK”和“Cancel”按钮,再按照为对话框添加控件中所讲方法,添加一个静态文本框,并修改静态文本框的Caption属性为“请先输入double型被加数”。

           按照上述步骤,继续添加第二个和第三个对话框资源。第二个对话框模板的ID设为IDD_ADDEND_PAGE,Caption属性改为“加数页”,也添加一个静态文本框,Caption设为“请继续输入double型加数”,其他属性同第一个对话框。第三个对话框模板的ID设为IDD_ADD_PAGE,Caption属性改为“计算页”,添加静态文本框的Caption属性改为“最后请按下“计算”按钮”,其他属性也第一个对话框一样。

           2.创建属性页类

           按照创建对话框类和添加控件变量中的方法,在第一个对话框模板上点右键,在右键菜单中选择“Add Class”,弹出类向导对话框,在“Class name”编辑框中输入类名“CSummandPage”,与之前不同的是,因为属性页类都应继承于CPropertyPage类,所以要修改下面“Base class”的选项,在下拉列表中选择“CPropertyPage”。

           因为是第一个属性页,所以它应该有一个“下一步”按钮,在哪里添加呢?上一讲CPropertyPage类的可重载函数中提到,OnSetActive函数用于处理属性页被切换为当前活动页的消息,所以我们可以在OnSetActive函数中进行相关设置。

           那怎样重载OnSetActive函数呢?我们可以在“Class View”中找到“CSummandPage”节点,点右键弹出右键菜单,选择“Properties”,然后VS2010右侧面板上会显示对话框的属性列表,属性列表的工具栏上有个tip信息为“Overrides”的按钮,按下它,下方列表中就列出了重载函数,找到“OnSetActive”,点其右侧空白列表项出现向下箭头,再点箭头就在下面出现了“<Add>OnSetActive”的选项,选择它就会自动在CSummandPage类中添加函数OnSetActive。

     

           我们只需在OnSetActive函数体中添加相关代码就可以实现添加“下一步”按钮的效果了。新的函数体如下:

    C++代码
    1. BOOL CSummandPage::OnSetActive()   
    2. {   
    3.     // TODO: Add your specialized code here and/or call the base class   
    4.   
    5.     // 获得父窗口,即属性表CPropertySheet类   
    6.     CPropertySheet* psheet = (CPropertySheet*) GetParent();   
    7.     // 设置属性表只有“下一步”按钮   
    8.     psheet->SetWizardButtons(PSWIZB_NEXT);   
    9.   
    10.     return CPropertyPage::OnSetActive();   
    11. }  

           为第二个和第三个对话框也分别添加属性页类CAddendPage和CAddPage。但第二个对话框的属性页不需要重载OnSetActive函数。第三个对话框是最后一个对话框,所以不需要“下一步”按钮,而应该换成“完成”按钮,所以也需要重载OnSetActive函数设置“完成”按钮。重载后的OnSetActive如下:

    C++代码
    1. BOOL CAddPage::OnSetActive()   
    2. {   
    3.     // TODO: Add your specialized code here and/or call the base class   
    4.   
    5.     // 获得父窗口,即属性表CPropertySheet类   
    6.     CPropertySheet* psheet = (CPropertySheet*) GetParent();   
    7.     //设置属性表只有“完成”按钮   
    8.     psheet->SetFinishText(_T("完成"));   
    9.   
    10.     return CPropertyPage::OnSetActive();   
    11. }  

           上面的代码段中,字符串“完成”前加了个_T,这是因为本工程创建的时候用的默认的Unicode字符集,而如果“完成”前不加_T就是ASCII字符串。_T实际上是一个宏,工程的字符集选择为Unicode时字符串就转为Unicode字符串,选择为Muli-Byte时就转为ASCII字符串。我们可以在Solution Explorer的Addition根节点上点右键,在右键菜单上选择“Properties”,弹出工程的属性对话框,Configuration Properties->General右侧列表中的Character Set就显示选择的字符集。

           那点了第三个属性页上的“完成”按钮我们想进行某些处理的话,就重载OnWizardFinish函数,方法同OnSetActive函数。重载后的OnWizardFinish函数如下:

    C++代码
    1. BOOL CAddPage::OnWizardFinish()   
    2. {   
    3.     // TODO: Add your specialized code here and/or call the base class   
    4.   
    5.     // 提示向导完成   
    6.     MessageBox(_T("使用说明向导已阅读完!"));   
    7.   
    8.     return CPropertyPage::OnWizardFinish();   
    9. }  

            3.创建属性表类

           属性页资源和属性页类创建完以后,还不能生成向导对话框,我们还需要一个属性表类,来容纳这些属性页

           在Solution Explorer视图中的根节点“Addition”上点右键,在右键菜单中选择Add->Class,弹出“Add Class”对话框,然后在中间区域中选择“MFC Class”,点“Add”按钮,弹出另一个类向导对话框,设置Class name为CAddSheet,Base class选择“CPropertySheet”,点“Finish”按钮,这样就属性表类就建好了。

           接下来,在新生成的AddSheet.h中包含三个属性页类的头文件:

           #include "SummandPage.h"
           #include "AddendPage.h"
           #include "AddPage.h"

           之后在AddSheet.h中添加private变量:

           CSummandPage    m_summandPage;
           CAddendPage     m_addendPage;
           CAddPage        m_addPage;

           然后在AddSheet.cpp文件中修改CAddSheet的两个构造函数为:

    C++代码
    1. CAddSheet::CAddSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)   
    2.     :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)   
    3. {   
    4.     // 添加三个属性页到属性表   
    5.     AddPage(&m_summandPage);   
    6.     AddPage(&m_addendPage);   
    7.     AddPage(&m_addPage);   
    8. }   
    9.   
    10. CAddSheet::CAddSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)   
    11.     :CPropertySheet(pszCaption, pParentWnd, iSelectPage)   
    12. {   
    13.     // 添加三个属性页到属性表   
    14.     AddPage(&m_summandPage);   
    15.     AddPage(&m_addendPage);   
    16.     AddPage(&m_addPage);   
    17. }  

            4.显示向导对话框

            我们在加法计算器对话框上添加一个按钮,点击它就打开向导对话框。此按钮的ID设为IDC_INSTRUCT_BUTTON,Caption属性设为“使用说明”。

            按照为控件添加消息处理函数中所讲方法,为IDC_INSTRUCT_BUTTON按钮在CAdditionDlg类中添加点击消息的处理函数OnBnClickedInstructButton。然后在AdditionDlg.cpp文件中包含CAddSheet的头文件:#include "AddSheet.h"。最后修改OnBnClickedInstructButton函数如下:

    C++代码
    1. void CAdditionDlg::OnBnClickedInstructButton()   
    2. {   
    3.     // TODO: Add your control notification handler code here   
    4.   
    5.     // 创建属性表对象   
    6.     CAddSheet sheet(_T(""));   
    7.     // 设置属性对话框为向导对话框   
    8.     sheet.SetWizardMode();   
    9.     // 打开模态向导对话框   
    10.     sheet.DoModal();   
    11. }  

           到此,向导对话框就完整的创建完成了,并可以在加法计算器对话框上点“使用说明”按钮显示出来。我们来看看效果吧:

           上图只是被加数页的效果,点其上“下一步”按钮就可以继续显示后面的两个页面。

    展开全文
  • MFC属性对话框

    万次阅读 2014-08-05 09:03:30
     CPropertyPage-父类是CDialog类,称为属性页或页面对话框。  CPropertySheet-父类是CWnd,称为属性表单。  一个完整的属性对话框由一个属性表单+多个属性页组成。属性页嵌套在属性表单内。 标签式属性页的创建...

    属性页对话框

     分类

      标签式和向导式

      相关类

     CPropertyPage-父类是CDialog类,称为属性页或页面对话框。

     CPropertySheet-父类是CWnd,称为属性表单。

      一个完整的属性页对话框由一个属性表单+多个属性页组成。属性页嵌套在属性表单内。

    标签式属性页的创建步骤:

      1 插入属性页对话框资源,选中对话框资源ID修改语言为Chinese(P.R.C), 选中资源视图的右边的对话框右键选择属性设置为宋体,9号字体,双击资源,生成相应的类,注意父类选择CPropertyPage类。

      2 右击工程,选择添加新的类,父类是CPropertySheet类。

      3 在表单类中添加属性页对象。在构造函数中,

         CPropertySheet::AddPage

      4 创建和显示属性页

         CPropertySheet::DoModal()

      5 当控件的值发生改变时,将应用按钮设置为可用

         CPropertyPage::SetModified(TRUE);

      6 消息处理(通过在页面类中添加虚函数的方式实现)

         CPropertyPage::OnApply

         CPropertyPage::OnOK

         CPropertyPage::OnCancel

    新建一个MFC当文档应用程序,为菜单添加一个菜单项,在该菜单项的点击处理函数中弹出我们的属性页对话框。

     

    为了演示效果,在视图类的OnDraw函数中创建画笔,然后绘制一个图形,画笔的线宽和颜色由其成员变量m_nWidth和m_color决定,这里正是在属性页对话框中设置线宽和颜色然后作用到上面绘制的图形上。

    为视图类添加两个成员变量:

    int         m_nWitdh;// 线宽
    
    COLORERF  m_color;  //  颜色

    并在视图类的构造函数中初始化

    m_nWidth = 1;
    
    m_color = RGB (0, 0, 0);

    视图的OnDraw添加绘图代码如下:

    void CMFCLabelView::OnDraw(CDC* pDC)
    {
    	CMFCLabelDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	// TODO: add draw code for native data here
    
    	CPen pen;
    	pen.CreatePen (PS_SOLID, m_nWidth, m_color);
    	CPen *pOldPen = pDC->SelectObject (&pen);
    	pDC->Ellipse (100, 100, 400, 400);
    	pDC->SelectObject (pOldPen);
    	pen.DeleteObject ();
    }
    

    添加菜单项

    插入对话框资源,注意选择PROPPAGE类型的对话框资源

    选中对话框资源,右键更改语言为P.R.C

    然后在资源视图右边窗口选中对话框资源右键属性修改字体为宋体9号:

    复制一个刚才我们新建的并且调整好语言和字体的对话框

    注意:其中一个为线宽设置对话框,给它添加一个编辑框控件用以输入数值

         另外一个为颜色设置对话框,给它添加一个按钮,点击按钮弹出颜色对话框

    双击他们通过类向导生成相应的类,注意选择父类为CpropertyPage

    这里分别命名为:CPage1和CPage2

    Ctrl+W为线宽设置对话框的编辑框控件绑定一个int类型的值变量:m_nLineWidth并设置其范围为: 1 –20,并在其构造函数中初始化为1。

    在工程上右键选择New Class 注意选择父类为CpropertySheet, 这里类名我设置为:ClabelSheet,然后为该类添加两个成员变量:

    CPage1 m_page1;
    
    CPage2 m_page2; 

    然后在ClabelSheet的两个构造函数中都添加属性页(这样无论调用哪个都可以正确添加):

    AddPage (&m_page1);
    
    AddPage (&m_page2);

    注意包含:Page1.h 和Page2.h头文件

    Ctrl+W为视图类添加菜单的命令消息响应函数,添加如下创建标签式属性页的代码:

    注意包含:LabelSheet.h头文件

    为了使当用户输入数据时让属性页对话框上的应用按钮变为可用状态,为线宽设置对话库类CPage1的编辑框控件添加EN_CHANGE消息响应函数,当编辑框内容一旦改变将触发该消息,

    消息响应函数如下:

    void CPage1::OnChangeEditLinewidth() 
    {
    	// 设置应用按钮为可用状态
    	SetModified (TRUE);
    }
    

    为了在用户点击应用按钮时把用户的设置反应在视图类的窗口绘图上,我们需要响应应用按钮的消息,然而我们无法直接通过双击应用按钮位它添加消息,正确的做法是通过添加虚函数的方式,此外还有确定, 下一步,等一切属性页对话框上的按钮事件都是虚函数。

    那么这里我给CPage1添加一个虚函数OnApply来响应”应用”按钮事件

    并添加如下代码来影响视图窗口图形的绘制:

    BOOL CPage1::OnApply() 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	// 从控件接收数据到变量
    	UpdateData (TRUE);
    	// 获取视图类对象指针
    	CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());
    	// 改变视图类的线宽
    	pView->m_nWidth = m_nLineWidth;
    	// 使视图窗口重绘
    	pView->Invalidate ();
    	return CPropertyPage::OnApply();
    }
    

    这个时候编译会包一些错误发现是一些头文件包含问题

    首先在Page1中包含MFCLabelView.h

    然后在MFCLabelView中包含MFCLabelDoc.h

    再编译就Ok了,设置线宽后点应用按钮在视图窗口中可以看到效果。

    回到CPage2类的对话框资源对话框,双击“设置颜色”按钮添加响应事件,编写如下代码:

    #include "MFCLabelView.h"
    void CPage2::OnBtnSetcolor() 
    {
    	// TODO: Add your control notification handler code here
    	CColorDialog dlg;
    	if (IDCANCEL == dlg.DoModal ())
    		return;
        CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());
    	pView->m_color = dlg.GetColor ();
    	pView->Invalidate ();
    }


    向导式属性页的创建步骤:
        1 插入属性页对话框资源,选中对话框资源ID修改语言为Chinese(P.R.C), 选中资源视图的右边的对话框右键选择属性设置为宋体,9号字体,双击资源,生成相应的类,注意父类选择CPropertyPage类。
        2 右击工程,选择添加新的类,父类是CPropertySheet类。
        3 在表单类中添加属性页对象。在构造函数中,
            CPropertySheet::AddPage
        4 创建和显示前,设置为向导模式
          CPropertySheet::SetWizardMode
        5 创建和显示
          CPropertySheet::DoModal()
        6 设置每个页面的向导按钮,在属性页对话框对应的类中添加下面的函数
          6.1 在CPropertyPage::OnSetActive()函数中设置
          6.2 在页面中得到表单对象
                GetParent()
          6.3 设置向导按钮
                CPropertySheet::SetWizardButtons()
        7 消息处理函数,在属性页对话框对应的类中添加下面的虚函数函数
            CPropertyPage::OnSetActive()
            CPropertyPage::OnCancel()
            CPropertyPage::OnWizardNext()
            CPropertyPage::OnWizardBack()
            CPropertyPage::OnWizardFinish()

    这里简单起见直接修改本工程为向导模式:来到标签式属性对话框创建的地方,修改代码:

    void CMFCLabelView::OnLabel() 
    {
    	// TODO: Add your command handler code here
    	/*
    	// 构造标签式(默认)属性页
    	CLabelSheet sheet ("标签式属性页");
    	// 显示
    	sheet.DoModal ();
            */
    
    	// 构造向导式属性页
    	CLabelSheet sheet ("向导式属性页");
    	// 设置为向导模式
    	sheet.SetWizardMode ();
    	// 显示
    	sheet.DoModal ();	
    }

    第一个属性页对话框不应出现先一步按钮,来到CPage1类,添加OnSetAvtive()函数处理:

    #include "LabelSheet.h"
    BOOL CPage1::OnSetActive() 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	// 获取父窗口指针(sheet)
    	CLabelSheet* pSheet = (CLabelSheet*)GetParent ();
    	// 设置只有"下一步"按钮可用
    	pSheet->SetWizardButtons (PSWIZB_NEXT);
    
    	return CPropertyPage::OnSetActive();
    }
    同理颜色设置对话框只能有 上一步  和 完成按钮

    #include "LabelSheet.h"
    BOOL CPage2::OnSetActive() 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	// 获取父窗口指针(sheet)
    	CLabelSheet* pSheet = (CLabelSheet*)GetParent ();
    	// 设置:"上一步"和“完成”按钮为可用状态
    	pSheet->SetWizardButtons (PSWIZB_BACK | PSWIZB_FINISH );
    	
    	return CPropertyPage::OnSetActive();
    }
    那么我们想在线宽设置对话框设点击“下一步”按钮时把用户的输入设置到视图的显示,中,需要重写虚函数CPropertyPage::OnWizardNext()

    LRESULT CPage1::OnWizardNext() 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	// 从控件接收数据到变量
    	UpdateData (TRUE);
    	// 获取视图类对象指针
    	CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());
    	// 改变视图类的线宽
    	pView->m_nWidth = m_nLineWidth;
    	// 使视图窗口重绘
    	pView->Invalidate ();
    	
    	return CPropertyPage::OnWizardNext();
    }

    效果如下:





    展开全文
  •  属性对话框实际上是一个包含多个子对话框对话框,这些子对话框通常被称为页(Page),每次只有一个页是可见的,在对话框的顶端有一行的选项卡,可通过点击不同的选项卡切换到不同的页。这样就可以容纳大量的...

    1、简介

        属性页对话框实际上是一个包含多个子对话框的对话框,这些子对话框通常被称为页(Page),每次只有一个页是可见的,在对话框的顶端有一行的选项卡,可通过点击不同的选项卡切换到不同的页。这样就可以容纳大量的控件来描述某一对象的诸多属性。

        属性页对话框包括一个CPropertySheet和几个CPropertyPage。


    2、创建属性页对话框例子

        步骤1

        新建一个MFC单文档应用程序,工程名为Dialog

        步骤2

        分别为各个页创建对话框模板

        资源面板插入3个对话框

            修改Caption属性分别改为“个人信息”、“兴趣爱好”、“工作情况”

            修改ID分别为IDD_PAGE1、IDD_PAGE2、IDD_PAGE3。每页默认的“OK”和“Cancel”按钮去掉

            由于每个对话框对应于属性页对话框的一个页面,样式有特殊要求:Style ---Child;Boder---Thin;Tilte Bar---True;Disable---True;

         <注意>

        每页的模板最好有相同的尺寸,若不统一,则框架将根据最大的页来确定属性页对话框的大小





        步骤3

        为每个页创建新类

        用Class Wizard分别为每个页创建CPropertyPage类的派生类,三个属性页相似,相对应的修改“MFC Class  Wizard”对话框中:Class name---填写类名(CPage1)、在Base class(基类) ---选择CPropertyPage;




        步骤4

        为每页的对话框添加控件及其相对应的成员变量

        第一页3个静态正文控件,Caption分别为:“姓名”、“性别”、“年龄”

                    两个编辑框、一个组合框,ID分别为:IDC_EDIT_NAME、IDC_COMBO_SEX、IDC_EDIT_AGE

        <注意>

        (1)由于组合框的作用是让用户选择性别,个数较少的情况下,可以先赋初值,在组合框的属性中的Data页面完成(男;女;)

        (2)将组合框的Type属性设为Drop List,用户不能再输入数据,此时的组合框只能捆绑int类型的成员变量


        第二页四个复选框控件

        Caption分别为:乒乓球、篮球、游泳、网球

        ID分别为:IDC_CHK_TBLTENNIS、IDC_CHK_BSKBALL、IDC)CHK_SWIM、IDC_CHK_TENNIS

        第三页有两个组框、三个单选按钮和一个列表框

        组框---Caption分别为:职务、工作地点

        单选按钮---Caption分别为:程序员、软件工程师、系统分析师

                        ---ID分别为IDC_RAD_PRO、IDC_RAD_SOFT、IDC_RAD_ANALY

        列表框---ID为IDC_LIST_CITY

        <注意>

        (1)单选按钮设为一组,将第一个单选按钮的Group属性选中,一组单选按钮只能捆绑一个int性成员变量,表示该组中选中的单选按钮的序号

        (2)列表框中的数据要通过在OnInitDialog()中用户手动添加


        给每个页的控件添加对应的成员变量,可以通过“AddMember Variable Wizard”对话框添加,选择“Member Variable”页面,然后选中“Control Variable”复选框,Control ID-----选择响应的控件ID;Variable name-----输入变量名;Category-----选择“Value”选项;Variable type -----选择相应的变量类型

    页面 控件类型 ID 号 成员变量
    1 编辑框(姓名) IDC_EDIT_NAME m_name(CString)
    1 组合框(性别) IDC_COMBO_SEX m_sex(int)
    1 编辑框(年龄) IDC_EDIT_AGE m_age(CString)
    2 复选框(乒乓球) IDC_CHK_TBLTENNIS m_tbltennis(BOOL)
    2 复选框(篮球) IDC_CHK_BSKBALL m_bskball(BOOL)
    2 复选框(游泳) IDC)CHK_SWIM m_swim(BOOL)
    2 复选框(网球) IDC_CHK_TENNIS m_tennis(BOOL)
    3 单选按钮组(职务) --------------(可以用第一个按钮添加变量) m_job(int)
    3 列表框(工作地点) IDC_LIST_CITY m_city(CString)

        <注意>

        控件的成员变量的命名和控件的ID号相关,这样方便记忆,不易混淆。


        <说明>

        对话框类添加控件的控件成员变量后,相应的头文件(.h)和源文件(.cpp)中会有相应的代码写入

        <Page1.h>

       
    #pragma once
    
    
    // CPage1 对话框
    
    class CPage1 : public CPropertyPage
    {
    	.....................
    public:
    	CString m_name;
    	int m_sex;
    	CString m_age;
    	........................
    };
    

        <Page1.cpp>
       
    // Page1.cpp : 实现文件
    //
    
    .......................
    //对变量初始化
    CPage1::CPage1()
    	: CPropertyPage(CPage1::IDD)
    	, m_name(_T(""))
    	, m_sex(0)
    	, m_age(_T(""))
    {
    
    }
    
    ................
    //消息映射
    void CPage1::DoDataExchange(CDataExchange* pDX)
    {
    	CPropertyPage::DoDataExchange(pDX);
    	DDX_Text(pDX, IDC_EDIT_NAME, m_name);
    	DDX_CBIndex(pDX, IDC_COMBO_SEX, m_sex);
    	DDV_MinMaxInt(pDX, m_sex, 0, 1);
    	DDX_Text(pDX, IDC_EDIT_AGE, m_age);
    }
    
    .......................
        
        <Page2.h>
       
    #pragma once
    
    
    // CPage2 对话框
    
    class CPage2 : public CPropertyPage
    {
    	...............................
    public:
    	BOOL m_tbltennis;
    	BOOL m_bskball;
    	BOOL m_swim;
    	BOOL m_tennis;
    	............................
    };
    

        <Page2.cpp>
       
    ......................
    //对成员变量初始化
    CPage2::CPage2()
    	: CPropertyPage(CPage2::IDD)
    	, m_tbltennis(FALSE)
    	, m_bskball(FALSE)
    	, m_swim(FALSE)
    	, m_tennis(FALSE)
    {
    
    }
    
    ..........................
    
    //消息映射
    void CPage2::DoDataExchange(CDataExchange* pDX)
    {
    	CPropertyPage::DoDataExchange(pDX);
    	DDX_Check(pDX, IDC_CHK_TBLTENNIS, m_tbltennis);
    	DDX_Check(pDX, IDC_CHK_BSKBALL, m_bskball);
    	DDX_Check(pDX, IDC_CHK_SWIM, m_swim);
    	DDX_Check(pDX, IDC_CHKTENNIS, m_tennis);
    }
    .....................................

        <Page3.h>
       
    #pragma once
    
    
    // CPage3 对话框
    
    class CPage3 : public CPropertyPage
    {
    	...................
    public:
    	int m_job;
    	CString m_city;
    	...................
    };
    

        <Page3.cpp>
       
    // Page3.cpp : 实现文件
    //
    
    .............................
    //成员变量初始化
    CPage3::CPage3()
    	: CPropertyPage(CPage3::IDD)
    	, m_job(0)
    	, m_city(_T(""))
    {
    
    }
    
    ................................
    //消息映射
    void CPage3::DoDataExchange(CDataExchange* pDX)
    {
    	CPropertyPage::DoDataExchange(pDX);
    	DDX_Radio(pDX, IDC_RAD_PRO, m_job);
    	DDX_LBString(pDX, IDC_LIST_CITY,m_city);
    }
    ..........................


        步骤5

        创建并显示属性页对话框
        在这里用菜单调用属性页,在原标准菜单后面添加新菜单“对话框”,在其下新建菜单命令“属性页对话框”,ID为IDM_PROP,利用“Event Handler Wizard”为其添加事件处理程序,这里选择基类为“CDialogView类(因为是在菜单中调用)”


    创建并显示属性页对话框的页码如下
       
    void CDialogView::OnProp()
    {
    	// TODO: 在此添加命令处理程序代码
    
    	CPropertySheet propSheeet;
    	//定义3个属性页的页面对象
    	CPage1 page1;
    	CPage2 page2;
    	CPage3 page3;
    	//将页面加入到属性页对话框的框架对象中
    	propSheeet.AddPage(&page1);
    	propSheeet.AddPage(&page2);
    	propSheeet.AddPage(&page3);
    	propSheeet.DoModal();
    }

        <说明>

        (1)属性页对话框创建过程与普通对话框类似,不同在于还需将页对象加入到CPropertySheet对象中。
        (2)如果创建的是模态对话框,应调用CPropertySheet::DoModal(),如果创建非模态对话框,调用CPropertySheet::Create();
        (3)在CDialogView类的头文件中将新建3个页类的头文件包含进来,这是因为在CDialogView类的菜单命令的出来了函数OnProp中使用这三个类
                  #include“Page1.h”
                  #include“Page2.h”
                  #include“Page3.h”

        运行结果:


        步骤6

        在各个页的重载OnInitDialog()函数,添加代码

        <Page1.cpp>
       
    BOOL CPage1::OnInitDialog()
    {
    	CPropertyPage::OnInitDialog();
    
    	// TODO:  在此添加额外的初始化
    
    	((CComboBox*)GetDlgItem(IDC_COMBO_SEX))->SetCurSel(1);
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	// 异常: OCX 属性页应返回 FALSE
    }
        
        <Page3.cpp>
       
    BOOL CPage3::OnInitDialog()
    {
    	CPropertyPage::OnInitDialog();
    
    	// TODO:  在此添加额外的初始化
    
    	//将城市信息添加到列表框
    	((CListBox*)GetDlgItem(IDC_LIST_CITY))->AddString(_T("北京"));
    	((CListBox*)GetDlgItem(IDC_LIST_CITY))->AddString("上海");
    	((CListBox*)GetDlgItem(IDC_LIST_CITY))->AddString("深圳");
    	((CListBox*)GetDlgItem(IDC_LIST_CITY))->AddString("天津");
    	//高亮显示第一条信息  
    	((CListBox*)GetDlgItem(IDC_LIST_CITY))->SetCurSel(0);  
    	((CButton*)GetDlgItem(IDC_RAD_PRO))->SetCheck(1); 
    	//默认第一条消息为高亮度显示
    	((CListBox*)GetDlgItem(IDC_LIST_CITY))->SetCurSel(0);
    	((CButton*)GetDlgItem(IDC_RAD_PRO))->SetCheck(1);
    
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	// 异常: OCX 属性页应返回 FALSE
    }
    

        运行如图:

        步骤7 

        将用户输入的数据显示在屏幕上
        为实现这一功能,至少在CDialogView类的头文件中定义一些相应的成员变量来保护用户的输入,代码如下
        
        <DialogView.h>
       
    
    // DialogView.h : CDialogView 类的接口
    //
    .......................
    
    class CDialogView : public CView
    {
    ..........................
    public:
    	//注意:此处定义的成员变量与控件添加的成员变量同名,这样是为了方便记忆
    	CString m_name;//对应于姓名编辑框的成员变量
    	CString m_age;//对应于年龄编辑框的成员变量
    	CString m_city;//对应于工作地点列表框的成员变量
    	CString m_sex;//对应于性别组合框的成员变量
    };
    ......................

        <注意>

        在CDialogView类中定义的成员变量和为控件的成员变量的同名,这样是为了方便记忆

        <DialogView.cpp>
       
    void CDialogView::OnProp()
    {
    	// TODO: 在此添加命令处理程序代码
    
    	CPropertySheet propSheeet;
    	//定义3个属性页的页面对象
    	CPage1 page1;
    	CPage2 page2;
    	CPage3 page3;
    	//将页面加入到属性页对话框的框架对象中
    	propSheeet.AddPage(&page1);
    	propSheeet.AddPage(&page2);
    	propSheeet.AddPage(&page3);
    	/*propSheeet.DoModal();*/
    	if(propSheeet.DoModal() == IDOK)//判断用户是否点击“确定”按钮退出
    	{
    		//获取并显示用户第一页的输入信息
    		m_age = page1.m_age;
    		m_name = page1.m_name;
    		if(page1.m_sex == 0)
    			m_sex = "男";
    		else
    			m_sex = "女";
    		if(m_name.IsEmpty())//判断用户是否输入姓名
    		{
    			MessageBox("您没有输入姓名,不能显示!");
    			return ;
    		}
    
    		if(m_age.IsEmpty())//判断用户是否输入年龄
    		{
    			MessageBox("您没有输入年龄,不能显示!");
    			return ;
    		}
    
    		CClientDC dc(this);
    		CString strInput;
    		strInput = "姓名:";
    		strInput +=m_name;
    		strInput +=", 性别:";
    		strInput +=m_sex;
    		strInput +=", 年龄";
    		strInput +=m_age;
    		dc.TextOut(0,0,strInput);
    
    		//获取并显示第二页输入的信息
    		strInput = "爱好:";
    		if(page2.m_tbltennis)//乒乓球复选框是否被选中
    			strInput +=" 乒乓球 ";
    		if(page2.m_bskball)
    			strInput +=" 篮球 ";
    		if(page2.m_swim)
    			strInput +=" 游泳 ";
    		if(page2.m_tennis)
    			strInput +="网球 ";
    		TEXTMETRIC tm;
    		dc.GetTextMetrics(&tm);//获取当前字体的高度
    		dc.TextOut(0,tm.tmHeight,strInput);
    
    		//获取并显示用户第三页输入的信息
    		strInput = "职务:";
    		if(page3.m_job == 0)
    			strInput +="程序员";
    		if(page3.m_job == 1)
    			strInput += "软件工程师";
    		if(page3.m_job == 2)
    			strInput += "系统分析师";
    		m_city = page3.m_city;
    		strInput +=", 工作地点:";
    		strInput +=m_city;
    		dc.TextOut(0,2*tm.tmHeight,strInput);
    	}
    }

        运行结果:


    展开全文
  • 使用prompt在页面中弹出提示对话框

    千次阅读 2019-01-04 21:34:59
    根据用户输入星期一~星期日的不同,弹出不同信息提示对话框,要求使用函数实现 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &...
  • MFC中属性表单和向导对话框的使用

    千次阅读 2015-09-23 22:01:54
    属性表单则是另外一种对话框,表单上有多个属性页,每点击某一页,会显示该页的内容,最好的例子是Visual C++6.0的Option对话框;如图: 属性表单的创建: 属性表单上由许多属性页组成,每个属性页都可以...
  • 1,如何模态对话框中进行提交而新开窗口? 如果你 的 浏览器是IE5.5+,可以在对话框中使用带name属性的iframe,提交时可以制定target为该iframe的name。对于IE4+,你可以用高度为0的frame来作:例子, test6....
  • QT对话框中show和exec的区别

    千次阅读 2015-09-19 19:30:38
    (注:本文转载的同时作出小部分修改。) QDialog的显示有两个函数show()和exec()...弹出窗口是否为模态对话框,取决于modal属性的值。 (原文:Shows the dialog as a modeless dialog. Control returns immediatel
  • 要显示“查找”和“替换”文本对话框分别使用函数FindText和ReplaceText: HWND WINAPI FindText(  __in LPFINDREPLACE lpfr ); HWND WINAPI ReplaceText(  __inout ...
  • 如果直接innerHTML改变,会导致表情包只出现文本最后,所以这样是符合用户体验的,需要跟踪光标的位置.在用户点击文本或者文本框失去焦点时候保存光标位置,点击表情时光标最后位置插入...
  • 对话框中添加组合框的应用

    千次阅读 2011-05-28 22:00:00
    该组合框程序运行的时候也不允许用户再往里添值,因此,将该组合框的Type属性选择为 Drop List, 用户不能在组合框的文本框输入数据,而且此时的组合框只能捆绑int 类型的成员变量。Type属性的设
  • Windows 对话框

    2010-03-27 15:52:00
    简单地说,对话框是 FormBorderStyle 枚举属性设置为 FixedDialog 的窗体。 Visual Studio ,可以通过使用 Windows 窗体设计器来构造自己的自定义对话框。可以根据自己的具体需要,向自定义对话框中添加诸如 ...
  • 如何SVG使用对话框

    千次阅读 2006-08-25 16:26:00
    如何SVG使用对话框用户交互是SVG开发常见的一个问题,SVG的窗口对象只提供了alert,confirm,prompt窗口方法,如何SVG创建和使用其它复杂对话框呢?解决的方法有几种: 1, 使用传统的HTML,其中嵌入SVG...
  • Bootstrap 模态对话框

    千次阅读 2018-03-12 20:54:43
    模态对话框JavaScript内置了 3 种对话框:...当弹出一个对话框时,浏览器会停止解析页面,并中断脚本执行,直到用户关闭对话框。因此,这些对话框被称作模态对话框。JavaScript提供的对话框外观丑陋,功能过于简单...
  • 查看文章 javascript--弹出对话框 四种对话框 获得用户输入值让用户点击确定 取消。让用户输入值。打开指定窗口alert("message") confirm("message") prompt("message") open("url")http://www.maobuy.cn首先我想...
  • 控制VC++.NETWEB对话框的HTML元素属性8/23/2001 10:14:11· ·Adding··yesky1 2 下一页 VC++.NET一个令人耳目一新的特性就是基于动态HTML的WEB对话框,它使得桌面程序... 一、HTML编辑器中设置元素的CSS属性 
  • 开源:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现作者:长江支流开源:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现 我个人认为,开发MIS,首先就得解决网格的问题,而开发工具...
  • Delphi使用Windows公用对话框

    千次阅读 2007-06-27 12:38:00
    Delphi的所有对话框使用一个公用方法:Execute方法来调用显示对话框。 如: if openDialog1.Execute then begin {如果在对话框中按确定返回时... 这些对话框中除了Find与Replace对话框是非模式对话框,其余的都是模
  • 如果我们在对话框用户输入值时,当用户输入空值点击确定按钮时,...先设置自定义对话框属性: autoClose: false 然后当用户输入正确的值时 $.closeModal(); 关闭对话框。 转载于:https://www.cnblogs.com...
  • 开源:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现 我个人认为,开发MIS,首先就得解决网格的问题,而开发工具为我们提供了如DataGrid、MSHFlexGrid的控件。其次,是打印的问题,将业务单据与数据...
  • C#对话框

    2008-09-19 20:19:00
    C#对话框1、文件对话框(FileDialog) 它又常用到两个: 打开文件对话框(OpenFileDialog) 保存文件对话(SaveFileDialog) 2、字体对话框(FontDialog) 3、颜色对话框(ColorDialog) 4、打印预浏对话框...
  • vue新增弹出对话框操作

    千次阅读 2020-05-16 15:40:03
    这个对话框组件是直接放到用户组件代码的,自带一个属性,控制是否显示,默认为false显示,需要显示的时候拿到此属性对应的变量,设置为true 主体内容使用表单组件 <!-- 添加用户对话框 --> <el-...
  • Android开发指南-用户界面-对话框

    万次阅读 2009-09-22 18:47:00
    创建对话框Creating Dialogs对话框通常是一个显示当前活动前面的小窗口。下面的活动失去焦点而由对话框接受所有的用户交互。对话框通常被用来当做通知或者运行的应用程序相关的短暂活动。Android API支持下面的...
  • 开源:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现 我个人认为,开发MIS,首先就得解决网格的问题,而开发工具为我们提供了如DataGrid、MSHFlexGrid的控件。其次,是打印的问题,将业务单据与数据...
  • 用户输入值。打开指定窗口 alert("message") confirm("message") prompt("message") open("url") http://www.maobuy.cn 首先我想先说两句我对javascript的一些看法,我希望大家认真的去学习这门编程语言,因为...
  • Winform对话框

    2015-02-16 00:08:36
    对话框中我们常用了以下几种: 1、文件对话框(FileDialog) 它又常用到两个:  打开文件对话框(OpenFileDialog)  保存文件对话(SaveFileDialog) 2、字体对话框(FontDialog) 3、颜色对话框(ColorDialog) 4、...
  • MFC中对话框的操作

    千次阅读 2013-07-21 18:54:44
    1.新建一个MFC项目,这里命名为sr,首先创建一个新的对话框资源视图里找到Dialog右键,Insert Dialog.出现新的对话框编辑界面。可以看到有两个按钮,OK和Cancel,自带,前者的ID 为 IDOK(后面要用到),后者...
  • vs2010 环境下, C++语言写的MFC对话框程序连接并操作 MySql 数据库,实现向数据库上传数据,以及从数据库查询数据并且简单的显示出来。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,447
精华内容 32,178
关键字:

在页面属性对话框中用户不能设置