孙鑫C++第七堂课要点(对话框)

1、在新的Dialog资源视图中添加类,步奏如下:

        

 2、DoDataExchange用来数据的交换和校验的

3、模态对话框(modal dialog)是用DoModal显示完成,用EndDialog来关闭;非模态对话框(modeless dialog)是Create来创建完成的,但是要加上ShowWindow将其显示出来,而DoModal中包含了ShowWindow

 

 1 // Cmfctest12View 消息处理程序
 2 void Cmfctest12View::OnDlg()
 3 {
 4     // TODO: 在此添加命令处理程序代码
 5     //模态对话框的创建
 6     //CTestDlg dlg;
 7     //dlg.DoModal(); DOModal执行后,程序会暂停执行,直到IDD_DIALOG1对话框被关闭后,对象dlg才会被析构
 8 
 9     //非模态对话框的创建
10     //CTestDlg dlg;
11     //dlg.Create(IDD_DIALOG1,this);
12     //dlg.ShowWindow(SW_SHOW);   窗口显示后,dlg对象立刻析构,造成对话框无法在窗口显示
13 
14     CTestDlg *pOldTestDlg=new CTestDlg;  //在堆中开辟新的内存
15     pOldTestDlg->Create(IDD_DIALOG1,this);
16     pOldTestDlg->ShowWindow(SW_SHOW);
17 }

4、静态变量:

 1 //功能:点击Add按钮(ID为IDB_Button1)时,创建新的按钮,为避免重复点击Add
 2 //设置m_iscreate来判断Add是否已经点击,m_btn为CButton类一个成员变量
 3 void CTestDlg::OnClickedButton1()
 4 {
 5     static bool iscreate=false;  //注意静态变量,保留上一次的结果
 6     if (iscreate==false)
 7     //if (false==m_iscreate)
 8     {
 9         m_btn.Create("weixin",BS_DEFPUSHBUTTON|WS_CHILD|WS_VISIBLE,CRect(0,0,50,50),this,123);//注意WS_VISIBLE,如果没有设置就必须加m_btn.ShowWindow(SW_SHOW)
10         //m_iscreate=true;
11         iscreate=true;
12     }
13     else
14     {
15         m_btn.DestroyWindow();
16         //m_iscreate=false;
17         iscreate=false;
18     }
19 }

5、m_hWnd保存与一个C++对象相关联窗口的句柄,如果有关联,则m_hWnd不为空,否则为空

1 if (!m_btn.m_hWnd)
2     { 
3         m_btn.Create("weixin",BS_DEFPUSHBUTTON|WS_CHILD|WS_VISIBLE,CRect(0,0,50,50),this,123);
4     } 
5     else
6     {
7         m_btn.DestroyWindow();//这同时也给m_hWnd赋值为空值
8     }

6、GetItemDlg()获取指定控件和窗口的指针,GetWindowText()获取指定控件的文本(Caption),SetWindowText()设置指定控件的文本

7、要让静态文本框响应鼠标点击事件(通告消息),首先要将静态文本框的ID改掉,其次要将静态文本框的Notify由false改为truth

 1 // CTestDlg 消息处理程序
 2 void CTestDlg::OnClickedNumber1()
 3 {
 4     // TODO: 在此添加控件通知处理程序代码
 5     if (GetDlgItem(IDC_NUMBER1)->GetWindowText(m_str1),m_str1=="Number1:")
 6     {
 7         GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");
 8     } 
 9     else
10     {
11         GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");
12     }
13 }

