1、 对话框的创建:
可以通过插入对话框资源来创建一个对话框,对话框的创建封装在CDialog类中,它是由CWND类派生出来的,用来在屏幕上显示对话框窗口。
具体方法:先通过classwizard来创建一个新的类,和对话框的资源相关联,在Menu中创建一个菜单项,并通过对菜单项的响应来实现其相应的功能。
2、 对话框的分类:
① 模态对话框(在产生模态对话框时,程序先暂停执行,只能在模态对话款上进行操作,其他地方的操作不能进行。)
② 非模态对话框(它允许在显示对话框的同时,转而执行程序中的其他操作。)
3、 模态和非模态对话框的创建:
① 模态对话框的创建:可以通过Domodal()函数来实现,里面自带了将模态对话框显示的功能,在产生时间,程序将暂停执行,关闭模态对话框通过Enddialog()函数来实现,此时对话窗口将会被销毁。
② 非模态对话框的创建:可以通过Creat()函数来实现,但由于其没有自带现实的功功能,还需要调用Showwindow()函数将其显示出来。但如果只是在对话框类中定义了一个局部变量,对话框还是会显示不出来,因为局部变量在程序一执行完毕就结束生命周期,具体的解决办法:定义成员变量或则定义一个指向堆内存的指针,因为它与程序的生命周期一致,但缺点是在生命周期结束后内存会丢失。
在非模类对话框中点击OK或Cancel窗口时,它并没有被销毁,而是被隐藏,它是由基类中的onok()函数来实现,而默认情况下,onok()调用成员函数Enddialog(),它不能销毁非模类对话框,必须将onok()覆盖掉,调用其内部的DestroyWindow()函数来实现。
③ 由于非模类对话框操作比较复杂,因此在使用中更多的使用模类对话框。
4、 对话框上按扭控件的添加:
⑴消息分类:标准消息,命令消息,通道消息。
⑵实现单击按扭动态创建一个新的按扭的功能:
① 响应单击鼠标按扭的事件
② 通过Creat()来创建一个新的按扭:创建好一个按扭后时,它已经和一个窗口绑定在一起,必须先将其销毁后才能再创建一个的新的按扭,可以通过增加bool变量来判断是否是已经创建过的
③ 方法2:因为c++窗口与对象相关联,就定义了一个窗口句柄,否则它是空的,可以通过这个性质来进行判断。
5、 静态文本框的控件:
它起到注释的作用,可以对其增加消息响应函数来改变其信息,方法:首先要获得指向静态文本框的指针,通过 GetDlgitem()函数来实现,然后设置文本内容,通过SetWindowText()函数来实现,要将Notify复选上,才能接受通道消息。
6、 编辑框:
要实现将编辑框一的数字加上编辑框二的数字,并放到编辑框三上的方法:
方法一:GetDlgItem()->Get(Set)WindowText()
先获取编辑框的内容,GetDlgItem()->GetWindowText(),然后通过atoi()函数将字符转换成整型,再进行相关的运算操作,最后通过GetDlgItem()->SetWindowText()将得到的结果放到第三个编辑框中。
方法二:GetDlgItemText()/SetDlgItemText()
这个函数的功能实际上是将方法一的:GetDlgItem()->Get(Set)WindowText()二者的功能组合起来,其他的操作和方法一相同。
方法三: GetDlgItemInt()/SetDlgItemInt()
这个方法实际上是将方法二和中间将字符转化成整型合并起来,只适用于整型间的操作。
方法三:将控件和整型变量相关联
将编辑框分别关联成员变量来实现,通过ClassWizard,将控件的ID号和成员变量关联起来,通过DDX_text()开关函数来实现,并调用Updatedata()函数来获取输入值。
方法四:将控件和控件变量相关联
通过MeditGetwindowtext()函数来获取控件内容。
方法六:SendMessage()
先获取文本消息WM_GetText(),通过发送消息响应SendMessage()来实现,发送消息时,会拷贝文本消息到指定的buffer中。
方法七: SendDlgItemMessage()
给对话框的子控件发送消息来实现,其相当于方法六中获取子控件和发送消息的组合。
7、 对话框收缩和扩张:
方法:通过保留对话框在还原和切割后的尺寸坐标,通过GetWindowRect()来获取矩形区域,然后通过SetWindowPos()来设计对框的大小。
8、 Z-order次序的了解:
窗口的Z次序表明了重叠窗口堆中窗口的位置,这个窗口堆是按一个假想的轴定位的,这个轴就是从屏幕向外伸展的Z轴。Z次序最上面的窗口覆盖所有其它的窗口,Z次序最底层的窗口被所有其它的窗口覆盖。应用程序设置窗口在Z次序中的位置是通过把它放在一个给定窗口的后面,或是放在窗口堆的顶部或底部。
Windows系统管理三个独立的Z次序——一个用于顶层窗口、一个用于兄弟窗口,还有一个是用于最顶层窗口。最顶层窗口覆盖所有其它非最顶层窗口,而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_EX_TOPMOST风格创建最顶层窗口。
一般情况下,Windows系统把刚刚创建的窗口放在Z次序的顶部,用户可通过激活另外一个窗口来改变Z次序;Windows系统总是把活动的窗口放在Z次序的顶部,应用程序可用函数BringWindowToTop把一个窗口放置到Z次序的顶部。函数SetWindowPos和DeferWindowPos用来重排Z次序。
9、 窗口的分类:
⑴兄弟窗口;共享同一个父窗口的多个子窗口叫兄弟窗口。
⑵活动窗口
活动窗口是应用程序的顶层窗口,也就是当前使用的窗口。只有一个顶层窗口可以是活动窗口,如果用户使用的是一个子窗口,Windows系统就激活与这个子窗口相应的顶层窗口。任何时候系统中只能有一个顶层窗口是活动的。用户通过单击窗口(或其中的一个子窗口)、使用ALT+TAB或ALT+ESC组合键来激活一个顶层窗口,应用程序则调用函数SetActiveWindow来激活一个顶层窗口。
⑶前台窗口和后台窗口
在Windows系统中,每一个进程可运行多个线程,每个线程都能创建窗口。创建正在使用窗口的线程称之为前台线程,这个窗口就称之为前台窗口。所有其它的线程都是后台线程,由后台线程所创建的窗口叫后台窗口。用户通过单击一个窗口、使用ALT+TAB或ALT+ESC组合键来设置前台窗口,应用程序则用函数SetForegroundWindow设置前台窗口。如果新的前台窗口是一个顶层窗口,那么Windows系统就激活它,换句话说,Windows系统激活相应的顶层窗口。
10、实现输入焦点从一个编辑框移动另一个编辑框的方法:
可以通过改变编辑框的窗口过程SetWindowLong()函数来实现,具体实现方法:
① 通过GetNextWindow()来获取下一个编辑框的句柄。
② 通过GetWindow()来获取窗口的句柄
③ 通过GetNextDlgTableItem(),可以方便焦点的逐个移动,在onok()函数中来实现:先获得当前具有焦点的子窗口的指针,然后通过GetNextDlgTableItem()来获取下一个子窗口的句柄,它是按照设定好的窗口顺序来移动的,避免向下出现找不到窗口等问题。
11、本课程学习总结:
初步了解对话框用户界面程序的编写,如何向对话框控件联接数据成员及其实现机理,如何向对话框控关联控件类,如何利用对话框类的成员函数向控件发送消息和获取对话框控件的类指针,如何直接利用对话框控件类操纵对话框控件(发送消息和直接调用成员函数)。如何在程序运行时产生和销毁控件。对话框控件的几种操作方式的优劣比较分析。如何实现对话框的部分收缩和展开。如何让对话框上的文本框在程序启动后立即获得焦点,如何利用SetWindowLong改变窗口的回调函数,通过改变文本框的默认回车处理方式进行演示。实现多个输入文本框间通过回车逐一向下传递焦点的另一种巧妙方法(用缺省按钮来处理)。