版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Windows 程序设计第13章:对话框,西安邮电学院 系统结构教研室 指导老师:范琳,本章重点,模态对话框 非模态对话框 通用对话框,什么是对话框?,对话框是由菜单中的选项来启动的,在windows系统中,如果菜单中的选项后加上了“”,点击就能启动对话框。 对话框用于“显示系统的提示信息”,“用户数据的输入”,“文件的打开与关闭”等等,用于用户和系统的对话,故称为对话框。,对话框的分类,模态对话框:当出现模态对话框时,它的父窗口暂时失效,处理完对话框的所有动作后,才能将控制权交给父窗口。 非模态对话框:又称为“共存式对话框”,这种对话框出现时,父窗口不会失效,用户可以把输入焦点转移到父窗口,
2、并执行父窗口的工作。 大部分共存对话框的窗口样式都被指定为:WS_POPUP,WS_CAPTION,WS_SYSMENU,WS_BORDER。典型的共存对话框包括菜单,标题等。,消息来源,模态对话框:消息来源于对话框管理器; 共存对话框:从WinMain中的消息循环取得消息;如果共存对话框中有控件,则用于必须在消息循环中调用IsDialogMessage来判断消息是不是要送给共存对话框。 while (GetMessage ( ,第三类对话框,排它式对话框:又称为“系统模式对话框”,当它出现时,不仅父窗口失效,其它程序的窗口也一同失效,甚至切换程序操作也不允许。Windows中一般用排它式对话
3、框显示系统中出现的严重错误,此时需要先结束该对话框,才能进行其它操作。 只要在建立对话框时,在窗口样式中加入WS_SYSMODEL就可以建立排它式对话框,或者用SetSysModelWindow()函数建立。 这种对话框在应用程序中使用较少。,对话框管理器,对话框是一种窗口,因此需要窗口消息处理函数来处理进入对话框的消息,完成这一功能不仅靠一个函数,而是对话框管理器和对话框函数。,对话框管理器 DefDialogProc,消息,对话框消息处理函数 程序员编写,调用,windows,1 0,DefWindowProc,对话框消息处理函数与窗口消息处理函数,对话框消息处理函数与窗口消息处理函数十分
4、相似:,相同点 与窗口消息处理函数参数一致; 同为CALLBACK函数,都是由windows调用的; 函数结构都是switch语句;,对话框消息处理函数与窗口消息处理函数,不同点 窗口消息处理函数的返回值是LRESULT类型,被定义为int型;对话框消息处理函数返回BOOL类型,返回值只能是TRUE或FALSE; 如果窗口消息处理函数不处理某消息,则会调用DefWindowProc来处理;对话框消息处理函数处理该消息,会返回TRUE,不处理会返回FALSE; 对话框消息处理函数不需要处理WM_PAINT或者WM_DESTROY消息,对话框程序不接收WM_CREAT消息,而是在WM_INITDI
5、ALOG消息中完成初始化。,WM_INITDAILOG消息,WM_INITDAILOG消息是对话框创建时产生的消息,该消息只针对对话框的。,如果直接返回TRUE,windows将输入焦点设定给对话框中第一个具有WS_TABSTOP样式的控件。,也可以使用SetFocus来将输入焦点设定为对话框中的某个控件,然后传回FALSE。,WM_COMMAND消息,当对话框中的某个控件被点击时,控件发送给对话框的消息,控件的ID存放在wParam的低字中,对于这个消息,对话框清除了对话框。 其它消息,对话框消息处理函数返回FALSE。,例1About1程序,在窗口上添加菜单; 点击菜单,生成简单的Abou
6、t对话框。,创建对话框,选择“insert resource”,添加对话框; Control工具栏允许将部分控件拖放到对话框之上。,资源脚本,点击创建的资源脚本文件resource.rc,用记事本打开,能看到:,对话框名称:about 依据坐标系为:以父窗口显示区域的左上角为坐标原点 这里的坐标和大小不是像素,是针对对话框的特殊坐标系统:x坐标的宽度是字符宽的1/4,y是字符高的1/8,BEGIN与END定义控件 CTEXT是居中的文本 ID用于区别是哪个控件给对话框发送的消息,激活对话框,case WM_COMMAND: switch(LOWORD(wParam) case IDM_ABOU
7、T: DialogBox(g_hinst, TEXT(about), hwnd, AboutDlgProc); break; return 0; DialogBox:参数1是当前程序实例句柄,参数2是要激活的对话框的名称,参数3是父窗口句柄,参数4是对话框处理函数。 如果对话框名称是一个ID,也就是一个数字,可以用MAKEINTRESOURCE将它转换成一个字符串。 直到对话框结束之后,DialogBox才将控制权传回给WndProc。DialogBox的传回值是对话框程序内部呼叫的EndDialog函数的第二个参数。,当点击菜单项时,触发对话框,对话框消息处理函数,BOOL CALLBACK
8、 AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) switch (message) case WM_INITDIALOG : return TRUE ; case WM_COMMAND : switch (LOWORD (wParam) case IDOK : case IDCANCEL : EndDialog (hDlg, 0) ; return TRUE ; break ; return FALSE ;,当点击OK按钮时,关闭对话框,注意以下几点: 当对话框产生后,父窗口失去控制权,当关闭对话框后,父窗
9、口才重新获得控制权,这是模式对话框的性质。 当对话框被触发后,按钮ok拥有输入焦点,此时按下空格或enter键,Windows发送一个WM_COMMAND消息给对话框,并令wParam的低字组等于内定按键的ID,此时的ID为IDOK。 按下Escape键也可以关闭对话框,这时Windows将发送一个WM_COMMAND消息,并令ID等于IDCANCEL。 即使在显示对话框时,WndProc也可以继续接收消息。可以从对话框程序内部给WndProc发送消息。例如: SendMessage (GetParent (hDlg), . . . ) ;,对话框的属性,对话框控件,每种型态的控件都隐含一个特
10、定的预先定义窗口类和窗口样式。,除了表中所示的窗口样式外,每个控件还具有下面的样式: WS_CHILD | WS_VISIBLE,资源脚本的格式,对于这些控件型态,除了EDITTEXT、SCROLLBAR、LISTBOX和COMBOBOX之外,控件叙述的格式为: control-type text, id, xPos, yPos, xWidth, yHeight, iStyle 对于EDITTEXT、SCROLLBAR、LISTBOX和COMBOBOX,其格式为: control-type id, xPos, yPos, xWidth, yHeight, iStyle 控件型态EDITTEXT
11、会自动添加一个边框。如果想建立一个没有边框的编辑控件,可以使用: EDITTEXT IDC_EDIT,42,7,20,20, NOT WS_BORDER 如果想建立在正方形框左边包含文字的复选框,可以使用: CHECKBOX text, IDC_CHECK, 62, 7, 20, 20, BS_LEFTTEXT,资源脚本与函数调用,PUSHBUTTON OK, IDOK, 10, 20, 32, 14 上述的CONTROL被转换成一个CreateWindow调用,形式如下所示: hCtrl =CreateWindow (TEXT (button), TEXT (OK), WS_CHILD |
12、WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 10 * cxChar / 4, 20 * cyChar / 8, 32 * cxChar / 4, 14 * cyChar / 8, hDlg, IDOK, hInstance, NULL ) ;,例2About2程序,建立拥有对话框的程序。 父窗口上能绘制矩形或者椭圆,填充颜色; 在对话框中选择在形状和颜色,并在按下“ok”后,让父窗口绘制相应的内容,如果按下“cancel”,则不做改变。,全局变量,int color = IDC_BLACK; int figure = IDC_RECT; COLORREF
13、rgb_clo5 = RGB(0, 0, 0), RGB(0, 0, 255), RGB(255, 0, 0), RGB(0, 255, 0), RGB(255, 255, 255);,设置单选按钮1,方法一:利用循环,将hDlg中ID为color_next的设置选中,除此之外都设置为不选中: case IDC_BLACK: case IDC_RED: case IDC_GREEN: case IDC_BLUE: case IDC_WHITE: color_next = LOWORD(wParam); for (i = IDC_BLACK, i = IDC_WHITE, i+) SendMes
14、sage (GetDlgItem (hDlg, i), BM_SETCHECK, i = color_next, 0) ; return TRUE;,设置单选按钮2,方法二:针对对话框控件,有专门的函数SendDlgItemMessage: SendDlgItemMessage (hDlg, id, iMsg, wParam, lParam) ; 此处改写为: case IDC_WHITE: for (i = IDC_BLACK, i = IDC_WHITE, i+) SendDlgItemMessage (hDlg, i, BM_SETCHECK, i = LWORD (wParam), 0
15、) ;,设置单选按钮3,方法三: 使用CheckRadioButton 这个函数将ID在idFirst到idLast之间的所有单选按钮的选中标记都清除掉,除了ID为idCheck的单选按钮。所有ID必须是连续的。 case IDC_WHITE: color_next = LOWORD(wParam); CheckRadioButton(hDlg, IDC_BLACK, IDC_WHITE, color_next); return TRUE;,AboutDlgProc处理的消息,处理2种消息: WM_INITDIALOG 和WM_COMMAND: case WM_INITDIALOG : col
16、or_next = color; figure_next = figure; CheckRadioButton(hDlg, IDC_BLACK, IDC_WHITE, color); CheckRadioButton(hDlg, IDC_RECT, IDC_ELLI, figure); return TRUE ;,使得上次被选中的color和figure项被选中。,case WM_COMMAND : switch (LOWORD (wParam) case IDOK : color = color_next; figure = figure_next; EndDialog(hDlg, TRUE
17、); return TRUE; case IDCANCEL : EndDialog (hDlg, FALSE) ; return TRUE ;,DialogBox函数的返回值是EndDialog的参数2 OK返回TRUE CANCEL返回FALSE 当ok时,刷新父窗口,处理2组单选按钮消息,case IDC_BLACK: case IDC_RED: case IDC_GREEN: case IDC_BLUE: case IDC_WHITE: color_next = LOWORD(wParam); CheckRadioButton(hDlg, IDC_BLACK, IDC_WHITE, co
18、lor_next); return TRUE; case IDC_RECT: case IDC_ELLI: figure_next = LOWORD(wParam); CheckRadioButton(hDlg, IDC_RECT, IDC_ELLI, figure_next); return TRUE;,如何在对话框上绘图,静态控件,在CreateWindow函数中指定窗口类别为static,您就可以建立静态文字的子窗口控件。这些子窗口非常文静。它既不接收鼠标或键盘输入,也不向父窗口发送WM_COMMAND消息。 静态类别也包括了三种文字样式:SS_LEFT、SS_RIGHT和SS_CENT
19、ER。它们建立左对齐、置右对齐和居中文字。 文字在CreateWindow调用的窗口文字参数中给出,并且在以后可以用SetWindowText来改变它。,创建静态控件,hwnd_staic = CreateWindow ( TEXT(static), /窗口类名 TEXT (name: ), WS_CHILD | WS_VISIBLE | SS_CENTER, 10, 10, 100, 30, hwnd, (HMENU) 0, (LPCREATESTRUCT) lParam)-hInstance, NULL ) ;,静态控件的窗口样式,三个RECT样式(左列)是填入图案的矩形; 三个FRAME
20、样式(右列)是没有填入图案的矩形边框; 其中Black,Gray,White并不意味着黑白灰的颜色,而是由系统颜色决定的。,使用这些样式时,窗口文字被忽略,给静态控件写文字,静态类别也包括了三种文字样式:SS_LEFT、SS_RIGHT和SS_CENTER。它们建立左对齐、置右对齐和居中文字。文字在CreateWindow呼叫的窗口文字参数中给出,并且在以后可以用SetWindowText来改变它。 SetWindowText(hwnd_staic, TEXT(name is:);,例1静态控件,建立一个静态控件; 在其上显示文本;,本章重点,静态控件 滚动条控件 编辑控件 列表框控件,滚动条
21、控件,窗口滚动条,它出现在窗口的右边和底部。可以在建立窗口时通过将标识符WS_VSCROLL、WS_HSCROLL或者两者都包含在窗口样式中,让窗口加上滚动条。 滚动条控件是能在父窗口的显示区域的任何地方出现的子窗口。可以使用预先定义的窗口类别scrollbar以及两个滚动条样式SBS_VERT和SBS_HORZ中的一个来建立子窗口滚动条控件。,滚动条控件消息,按钮控件,编辑控件,滚动条控件,父窗口,窗口滚动条,消息附加参数,在处理滚动消息时,可以通过lParam参数来区分窗口滚动条与滚动条控件,子窗口滚动条其值为0,滚动条控件其值为滚动条窗口句柄。对窗口滚动条和滚动条控件来说,wParam参
22、数的高字组和低字组的含义相同。,lParam,WParam,通知码,滚动条:0,滚动条控件:控件窗口句柄,滚动控件的尺寸,窗口滚动条有固定的宽度; 滚动条控件的尺寸由CreateWindow中给定的矩形尺寸来确定。可以建立细而长的滚动条控件,也可以建立短而粗的滚动条控件。 如果您想建立与窗口滚动条尺寸相同的滚动条控件,那么可以使用GetSystemMetrics取得水平滚动条的高度: GetSystemMetrics (SM_CYHSCROLL) ; 取得垂直滚动条的宽度: GetSystemMetrics (SM_CXVSCROLL) ;,创建,hwnd_Scroll = CreateWin
23、dow ( TEXT (scrollbar), /窗口类名 NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_VERT, 0, 0, 0, 0, hwnd, (HMENU) 1, (LPCREATESTRUCT) lParam)-hInstance, NULL ) ;,如果希望在单击滚动条时,如果想使滚动条获得输入焦点,必须将WS_TABSTOP识别字包含到第三个参数中;,未完,本章重点,静态控件 滚动条控件 编辑控件 列表框控件,编辑控件,编辑类是最简单的预先定义窗口类;又是最复杂的窗口类。 当使用窗口类名edit建立子窗口时,根据CreateWi
24、ndow中的x位置、y位置、宽度和高度这些参数定义了一个矩形。此矩形含有可编辑文字。 当子窗口控件拥有输入焦点时,可以输入文字,移动光标,使用鼠标或者Shift键与一个光标键来选取部分文字,按Ctrl-X来删除所选文字或按Ctrl-C来复制所选文字、并送到剪贴板上,按Ctrl-V键插入剪贴板上的文字。,创建,hwnd_edit = CreateWindow ( TEXT (edit), /窗口类名 NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE , 0, 0, 0, 0, hwnd, (HMENU) 2, (LP
25、CREATESTRUCT) lParam)-hInstance, NULL ) ;,如果希望editbox能滚动: WS_HSCROLL:水平滚动条 WS_VSCROLL :垂直滚动条ES_AUTOHSCROLL:水平自动滚动 ES_AUTOVSCROLL:垂直自动滚动,例3文本编辑器,创建一个文本编辑器; 能输出键盘的输入,和回车,tab键等; 能水平垂直自动滚动; 能支持ctrl+c,ctrl+v,ctrl+x的操作;,POPPAD1是一个多行编辑器(只是没有文件I/O),预先定义的多行编辑控件只限于30,000字符的文字。POPPAD1本身并没有做多少工作,而是预定义的编辑控件完成的这些工作。,Editbox窗口样式,和静态控件一样,编辑控件中使用窗口样式ES_LEFT、ES_RIGHT和ES_CENTER来指定文本格式。 编辑控件默认是单行的。使用ES_MULTILINE窗口样式可以建立多行编辑控件。 编辑控件默认没有边框,利用样式WS_BORDER则可以增加边框。 使用ES_NOHIDESEL,在编辑控件没有输入焦点时被选择的文字仍然被加亮。 对于单行编辑控件,控件的高度必须可以容
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京师范大学2026年强基计划综合素质评价面试试题及参考答案
- 混凝土结构钢筋间距允许偏差值测量方法选择原则制定方法选择
- 爬虫数据采集优化课程设计
- 12.3 实验:电池电动势和内阻的测量 导学案-2022-2023学年物理高二上学期(人教版2019必修第三册)
- 2025-2026学年2.1.3列代数式 华东师大版数学七年级上学期(课件)
- 电子产品包装设计
- 鲁教版美术广而告之海报设计
- 口腔设计全流程解析
- 鼻咽喉科扁桃体炎护理规范
- 消化内科急性腹痛诊疗指南
- 2025年高考物理试题(浙江卷) 含答案
- 泵站设备安装与调试方案
- 金属冶炼(黑色金属铸造)主要负责人安全资格考试题库及答案
- 电梯故障维修处理方案
- 2025年河北省中考数学试卷真题(含答案逐题解析)
- 2025年高考湖南卷物理真题(解析版)
- 军品生产批次管理制度
- 中华人民传染病防治法
- 2025年04月中国热带农业科学院香料饮料研究所第一批公开招聘29人(第1号)笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 高中数学统计试题及答案
- 个体工商户登记备案申请书
评论
0/150
提交评论