8、加法计算器的编写:

 13 void CTestDlg::OnClickedButton1()
 14 {
 15     // TODO: 在此添加控件通知处理程序代码
 16     //第1种方法
 17     int num1,num2,num3;
 18     char c1[10],c2[10],c3[10];
 19     GetDlgItem(IDC_EDIT1)->GetWindowText(c1,10);
 20     GetDlgItem(IDC_EDIT2)->GetWindowText(c2,10);
 21     num1=atoi(c1);
 22     num2=atoi(c2);
 23     num3=num1+num2;
 24     itoa(num3,c3,10);
 25     GetDlgItem(IDC_EDIT3)->SetWindowText(c3);
 26 
 27     //第2种方法
 28     int num1,num2,num3;
 29     num1=GetDlgItemInt(IDC_EDIT1); //将指定控件的字符串转化为数值
 30     num2=GetDlgItemInt(IDC_EDIT2);
 31     num3=num1+num2;
 32     SetDlgItemInt(IDC_EDIT3,num3); //将数值在制定控件以字符串形式显示出来
 33 
 34 
 35     //第3种方法
 36     UpdateData(TRUE);        //从控件中获取数据用true
 37     m_num3=m_num1+m_num2; //控件相关联的int型变量,DDX(dialog data exchange),相关联变量声明在DoDataExchange()中
 38     /*
 39     void CTestDlg::DoDataExchange(CDataExchange* pDX)
 40     {
 41     CDialog::DoDataExchange(pDX);
 42     DDX_Text(pDX, IDC_EDIT1, m_num1);
 43     DDX_Text(pDX, IDC_EDIT2, m_num2);
 44     DDX_Text(pDX, IDC_EDIT3, m_num3);
 45     }
 46     */
 47     UpdateData(FALSE);       //将数据传到控件中
 48 
 49     //第4中方法
 50     int num1,num2,num3;
 51     char c1[10],c2[10],c3[10];
 52     //m_edit1、m_edit2、m_edit3为三个edit控件相关的Edit变量
 53     /*
 54     void CTestDlg::DoDataExchange(CDataExchange* pDX)
 55     {
 56     CDialog::DoDataExchange(pDX);
 57     DDX_Control(pDX, IDC_EDIT1, m_edit1);
 58     DDX_Control(pDX, IDC_EDIT2, m_edit2);
 59     DDX_Control(pDX, IDC_EDIT3, m_edit3);
 60     }
 61     */
 62     m_edit1.GetWindowText(c1,10);
 63     m_edit2.GetWindowText(c2,10);
 64     num1=atoi(c1);
 65     num2=atoi(c2);
 66     num3=num1+num2;
 67     itoa(num3,c3,10);
 68     m_edit3.SetWindowText(c3);
 69 
 70     //第5种方法(发送消息和接受消息)
 71     int num1,num2,num3;
 72     char c1[10],c2[10],c3[10];
 73 
 74     //发送消息第1种方式
 75     //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)c1);
 76     //发送消息第2种方式
 77     //::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)c1);
 78     //发送消息第3种方式
 79     GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)c1);
 80     //发送消息第4种方式
 81     m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)c1);
 82     m_edit2.SendMessage(WM_GETTEXT,10,(LPARAM)c2);
 83     num1=atoi(c1);
 84     num2=atoi(c2);
 85     num3=num1+num2;
 86     itoa(num3,c3,10);
 87     m_edit3.SendMessage(WM_SETTEXT,10,(LPARAM)c3);
 88 
 89     //第6种方法(直接给控件发送消息)SendDlgItemMessage()等同于将GetDlgItem(IDC_EDIT1)和SendMessage()
 90     int num1,num2,num3;
 91     char c1[10],c2[10],c3[10];
 92     SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)c1);
 93     SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)c2);
 94     num1=atoi(c1);
 95     num2=atoi(c2);
 96     num3=num1+num2;
 97     itoa(num3,c3,10);
 98     SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,10,(LPARAM)c3);
 99 
100     //复选指定长度字符串的函数
101     SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,-1); //开头为0,结尾为-1,表示选择整个文本
102     m_edit3.SetFocus();
103 }

 

posted @ 2014-10-06 10:11  龙泽一狼  阅读(200)  评论(0编辑  收藏  举报