2.3 增加环境设置选项
上一节建立了面向对象的框架,并对各个模块进行详尽的讲解,下面本节要在前面的基础之上增加一个运行环境模式设置的对话框,它基本上包括3种设置:屏幕分辨率、位深和是否全屏运行。具体运行界面如图2-7所示。
下面我们来介绍一下该对话框是如何实现的,首先建立一个模式选择对话框类ScreenDlg,主要完成窗口参数的传递、对话框的建立以及窗口消息处理函数。具体定义如下所示:
|
| 图2-7 模式选择对话框 |
首先,在第19行包含进程序窗口类头文件GLWindow.h,下面是类ScreenDlg的定义,它包含一个成员变量m_pWindow,是一个全局窗口类的实例,用来对程序窗口进行设置。
第28行定义了一个函数void SetupWindow(GL_Window *pWindow),它主要完成窗口参数的传递及建立一个对话框,具体实现如下:
第32行将程序窗口对象传递给类ScreenDlg的成员变量m_pWindow,通过它可以根据模式选择结果来设置程序窗口。第34行调用DialogBox()创建一个模式对话框,注意它的第二个参数为一个对话框模板,通过我们建立的对话框资源ID号来指定,ID号为IDD_SCREENDLG的对话框,我们应该事先添加进该项目。第三个参数HWND_DESKTOP表明桌面为该对话框的父窗口。最后一个参数是非常重要的,它指向一个窗口消息处理回调函数,在此处该函数为ScreenDlgProc(),其实现代码如下:
第45~91行处理命令消息WM_COMMAND,它主要处理鼠标点击按钮的消息。首先是“确定”(OK)按钮,第50~53行根据“全屏(Fullscreen)”选择框的状态来设置窗口的全屏标志,其中函数IsDlgButtonChecked()来判断单选钮或复选框是否被选中。下面第55~58行根据位深单选框的选中状态来设置程序窗口的位深,第60~77行则根据分辨率的选择结果对窗口分辨率进行设置。
最后,第78行调用EndDialog(hwndDlg, wParam)来结束对话框,对于一个模式对话框,我们必须要通过调用EndDialog()才能结束它。第80~82行则是“取消”(Cancel)按钮的响应,即结束对话框并退出程序。
第85~89行则是处理鼠标点击选择框的消息,即当鼠标点击某个选择框时设置该框为选中状态,它是通过调用CheckDlgButton(hwndDlg,lParam,BST_CHECKED)来进行设置的,其中第一个参数hwndDlg为对话框窗口句柄,参数lParam保存了控件的ID号,最后一个参数BST_CHECKED设置该控件为选中状态。
第93~100行处理WM_INITDIALOG消息,即当对话框被显示之前对其进行一些初始化设置,第95~97行则是设置“全屏”、“分辨率”和“位深”等的初始选中状态。其中CheckRadioButton()还同时设置了一组单选框,即保证了互斥选择(一次只能选择其中一个)。
至此,我们已经完全把面向对象风格的框架介绍完了,从下一章开始所有的章节都将使用该框架进行OpenGL技术的探讨,如果你对此框架还不是特别熟悉,请对照源程序再次仔细分析一下。