一 创建对话框
资源视图->Dialog->右键->插入Dialog 默认生成一个ID:IDD_DIALOG1的对话框,在生成的IDD_DIALOG1上双击打开编辑。在对话框编辑区任意位置按右键->添加类(也可以通过[项目]->[添加类])。这两种方式默认状态下, 对话框:IDD_DIALOG1,基类:CDialogEx。此时填写类名:CFstDlg,它会自动生成去了字母C的头文件和源文件(名字都可以改,一般默认就可以,除非冲突)。
在资源视图中Menu双击 IDR_MAINFRAME菜单,在帮助后面添加一个菜单项,直接输入打开对话框1,选中它右键->属性,将Popup的值改为False,杂项中ID那里输入:IDM_OPENDIL1。再次在刚增加的菜单上右键->添加处理程序->消息类型:COMMAND 类列表选择:xxxView,函数处理程序用默认的:OnOpenDlg1之后添加编辑:
在OnOpenDlg1中添加如下代码: 先包含 #include "FstDlg.h"
CFstDlg dlg1; void CMFCDLGView::OnOpendlg1() { /*模式窗口方式*/ CFstDlg dlg; //用刚才增加的类CFstDlg 创建一个对象 dlg.DoModal(); //用模式窗口方式显示该对话框 //dlg.EndDialog(); 关闭模式窗口用 //单击了OK才会执行到下面 /*非模式窗口方式*/ //CFstDlg dlg1; //定义在类外,否则,执行完就自动析构了 dlg1.Create(IDD_DIALOG1,this); //非模式窗口的创建 dlg1.ShowWindow(SW_SHOW); //非模式窗口的显示
//dlg1.DestroyWindow(); 实现真正的销毁对象
//单击OK,只是隐藏了,但并没有销毁对象,要实现按OK销毁它,需要重写OnOK,并在OnOK中调用DestroyWindow(); }
运行程序,可以单击添加的菜单,可以打开该对话框窗口了。
当需要按一个按钮之后在对话框中动态的增加一个按钮时:在要弹处的对话框里面,添加一个按钮,修改ID和Caption属性,之后右键->添加处理程序->消息类型:BN_CLICKED,函数处理程序名:默认的就可以了,之后添加编辑按钮->转到代码区
if(!m_btnAdd) { m_btnAdd.Create(L"我是动态创建出来的按钮", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0, 0, 260, 60), this, 0xf11); } else { MessageBox(L"对象已存在"); }
对话框中的子窗口获取需要用GetDlgItem()
二 CEdit控件值的获取、设置、选中状态
一个CEdit可以关联多个变量,变量类别:Control类 Value类
直接使用项目->类向导添加关联变量时,类名:要添加的关联控件变量所在的对话框类;需要选中 [ ]控件变量复选框勾选,切换到成员变量类别中选择:Control 或Value。
资源视图上,选中要创建变量的控件,再右键->添加变量->打开一个对话框:添加成员变量向导->勾选控件变量->类别:Control/Value 变量名:m_xxx; 也可以右键->类向导->成员变量
关联控件的成员变量在 .h文件中跟普通的没啥区别:在CPP文件中主要区别在如下这段代码:
//由Frame调用,带有数据校验功能,不直接调用,而是要通过调用UpdateData()方法来实现对它的调用 void CFstDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT1, m_Edit1); //CEdit控件关联 private CEdit m_Edit1变量 DDX_Control(pDX, IDC_EDIT2, m_Edit2); DDX_Control(pDX, IDC_EDIT3, m_Edit3); DDX_Text(pDX, IDC_EDIT1, m_num1); //CEdit控件关联 private int m_num1变量 DDV_MinMaxInt(pDX, m_num1, -1000, 100000); //带校验功能 Dlg Data Validate DDX_Text(pDX, IDC_EDIT2, m_num2); DDX_Text(pDX, IDC_EDIT3, m_num3); }
CEdit值的获取、设置、选中状态测试代码如下:
void CFstDlg::OnBnClickedBtnAdd() { //if(!m_btnAdd) //{ // m_btnAdd.Create(L"我是动态创建出来的按钮", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0, 0, 260, 60), this, 0xf11); //} //else //{ // MessageBox(L"对象已存在"); //} /*方法1*/ //int num1, num2, num3; ////char ch1[10], ch2[10], ch3[10]; //CString cs1, cs2, cs3; //GetDlgItem(IDC_EDIT1)->GetWindowTextW(cs1); //GetDlgItem(IDC_EDIT2)->GetWindowTextW(cs2); //USES_CONVERSION; //num1=atoi(T2A(cs1.GetBuffer())); //num2 = atoi(T2A(cs2.GetBuffer())); //num3 = num1 + num2; //char* temp=new char[10]; //itoa(num3, temp, 10);//第三个参数表示10进制 //CString css(temp); //GetDlgItem(IDC_EDIT3)->SetWindowText(css); //delete[] temp; /*方法2 S/GetDlgItemText 文本转数字*/ //int num1_1, num2_2, num3_3; //CString cs_num1, cs_num2, cs_num3; //GetDlgItemText(IDC_EDIT1, cs_num1); //GetDlgItemText(IDC_EDIT1, cs_num2); //USES_CONVERSION; //num1_1 = atoi(T2A(cs_num1.GetBuffer())); //num2_2 = atoi(T2A(cs_num2.GetBuffer())); //num3_3 = num1_1 + num2_2; //char* temp1 = new char[10]; //itoa(num3_3, temp1, 10);//第三个参数表示10进制 //CString cs_result(temp1); //SetDlgItemText(IDC_EDIT3, cs_result); //delete[] temp1; /*方法3 G/SetDlgItemInt()*/ //int num11, num12, num13; //num11=GetDlgItemInt(IDC_EDIT1); //num12 = GetDlgItemInt(IDC_EDIT2); //num13 = num12+ num11; //SetDlgItemInt(IDC_EDIT3, num13); /*方法4 编辑框控件关联int变量法------最简单的一种*/ //UpdateData(); //参数:bSaveAndValidate TRUE 返回一个非零值表示成功 返回FALSE 表示正在初始化 //m_num3 = m_num1 + m_num2; //UpdateData(FALSE); //需要再次调用,否则控件不会有值,意思就是让控件重新初始化 /*方法5 编辑框控件关联编辑框变量 使用控件自身的G/SetWindowTextW()*/ //CString cs_ctrl1, cs_ctrl2, cs_ctrl3; //m_Edit1.GetWindowTextW(cs_ctrl1); //m_Edit2.GetWindowTextW(cs_ctrl2); //m_Edit3.GetWindowTextW(cs_ctrl3); /*方法6 利用消息 WM_GETTEXT/WM_GETTEXT*/ //int a, b, c; //wchar_t ch1[10], ch2[10], ch3[10]; ////控件发送消息的4种方式 //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); //第三个参数,指示要拷贝的字符数,第四个LParam 文本Buffer //::SendMessage(m_Edit1.m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1); //由于关联了控件变量 //GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT, 10, (LPARAM)ch1); //直接用CWnd的成员函数 //m_Edit1.SendMessageW(WM_GETTEXT,10, (LPARAM)ch1); //用控件自身的SendMessage //m_Edit2.SendMessageW(WM_GETTEXT,10, (LPARAM)ch2); //a = _wtoi(ch1); //b = _wtoi(ch2); //c = a + b; //_itow(c, ch3, 10); //SendDlgItemMessageW(IDC_EDIT3, WM_SETTEXT, 10, (LPARAM)ch3); /*方法7 */ int a, b, c; wchar_t ch1[10], ch2[10], ch3[10]; SendDlgItemMessageW(IDC_EDIT1, WM_GETTEXT, 10, (LPARAM)ch1); SendDlgItemMessageW(IDC_EDIT2, WM_GETTEXT, 10, (LPARAM)ch2); a = _wtoi(ch1); //W 宽字符 atoi()会得不到想要的结果 b = _wtoi(ch2); c = a + b; _itow(c,ch3,10); SendDlgItemMessageW(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)ch3); //VS2015里 第三个参数设置为10000也没问题,负数也没影响 /*设置选中文本状态 EM_SETSEL*/ SendDlgItemMessageW(IDC_EDIT3, EM_SETSEL,1,3L); //第三个参数开始:0,结尾:-1 它将实现全选功能 m_Edit3.SetFocus(); //需要设置焦点 }