孙鑫VC++第7章对话框(一)

 

                                               第七章、对话框(一)

 

1.       所有的控件类都是由Cwnd类派生而来的,实际上,空间也是窗口;

 

2.  模态对话框垄断了用户的输入;

 

3.  在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的;对话框资源也有一个相应的基类:CDialog

 

 

对资源的操作是通过一个类来完成的,那么就需要创建一个类与这个新建的对话框资源相关联;(在对话框资源上左键双击,创建一个关联的类)

 

4.  头文件大小写无所谓,一样能识别;

 

 

5.模态对话框的创建

 

    用生成的类创建一个新的对象,然后调用CDialog类的成员函数:DoModal

 

        CTestDlgdlg;

        dlg.DoModal();

   

    需要注意的是必须在视类中添加新生成的类的头文件定义,不然无法识别;

 

5.  非模态对话框的创建

 

 

    //创建非模态对话框

    CTestDlg *pDlg = newCTestDlg;//注意这里的指针是个局部变量

    pDlg->Create(IDD_DIALOG1);

        pDlg->ShowWindow(SW_SHOW);//用create创建的必须得用这个显示

 

 

6.  对于非模态对话框来说,如果有一个ID值为IDOK,或者IDCANCEL的按钮,就必须重写基类的虚函数,并在重写的函数中调用DestroyWindow函数,以完成销毁对话框的工作;

 

 

7.  动态创建按钮

 

先添加一个CButton成员变量,然后用成员函数Create来实现

    if (m_bIsCreated ==FALSE)//利用一个全局变量来判断,或者静态变量

    {

 

   

    //资源号123是随便给的

    m_btn.Create("New",BS_DEFPUSHBUTTON| WS_VISIBLE |WS_CHILD,CRect(0,0,100,100),this,123);

    m_bIsCreated = TRUE;

 

    }

    else

    {

        m_btn.DestroyWindow();

        m_bIsCreated =FALSE;

    }

 

 

因为按钮对象与一个窗口绑定在一起了,就要先销毁这个窗口;

第二种判断方法:

 

 

 

 

    if (!m_btn.m_hWnd)

    {

        m_btn.Create("New",BS_DEFPUSHBUTTON| WS_VISIBLE |WS_CHILD,CRect(0,0,100,100),this,123);

    }

    else

    {

        m_btn.DestroyWindow();

    }

 

 

 

8.  控件的访问

 

利用ctrl键来对已有的控件的复制和粘贴

 

9.  静态文本控件

 

静态文本框主要是起标签作用的,并不是用来响应诸如鼠标单击这类消息的,所以他们的ID都是一样的;默认都是IDC_STATIC;

 

获取静态文本控件上显示的文本

 

 

    CString str;

    if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str == "Number1:")

    {

        GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");//设置

    }

    else

    {

        GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");

    }

 

静态文本控件在默认状态下是不发送通告消息的,所以要改属性,选中Notify选项;

 

 

10.编辑框控件

 

    实现输入两数字相加得出结果:第一种方法

 

   

   

    int num1,num2,num3;

    char ch1[10],ch2[10],ch3[10];

    GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);

    GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);

 

    num1 = atoi(ch1);//字符转换为int型

    num2 = atoi(ch2);

    num3 = num1+ num2;

 

    itoa(num3,ch3,10);//10代表十进制

    GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);

 

 

 

 

  第二种方法:CWnd提供了GetDlgItemText函数等价于GetDlgItem和GetWindowText函数;  同样还有SetDlgItemText函数;

 

 

 

第三种方式:

 

 

    int num1,num2,num3;

    num1 = GetDlgItemInt(IDC_EDIT1);

    num2 = GetDlgItemInt(IDC_EDIT2);

   

    num3 = num1+ num2;

 

    SetDlgItemInt(IDC_EDIT3,num3);

 

第四种方法:将编辑框分别与对话框类的三个成员变量相关联;(最简单的访问方式)

 

    在DoDataExchange函数内部实现了对话框控件与类成员变量的关联;(DDX为前缀的函数分别用于不同控件的数据交换)

 

    但是,为了让数据交换生效,就必须去调用DoDataExchange函数,但程序代码不是直接调用这个函数,而是需要去调用UpdateData这个函数;

 

 

    UpdateData();

    m_num3 = m_num1 + m_num2;

    UpdateData(FALSE);

 

 

    DDV为前缀的数据校验函数

 

 

第五种方法:把控件与一个变量相关联,即控件变量

 

 

   

    int num1,num2,num3;

    char ch1[10],ch2[10],ch3[10];

 

    m_edit1.GetWindowText(ch1,10);

    m_edit2.GetWindowText(ch2,10);

 

    num1 = atoi(ch1);

    num2 = atoi(ch2);

 

    itoa(num3,ch3,10);

    m_edit3.SetWindowText(ch3);

 

 

10. 对话框伸缩功能的实现

 

 

    static CRect rectLarge;

    static CRect  rectSmall;

 

    if(rectLarge.IsRectNull())

    {

        CRectrectSeparator;

        GetWindowRect(&rectLarge);

        GetDlgItem(IDC_SEPERATOR)->GetWindowRect(&rectSeparator);

 

 

        rectSmall.left =rectLarge.left;

        rectSmall.top =rectLarge.top;

        rectSmall.right =rectLarge.right;

        rectSmall.bottom =rectSeparator.bottom;

    }

    if (str == "收缩<<")

    {

        SetWindowPos(NULL,0,0,rectSmall.Width(),rectLarge.Height(),SWP_NOMOVE| SWP_NOZORDER);

    }

    else

    {

        SetWindowPos(NULL,0,0,rectSmall.Width(),rectLarge.Height(),SWP_NOMOVE|SWP_NOZORDER);

    }

 

 

11. 默认输入焦点可在资源的熟悉选项卡的styles可看到;

 

 

12. 对于一个WM_CHAR消息来说,它的wParam参数保存的就是字符的ASCII码;

 

13. 编辑控件框没有选中Multiline选项,即这个编辑框不支持多行,因此无法接收回车键按下的消息;

 

14. 当用户按下回车键的时候,Windows将会查看对话框中是否存在指定的默认按钮,如果有,就调用该默认按钮单击的响应函数,如果没有,就会调用虚拟的OnOK函数,即使对话框中没有包含默认的OK按钮;

 

你可能感兴趣的:(《孙鑫VC++深入详解》笔记)