版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章控件和对话框5.1滚动条控件5.2滚动条实例5.3课表实例四程序解释5.4对话框与属性表5.5对话框实例5.6课表实例五程序解释5.7小结
5.1滚 动 条 控 件
WindowsCE设备的显示区域相对于桌面显示设备而言面积较小,常见的为240 × 320的像素分辨率,也有一些为480 × 640像素分辨率的屏,尺寸大小一般在10 × 12cm以下。在如此小的显示屏上显示界面,经常会出现“越界”而显示不完整的现象,这时可以通过在可见显示窗口的左边或下边添加滚动条控件,利用滚动条中滑块的上下或左右移动而浏览那些“越界”的部分。如第5.2节中的图5-2中窗口左边的上下滚动条可以通过滑动块的移动,查看较大的高度区域。创建滚动条的方法有两种:一种为在窗口的边缘创建隶属于该窗口的滚动条控件,另一种为类似创建子窗口的方法创建独立的滚动条。这两种方法创建的滚动条本质上是一样的,当单击滚动条时会发送WM_VSCROLL或WM_HSCROLL消息,这两个消息的LOWORD(wParam)为点击滚动条的请求事件,可取以下值:例如,需要在窗口左边创建垂直滚动条,在创建窗口时使用WS_VSCROLL位标志即可(使用WS_HSCROLL位标志可创建水平滚动条),如下:滚动条控件的信息由SCROLLINFO结构体变量定义,该结构体为其中,cbSize为结构体占用的字节大小,被置为sizeof(SCROLLINFO);fMask为滚动条的样式位标志,可以为SIF_POS(指定nPos为滑块位置)、SIF_PAGE(指定nPage为页面大小)、SIF_RANGE(设定nMin和nMax为滑动的最小和最大值)、SIF_DISABLENOSCROLL(滚动条一直显示,显示页面小于当前窗口时,不使能滚动条)、SIF_TRACKPOS(指定nTrackPos为当前滑块位置)、SIF_ALL(前面所有的标志位均有效);nMin和nMax为最小和最大滑动位置;nPage为页面大小;nPos和nTrackPos为滑块的位置和瞬时位置。滚动条滑块滑动后,可以使用如下程序刷新滚动条,即上面的代码中,si为SCROLLINFO结构体变量,SetScrollInfo过程原型定义如下:
intSetScrollInfo(HWNDhwnd,intfnBar,
LPCSCROLLINFOlpsi,BOOLfRedraw);
其中,hwnd为滚动条所在的窗口;fnBar取为SB_HORZ或SB_VERT,分别表示水平或垂直滚动条控件,当取SB_CTL时,该滚动条是独立的控件,hwnd为滚动条句柄;lpsi为指向SCROLLINFO的指针,包含滚动条的状态;fRedraw为TRUE时重画滚动条,否则不重画。
5.2滚 动 条 实 例
这里的滚动条实例即课表实例四充分展示了滚动条的使用方法,其工作环境和运行结果如图5-1至图5-4所示。图5-1工作环境
图5-2滑块位于滚动条顶部
图5-3滚动条向下滑动图5-4滑块滑至滚动条底端课表实例四myTableTime4包括五个文件,即myTimeTable4.rc、myTimeTable4.h、myTimeTable4.cpp、mainWndProc.cpp和tableChildWndProc.cpp,各个程序文件的源码清单见以下各小节。5.2.1资源文件myTimeTable4.rc5.2.2头文件myTimeTable4.h5.2.3主程序入口文件myTimeTable4.cpp5.2.4主窗口过程文件mainWndProc.cpp5.2.5子窗口过程文件tableChildWndProc.cpp
5.3课表实例四程序解释
该实例四程序是在第三章课表实例三的基础上为了突出垂直滚动条的使用方法而扩展的程序,在这里重点分析一下子窗口过程文件tableChildWndProc.cpp。为了使窗口中滚动条有效,将原来的课表由周一至周五安排成了周一至周日,这样课表被“拉长”了,重新扩展了课表相关的数组strCourse、nCourseCell和strClassroom的维数,消息查找表中增加了WM_VSCROLL消息及其处理过程goVscrollTableChildWnd。在子窗口收到WM_CREATE消息后的处理过程中添加了滚动条的初始化代码,即上述代码中,lpcs->cy为子窗口的高度,si.mMax为lpcs->cy+82,即滚动条最大滑动距离为子窗口高度加上82像素点,然后,调用SetScrollInfo初始化滚动条。
在WM_PAINT消息的处理过程goPainTableChildWnd中指定绘制课表的矩形为滚动条能滚动的最大范围矩形,即其中,rect为客户区矩形;tableRect为画课表的矩形,而curPos为垂直滚动条当前的滑块位置,tableRect矩形的顶部为客户区矩形的顶部与curPos的差,因此,tableRect的上部小于rect.top的部分以及tableRect的下部大于rect.bottom的部分都不会显示出来,从而达到由滑块位置curPos决定显示区域的目的。例如:当滑块为垂直滚动条的顶部时,curPos为0,则tableRect从顶部开始的高为rect.bottom-rect.top的区域可被显示,它的下面部分区域不可见;当滑块滑动至curPos为41的某点,tableRect的顶变为了rect.top-41,则其从41像素开始高为rect.bottom-rect.top的区域是可见的,其他区域不可见。
drawTable(hdc,hWnd,&tableRect)过程在tableRect中绘制课表,与第三章实例三相同。
滑块滑动消息WM_VSCROLL的处理过程goVscrollTableChildWnd中,首先取得滑块的滑动事件,更新滑块的当前位置curPos;然后,调用SetScrollInfo过程重新绘制滑块;最后,调用InvalidateRect过程使滚动条所在窗口无效,导致其接收到WM_PAINT消息后重画窗口。
5.4对话框与属性表
WindowsCE程序中对话框窗口使用十分频繁,一般地,对话框被视为弹出窗口,WindowsCE提供了一整套完整的创建对话框、显示对话框和处理对话框事件的方法,并提供了对多个对话框组合显示的属性页的良好支持。程序中使用对话框分为三步:首先是创建对话框窗口资源模板,并在对话框资源模板中布局合适的控件资源;然后,调用DialogBox或CreateDialog等过程创建有模式或无模式对话框;最后,编写对话框窗口收到的消息处理过程或函数,那些不需要处理的消息,对话框窗口过程只需要简单地返回假或0即可。程序中使用属性表的方法也有三步:首先,创建属性表中包含的所有对话框资源模板,并在对话框资源中放置合适的控件资源;然后,定义并填充属性表头结构体变量和属性表页结构体变量;最后,调用PropertySheet过程创建并显示属性表。下面分节具体介绍其使用方法,首先从对话框资源模板开始讲起。5.4.1对话框资源
下面给出一个对话框资源模板的代码,稍后分析其内容:该对话框的显示样式如图5-13上的“设定课目”对话框。上述代码中的第一行的IDD_COURSEDLG为对话框ID号,在myTimeTable5.h中宏定义为整型值52;DIALOG为关键字,表示对话框资源;DISCARDABLE表示该对话框不使用时自动释放占用的内存空间;后面的10,20,110,80表示对话框左上角的坐标以及对话框的宽和高,这里的坐标是对话框坐标单位,水平上一个对话框单位相当于系统字体中字符宽度的四分之一,垂直方向上一个单位为同一字体的字符高度的八分之一,并且,对话框内的坐标体系均采用对话框单位。第二行的STYLE为关键字,定义对话框的样式,对话框样式和标准的窗口样式均可使用,这些样式在windows.h头文件中的包含文件中定义了。CAPTION关键字设定对话框的标题。BEGIN和END关键字中的部分为对话框内放置的控件,各种控件的定义方式大同小异,总体上可以分为两类创建方式,一类如上述代码的创建方式,另一类借助CONTROL关键字创建,稍后将介绍。这里举例创建左对齐显示的静态文本控件如下:由此可见,创建控件的语句为控件关键字+控件标题(有些控件无标题)+控件ID号(需在头文件中宏定义为整数)+四个表示控件左上角位置以及宽和高的整数+控件的显示
样式。
上文提到了创建对话框中控件还有另外一种借助CONTROL关键字的方法,这里再举一个创建对话框资源的例子,如下:上述代码中,创建一个按钮的代码为
CONTROL“装入”,IDC_LOADFILE1,“BUTTON”,WS_TABSTOP,5,5,20,13
创建一个编辑框控件的代码为
CONTROL"",IDC_FILECONTENT1,"EDIT",ES_READONLY|ES_MULTILINE|WS_BORDER|
WS_VSCROLL,5,16,112,70由此可见,创建控件的另一类方法为CONTROL关键字+控件标题字符串(无标题时用空字符串)+控件ID号(需要在头文件中宏定义为整数)+表示控件类型的字符串(由WindowsCE定义的)+控件样式+四个表示控件左上角位置以及宽和高的整数。
对话框资源常被称为对话框资源模板,是指一个对话框资源可以在程序中被多次引用,甚至在不冲突的情况下可以同时创建多个对话框资源,所以称为模板,并且,对话框模板中也可以放置位图等元素。5.4.2模式对话框
在资源文件中编辑对话框资源模板,例如要显示一个提示软件信息的“关于”对话框,其资源模板如下:
上述对话框资源中有一个位图和一个静态文本控件,显示效果如图5-18所示。创建和显示对话框需要使用过程DialogBox、DialogBoxParam、DialogBoxIndirect和DialogBoxIndirectParam,前两个过程使用对话框资源模板创建和显示对话框,后两个过程使用内存中的对话框模板动态地创建和显示对话框。例如,要显示上述的“关于”对话框,可以使用以下语句,即
//通过模式对话框“关于”对话框,显示制作组与版本信息
DialogBox(hInst,MAKEINTRESOURCE(IDD_
ABOUTDLG),hWnd,aboutDlgProc);5.4.3无模式对话框
用与创建模式对话框类似的方法,也可由对话框资源模板出发,调用过程CreateDialog创建和显示无模式对话框。同样,由内存中的DLGTEMPLATE结构体由发,调用CreateDialogIndirect或CreateDialogIndirectParam过程,也可实现无模式对话框的创建与显示。这些过程的原型如下,其中参数的含义与上一节模式对话框的过程参数的相同。5.4.4属性表
由多个对话框层叠组合在一起显示,即为属性表对话框。所以,属性表的每一页为一个对话框。由此可见,属性表由两部分组成,即属性表头和属性表页。
5.5对 话 框 实 例
对话框实例即为课表实例五,该实例项目myTime
Table5包括13个文件,除了具有头文件myTimeTable5.h、资源文件myTimeTable5.rc和主程序入口文件myTime
Table5.cpp之外,每一个窗口或对话框均对应着一个文件,即主窗口过程文件mainWndProc.cpp、子窗口过程文件tableChildWndProc.cpp、“关于”对话框文件myAboutDlg.cpp、课目无模式对话框文件myCourseDlg.cpp、教室无模式对话框文件myClassroomDlg.cpp以及属性表包容的五个对话框文件,即教学计划对话框文件myTeachplanDlg.cpp、教学大纲对话框文件myOutlineDlg.cpp、实验大纲对话框文件myLibplanDlg.cpp、课程教案对话框文件myContentDlg.cpp和课程讲义对话框文件myBookDlg.cpp。各程序文件的源码清单见以下小节。该实例工作环境和运行结果如图5-5至图5-19所示。图5-5课表实例五工作环境
图5-6程序运行主界面
图5-7下拉课表菜单
图5-8点击“课表|课程讲义”勾选 该菜单并弹出消息对话框图5-9点击课表中的谱估计,弹出属性表并选中其中的“讲义”页
图5-10点击图5-9中的“装入”按钮打开选择文件对话框图5-11点击图5-10中的文本文件,并点击“OK”按钮图5-12“设定”菜单的子菜单项图5-13点击“设定|课目”菜单,弹出对话框,选择上课时间并填充课目名称后,点击“加课”增加课目图5-14点击“设定|教室”菜单弹出对话框,用于设定上课教室图5-15点击“设定|颜色”菜单弹出颜色选择对话框图5-16由图5-15中选中绿色后的主界面图5-17“帮助”下拉菜单项图5-18“帮助|关于”子菜单的弹出对话框图5-19“帮助|退出”子菜单的弹出对话框5.5.1资源文件myTimeTable5.rc5.5.2头文件myTimeTable5.h5.5.3主程序入口文件myTimeTable5.cpp5.5.4主窗口过程文件mainWndProc.cpp5.5.5子窗口过程文件tableChildWndProc.cpp5.5.6“关于”对话框过程文件myAboutDlg.cpp5.5.7“课目”对话框过程文件myCourseDlg.cpp5.5.8“教室”对话框过程文件myClassroomDlg.cpp5.5.9“教学计划”对话框过程文件myTeachplanDlg.cpp5.5.10“教学大纲”对话框过程文件myOutlineDlg.cpp5.5.11“实验大纲”对话框过程文件myLibplanDlg.cpp5.5.12“课程教案”对话框过程文件myContentDlg.cpp5.5.13“课程讲义”对话框过程文件myBookDlg.cpp
5.6课表实例五程序解释
课表实例五的程序结构如下:除了上述文件之外,在程序文件所在文件夹内还有两个VisualStudio2008自动生成的文件,即解决方案文件myTimeTable5.sln和项目文件myTimeTable5.vcproj,项目文件是管理所有课表五实例文件的工程文件,而解决方案是多个项目文件的工作平台,可以视为当前VisualStudio2008的工作环境。
资源文件、头文件和主程序文件无需做进一步的说明。由于程序中使用了颜色通用对话框,该类对话框不属于标准的WindowsCE对话框,因此,在tableChildWndProc.cpp文件中的注册子窗口类过程registerTableChild内借助以下代码装入通用对话框库,即上述代码中的MYPROC为根据通用对话框库中的ChooseColor函数原型而自定义的指针。通用对话框库在主窗口过程文件mainWndProc.cpp的退出主窗口过程quitMainWnd中,使用FreeLibrary过程当主程序退出时释放掉占用的内存。
子窗口过程文件tableChildWndProc.cpp中对菜单号IDM_COLOR的响应过程体goColorTableChildCmd显示了颜色通用对话框,即需要定义CHOOSECOLOR结构体变量cc,调用通用对话框库中的ChooseColor过程,即rc=(lpfnChooseColor)(&cc),颜色的返回值为cc.rgbResult。在响应IDM_ABOUT菜单时,弹出“关于”模式对话框,该对话框过程aboutDlgProc在文件myAboutDlg.cpp中定义了,借助于对话框的消息查找表和窗口过程,实现对对话框右上角Close按钮的点击处理。
在响应菜单IDM_COURSE和IDM_CLASSROOM的处理过程时,弹出“课目”和“教室”无模式对话框,这两个对话框的窗口过程modelessCourseDlgProc和modelessClassroomDlgProc在文件myCourseDlg.cpp和myClassroomDlg.cpp中定义了,用于设定课表中的课目和教室号。对于触笔点击课表中的课目的事件消息WM_LBUTTONUP的处理过程体,将调用自定义过程showCourseDetail,在这个过程中将显示具有5个对话框页的属性表对话框。
下面将详细介绍三个对话框过程文件。这里,判断收到的消息是否为WM_COMMAND,如果是,则调用对应的goCommandAboutDlg处理过程;否则,简单地返回假。goCommandAboutDlg的过程体如下:提取WM_COMMAND消息中的LOWORD(wParam)参数,如果该参数为IDCANCEL,表明点击了对话框的Close按钮,则调用EndDialog过程关闭对话框,并返回真;否则,返回假。
其二为无模式对话框文件myCourseDlg.cpp,该文件定义了包含两个消息号的消息查找表,即无模式对话框窗口过程与模式对话框完全相同,不再罗列代码。当收到WM_INITDIALOG消息时,调用goInitdialogModelessCourseDlg过程,即上述初始化对话框过程中,把对话框中的两个组合框控件用SendDlgItemMessage过程赋予了初值,该过程通过向控件发送CB_ADDSTRING消息,把消息中的LPARAM参数字符串赋给组合框来实现赋值操作。然后,再次调用SendDlgItemMessage过程向控件发送CB_SETCURSEL消息,将组合框的初始选项置为空。如果要使组合框控件的初始值为第一索引号的值,即为strWeek[0],则使用以下语句
SendDlgItemMessage(hWnd,
IDC_WEEKCOURSECB,CB_SETCURSEL,0,0);“课目”无模式对话框对WM_COMMAND消息的处理过程为首先获得子窗口的句柄,即
//获得拥有者窗口主窗口下的子窗口tableChildWnd
hchildWnd=GetDlgItem(GetWindow(hWnd,
GW_OWNER),IDW_TABLECHILD);
上述代码表明,“课目”无模式对话框的拥有者窗口为主窗口,通过GetWindow(hWnd,GW_OWNER)获得,然后,需要进一步调用GetDlgItem由主窗口获得tableChildWnd子窗口,该子窗口是课表的显示窗口。当点击了“课目”无模式对话框的Close按钮时,调用DestroyWindow(hWnd)把无模式对话框关闭;当点击了“确定”按钮后,执行如下的代码,即提取两个组合框中的时间索引号,用于确定需要添加课目的课表位置;然后,提取文本编辑框中输入的课目名称,把课目名称写入到课表相关的数组strCourse和nCourseCell中;最后,调用InvalidateRect过程要求重画子窗口,从而将设置好的课目显示出来。这里InvalidateRect过程的原型如下:
BOOLInvalidateRect(HWNDhWnd,CONSTRECT*lpRect,BOOLbErase);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论