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 }