ShowWindow( pDlg->m_hWnd , SW_RESTORE );//当对话框窗口处于最小化时,显示对话框窗口为原大小 SetForegroundWindow( pDlg->m_hWnd );//设置对话框窗口为当前窗口显示在屏幕顶层 ::SetWindowPos( pDlg->m_hWnd , HWND_TOPMOST , NULL , NULL , NULL , NULL , SWP_NOSIZE | SWP_NOMOVE );//设置对话框窗口一直在屏幕顶层
MFC对话框Dialog(一)对话框创建,传值MFC为我们提供了一些常用的控件,我们直接拖过来就可以用.这样大大简化了开发流程.要使用那些控件我们要先创建一个对话框(Dialog).然后就可以往对话框中拖入各种控件了. 下面来创建一个简单的有模式对话框,在里面添加一个按钮(Button)和两个文本框)Edit Control).
1.新建一个对话框并生成对应的类:
首先在Resource View中选中Dialog然后右击鼠标选择Insert Dialog.这样一个对话框就产生了.如果是第一个新建的,默认名字为IDD_DIALOG1.我们双击打开它.接下来从Toolbox中拖一个按键和两个文本框进来. 选中Dialog右击,选择Add Class.输入类名,假如为NewDialog.点Finish.一个叫NewDialog的类就产生了.这个类就和对话框关联起来了.如果我们不知道一个类是和哪个对话框关联的话,可以在头文件中找这样的代码:enum{ IDD = IDD_DIALOG1 };其中IDD_DIALOG1就是对话框的ID,是唯一的.当你为对话框添加类时这段代码会自动产生. 我们如果要调用这个对话框的话就直接调用这个类就行.比如:NewDialog nDlg ; nDlg.DoModal(); //这样一个有模式对话框就显示出来了.这种对话框弹出来之后就不用对其他页面做操作了.另外还有所谓的无模式对话框,打开后还可以对其他页面操作.
2.直接获取对话框中控件的值和赋值:
假如对话框中按钮的ID为IDC_BUTTON1,两个文本框的ID分别为IDC_INPUT1,IDC_INPUT2.(补充:在属性窗口中查看一个控件的ID时会发现ID名旁边是一个下拉列表框,里面有其他很多控件的ID.所发查看的时候鼠标要小心点,别一不小心选了一个其他的ID了.这样后面哪出错了都不容易发现哪错了.我就曾经被折腾了好久啊) (1)赋值 你打开对话框之前想对文本框初始化一个值的话可以这样写代码:SetDlgItemText(IDC_INPUT1, _T("please input "));(如果你把文本框属性中的Number选为True的话表示只能输入数字.如果输入字符会有出错提示.这时初赋值可以通过SetDlgItemInt(IDC_INPUT1, 123);) (2)获取值 要获取IDC_INPUT1中的值:CString temp; GetDlgItemText(IDC_INPUT1,temp); //文本框中的值就保存在变量temp中了.
3.使用变量获取对话框中控件的值和赋值:
上面的方法有些麻烦,我们还可以有更简单的方法.把文本框控件和一个变量对应起来.选中IDC_INPUT1右击-->选中Add Variable-->在Category中选Value,Variable type中选CString.-->输入Variable name.假如为csInput1-->点finish.用同样的方法为IDC_INPUT2添加变量csInput2. 做完上面的操作后对对话框对应的类中会自动添加一些代码进去.在头文件中会看到public: CString csInput1; CString csInput2;在cpp文件中会看到 void CtestDlg::DoDataExchange(CDataExchange* pDX) //这个参数干嘛用的还没太搞懂. { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_INPUT1, csInput1); //这行和下面一行是此时自动添加的.这个函数是在为对话框添加类时自动产生的 DDX_Text(pDX, IDC_INPUT2, csInput2); } DoDataExchange这个函数是干嘛用的呢? 顾名思义DataExchange就是数据交换.它的作用就是把变量和控件绑定到一起,变量的值改变后控件显示的值也变,修改了控件上的值变量也跟着变. (1)打开对话框时让其中一个文本框显示please input. 现在我们来初始化下IDC_INPUT1显示的值 .在初始化的代码中给csInput1赋值就行.csInput1=_T("please input"); 不过这时你打开对话框会失望的看到并没有初始化成功.这是因为DoDataExchange(CDataExchange* pDX)函数还没被调用.于是你就想手动去调用下,结果发现参数不知道填啥. 其实这个函数你是不能直接来调用的.我们必须调用UpdateData()这个函数,这个函数会自动再去调用DoDataExchange.最后的代码应该是这样的: csInput1=_T("please input"); UpdateData(FALSE);//如果参数是TRUE就表示把控件上显示的值传到变量csInput1.另外UpdateData()和UpdateData(TRUE)等价. (2)在IDC_INPUT1中随便输入些啥点下按钮后IDC_INPUT2中显示IDC_INPUT1中的值. 首先要给按钮添加个事件处理函数,直接双击它或右击选择Add Event Hanlder.这样一个叫CNewDialog::OnBnClickedButton1()的函数就产生了. 在里面添加代码:csInput2=csInput1;//一运行发现没实现要想的效果,还是得继续用UpdateData()函数才行. 在后面再添加一行代码:UpdateData(FALSE);//不过此时会发现不管IDC_INPUT1中输入什么.点下按钮后IDC_INPUT1,IDC_INPUT2的值都是开始csInput1初始的值"pleaseinput" 这是为啥呢.因为csInput1并没有收到IDC_INPUT1中的值.而调用UpdateData(FALSE)后对话框页面会内刷新下,显示变量传过来的值. 所以在给csInput2赋值前需要先把控件上改过来的值传给csInput1.最后的代码应该是这样的: UpdateData();//先把文本中的值传到相应的变量上去 csInput2=csInput1;// 给另一个文本框对应变量赋值 UpdateData(FALSE);//刷新对话框把变量值传到控件中 |