《VC++深入详解》学习笔记 第八章 对话框(二)

1.逃跑按钮的实现

1)创建两个相同的按钮(交替隐藏)

2)按钮窗口捕捉鼠标移动消息

      1.创建一个从CButton类派生的新类CNewButton,然后将按钮控件和这种新类型的成员变量相关联,从而就把按钮控件和一个自定义的按钮窗口类关联起来

      2.CDialogDlg类的头文件中包含CNewButton类的头文件

      3.CNewButton类捕获鼠标移动的消息

      4.CNewButton * 中定义一个成员变量CNewButton *  m_pBtn指向另一个按钮在CDialogDlg类的OnInitDialog函数的最后添加代码实现

        m_btn1.m_pBtn = &m_btn2;

        m_btn2.m_pBtn = &m_btn1;

      5.OnMouseMove中添加代码

        ShowWindow(SW_HIDE);(隐藏按钮窗口(隐含this指针))

          m_pBtn->ShowWindow(SW_SHOW);(显示另一按钮窗口)

3)可以用SetWindowPos(设置窗口的位置和大小)设置按钮在屏幕上显示的新位置

2.属性表单和向导的创建

1)一个属性表单由一个或多个属性页组成

     1.创建属性页:对应的MFC类是CPropertyPage(CDialog类的派生类,一个属性页窗口其实就是一个对话框窗口),该类生成的对象代表了属性表单中一个单独的属性页

     2.添加属性页资源(对话框资源的子选项)

     3.设置属性页窗口

     4.生成相应的属性页类(注意Dialog ID对应)

     5.创建属性表单

      1)为了创建一个属性表单,首先需要创建一个CPropertySheet对象,接下来,在此对象中为每一个属性页创建一个对象(CPropertyPage类型),并调用AddPage函数添加每一个属性页,然后调用DoModal函数显示一个模态属性表单,或者调用Create函数创建一个非模态属性表单

      2)创建属性表单对象(添加新类 CPropSheet 基类为CPropertySheet

      3)在属性表单对象的构造函数中添加属性页对象(注意包含头文件)

      4)在属性表单对象中(构造函数)添加属性页:CPropertySheetAddPage

            函数原型:void AddPage(CPropertyPage *pPage);//参数为属性页对象指针

      5)显示属性表单(CPropertySheet类是从CWnd类派生来的,而不是派生于CDialog类,但是CPropertySheet对象和CDialog对象的操纵方式是类似的)

      6)创建按钮,添加消息响应函数,函数体中定义CPropertySheet对象并显示

      7)将属性页资源的语言改为Chinese否则显示乱码(属性页资源默认选英语) 

2)向导的创建

     1.创建一个向导类型的对话框,应该遵循创建一个标准属性表单的步骤来实现,但在调用属性表单对象的DoModal函数之前,应该先调用SetWizardMode这一函数。

     2.修改按钮:CPropertySheet类提供的SetWizardButton成员函数

      函数原型:void SetWizardButton(DWORD dwFlags);// dwFlags有一些预定义的值

     3.一般来说,应该在属性页的OnSetActive函数中调用SetWizardButton这个函数,当属性页被选中,成为一个活动的页面时,应用程序就会调用ONSetActive这个函数,它时一个虚函数,需要我们重写,然后根据需要设置该属性页上的按钮

    4.在属性页类中重写OnSetActive函数,其中要调用属性表单的SetWizardButton函数,可以用GetParent函数获取属性页父窗口属性表单的指针(该函数返回的是一个CWnd类型的指针,要强制转换为CPropertySheet类型的指针,然后利用该指针调用函数)

((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);

3)处理第一个页面

     1.对每个页面做判断,如果没有选择,则禁止进入下一个页面

     2.对一组单选按钮来说,需要设置该组中第一个单选按钮的Group属性(随后的两个按钮和这个按钮就成为同一组了)

     3.为页面上的单选按钮关联一个成员变量,并在构造函数中初始化为-1,选中第一个单选按钮该变量值为0,选中第二个1,第三个2,这样就可以知道哪个被选中

     4.当用户单击属性页上的【下一步】按钮后,程序将调用OnWizardNext这个虚函数,如果函数返回0,那么程序自动进入当前向导下一个属性页。如果返回-1,将禁止属性页发生变更,因此我们为CProp1类添加OnWizardNext这个虚函数的处理,在其中判断是否做出选择

     5.OnWizardNext函数中判断之前要先调用UpdateData函数(系统不会自动调用DoExchange函数,要用UpdateData函数调用)来从控件得到成员变量的值

     6.在属性页显示之前向列表框中增加一些工作地点,因此,为CProp1类添加WM_INITDIALOG消息的响应函数OnInitDialog,在MFC中,对控件的操作都是通过相关的MFC类来完成的,列表框对应的MFC类:CListBox,该类提供了一个成员函数AddString,用于向列表框中添加字符串,因此,在OnInitDialog函数着那个,首先获得这个列表框控件,然后调用该对象的AddString函数完成工作地点的添加。

      ((CListBox*GetDlgItemIDC_LIST1))->AddString北京);

     7.给列表框关联一个成员变量,和判断单选按钮是否选中一样,判断列表框是否选中。

 4)处理第二个页面

     为四个复选框控件分别关联一个成员变量(BOOL型),对于复选框,若选中,它所关联的成员变量值为TRUE,否则为FAlSE(其余判断同上)

5)处理第三个页面

     1.组合框对应的MFC类为:CComboBox,该类也有一个成员函数:AddSrting,用于向组合框中的列表框中添加字符串选项

     2.设置组合框编辑框中有一个初始选择的项,可以通过组合框的成员函数:SetCurSel来完成,该函数功能是选择组合框的列表框中的一个字符串,并将其显示

     函数原型:int SetCurSel(int nSelect),参数是一个基于0的索引,指定选择项的索引位置,若为-1,则移出组合框的当前选择,并清空该组合框的编辑框的内容

6)接受用户在向导中所做的选择

     1.CProp3类添加一个虚函数:OnWizardFinish,处理【完成】按钮的单击消息

     2.为了获取用户选择的薪资选项,要先得到该选项的索引值,可以利用CComboBox类的GetCurSel成员函数实现,获得索引后,再利用CComboBoxGetLBText从组合框的列表框中指定位置处得到一个字符串

函数原型:void GetLBText(int nIndex,CString& rString) const;//第一个参数为索引位置 

3. 在对话框程序中让对话框捕捉WM_KEYDOWN消息

   一般情况下,对话框不会响应按键消息,是因为在对话框中,某些特定的消息,它们被Windows内部的对话框过程处理了(即在基类中完成了处理)或者被发送给了子控件进行处理,所以在对话框中就捕获不到按键的消息了,我们可以找到底层处理按键消息的函数,然后在子类中重写它,就能在对话框中处理按键消息了。

MFC中,是利用BOOL ProcessMessageFilterint code,LPMSG lpMsg)这个虚函数来过滤或响应菜单和对话框的特定Windows消息。

  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值