第五篇 对话框控件的使用

来源:互联网 发布:软件测试转正心得体会 编辑:程序博客网 时间:2024/04/30 14:56

对话框对控件的支持使得建立对话框变得格外的简单,而不需要再像建立普通窗口那样

麻烦。用户只需在资源文件中定义好控件,那么Windows在初始化对话框时就会为我们

把控件一一添加上去。当然,用户还需要对控件进行一些初始化的工作。

 

一、控件使用

1、控件的定义

control  文本 , ID , 类 , 风格 , x , y , 宽度 ,高度 [ ,扩展风格 ]

其中值得注意的是 文本 是控件的初始化值。

这种定义较为麻烦,RC.EXE还为用户提供了一种更加简单的定义方法。

控件名称  [ 文本, ]  ID , x , y , 宽度 , 高度   [ ,风格] [ ,扩展风格 ]

控件名称主要如下:

2、为什么可以在资源文件中定义即可?

这是因为Windows在初始化对话框时将每一天控件定义语句转化为:

invokeCreateWindow,类名,文本,风格,x,y,宽度,高度,\对话框窗口句柄,ID,hInstance,NULL

3、实例

#include<resource.h>#defineICO_MAIN0x1000  //图标#defineDLG_MAIN1       //对话框//位图文件ID#defineIDB_11#defineIDB_22//控件ID#defineIDC_ONTOP101#defineIDC_SHOWBMP102#defineIDC_ALOW103#defineIDC_MODALFRAME104#defineIDC_THICKFRAME105#defineIDC_TITLETEXT106#defineIDC_CUSTOMTEXT107#defineIDC_BMP108#defineIDC_SCROLL109#defineIDC_VALUE110//定义图标以及两个位图ICO_MAINICON"Main.ico"IDB_1BITMAP"Picture1.bmp"IDB_2BITMAP"Picture2.bmp"//定义对话框DLG_MAINDIALOG193,180,310,134//对话框属性定义STYLEDS_MODALFRAME | WS_POPUP | WS_VISIBLE |     WS_CAPTION | WS_SYSMENU | WS_THICKFRAME |WS_MAXIMIZEBOX | WS_MINIMIZEBOX CAPTION"对话框窗口控件实例"FONT9,"宋体"BEGIN//子窗口控件定义GROUPBOX "选项",-1,55,5,120,100AUTOCHECKBOX "总在最前面",IDC_ONTOP,65,20,100,12AUTOCHECKBOX "显示图片",IDC_SHOWBMP,65,35,100,12AUTOCHECKBOX "允许更换图片",IDC_ALOW,65,50,100,12CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,60,65,110,1AUTORADIOBUTTON "模态边框(&Modal Frame)",IDC_MODALFRAME,65,70,100,12,WS_TABSTOPAUTORADIOBUTTON "可变边框(&Thick Frame)",IDC_THICKFRAME,65,85,100,12,WS_TABSTOPGROUPBOX "标题栏文字",-1,180,5,125,100,BS_GROUPBOXCOMBOBOX IDC_TITLETEXT,190,20,105,70,CBS_DROPDOWNLIST | WS_TABSTOPLTEXT "自定义文字: ",-1,190,40,105,10EDITTEXT IDC_CUSTOMTEXT,190,55,105,12LTEXT "请在此选择显示在标题栏上面的文字,或者选择'自定义'后自行输入",-1,191,73,105,26,WS_BORDERCONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,5,110,300,1DEFPUSHBUTTON "更换图片(&C)",IDOK,200,115,50,14PUSHBUTTON "退出(&X)",IDCANCEL,255,115,50,14;这条语句定义了一个图片框CONTROL IDB_1,IDC_BMP,"Static",SS_BITMAP | WS_CHILD | WS_VISIBLE,5,5,40,95       SCROLLBAR IDC_SCROLL,6,119,125,10LTEXT "0",IDC_VALUE,138,120,50,8END


 

二、如何在代码中使用资源?

这里的主要内容就涉及两个方面的内容:

1、调用DialogBoxParam建立对话框时,对话框管理器会自动按照资源文件中定义的对话框模版为用户建立起

对话框。

把用户自定义的对话框过程中WM_INITDIALOG消息去掉:

即去掉该段:

 .elseifeax == WM_INITDIALOG;获得位图句柄备用invokeLoadBitmap,hInstance,IDB_1movhBmp1,eaxinvokeLoadBitmap,hInstance,IDB_2movhBmp2,eax;设置对话框图标invokeLoadIcon,hInstance,ICO_MAINinvokeSendMessage,hWnd,WM_SETICON,ICON_SMALL,\eax;组合框的下拉项的三项内容invokeSendDlgItemMessage,hWnd,IDC_TITLETEXT,\CB_ADDSTRING,0,addr szText1invokeSendDlgItemMessage,hWnd,IDC_TITLETEXT,\CB_ADDSTRING,0,addr szText2invokeSendDlgItemMessage,hWnd,IDC_TITLETEXT,\CB_ADDSTRING,0,offset szText3;设置组合框的初始内容invokeSendDlgItemMessage,hWnd,IDC_TITLETEXT,\CB_SETCURSEL,0,0;灰化自定义框invokeGetDlgItem,hWnd,IDC_CUSTOMTEXTinvokeEnableWindow,eax,FALSE;选中"显示图片"invokeCheckDlgButton,hWnd,IDC_SHOWBMP,BST_CHECKED;选中"允许更换图片"invokeCheckDlgButton,hWnd,IDC_ALOW,BST_CHECKED;选中"可变边框"invokeCheckDlgButton,hWnd,IDC_THICKFRAME,BST_CHECKED;设置滚动条的范围invokeSendDlgItemMessage,hWnd,IDC_SCROLL,\SBM_SETRANGE,0,100

可以发现建立的对话框如下:

显然其中没有任何对对话框的初始化,因为初始化的工作需要用户在自定义的对话框过程中

处理。

2、对对话框控件的操作的处理。

操作对话框控件时,对话框过程会接收到WM_COMMAD消息,其wParam参数的低十六位即为用户定义

的ID。可以据此对不同的操作进行处理。另外,值得注意的是,操作滚动条时是不会发送WM_COMMAND

消息的,发送的WM_HSCROLL或WM_VSCROLL。

3、主程序

主程序是相对简单的,只要调用GetModuleHandle获得实例的句柄,保存以备用;然后调用DialogBoxParam

建立模态对话框;最后就是在对话框销毁后调用ExitProcess退出进程。

4、例子代码

.386.modelflat,stdcalloptioncasemap:noneincludewindows.incincludeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.libincludegdi32.incincludelibgdi32.lib;此处的equ定义要和资源文件中的定义一一对应ICO_MAINequ1000hDLG_MAINequ1IDB_1equ1IDB_2equ2IDC_ONTOPequ101IDC_SHOWBMPequ102IDC_ALOWequ103IDC_MODALFRAMEequ104IDC_THICKFRAMEequ105IDC_TITLETEXTequ106IDC_CUSTOMTEXTequ107IDC_BMPequ108IDC_SCROLLequ109IDC_VALUEequ110.data?;实例句柄与位图句柄hInstancedd?hBmp1dd?hBmp2dd?;滚动条位置dwPosdd?.const;0代表字符串的结束,必须以0结束szText1db'Hello,World!',0szText2db'Title change!',0szText3db'user-defined!',0.code;用户定义的对话框过程_ProcDlgMainprocuses edi ebx esi hWnd,wMsg,wParam,lParamlocal@szBuffer[128]:bytelocal@stPsmoveax,wMsg.ifeax == WM_CLOSE;销毁对话框,释放位图资源invokeEndDialog,hWnd,NULLinvokeDeleteObject,hBmp1invokeDeleteObject,hBmp2 .elseifeax == WM_INITDIALOG;获得位图句柄备用invokeLoadBitmap,hInstance,IDB_1movhBmp1,eaxinvokeLoadBitmap,hInstance,IDB_2movhBmp2,eax;设置对话框图标invokeLoadIcon,hInstance,ICO_MAINinvokeSendMessage,hWnd,WM_SETICON,ICON_SMALL,\eax;组合框的下拉项的三项内容invokeSendDlgItemMessage,hWnd,IDC_TITLETEXT,\CB_ADDSTRING,0,addr szText1invokeSendDlgItemMessage,hWnd,IDC_TITLETEXT,\CB_ADDSTRING,0,addr szText2invokeSendDlgItemMessage,hWnd,IDC_TITLETEXT,\CB_ADDSTRING,0,offset szText3;设置组合框的初始内容invokeSendDlgItemMessage,hWnd,IDC_TITLETEXT,\CB_SETCURSEL,0,0;灰化自定义框invokeGetDlgItem,hWnd,IDC_CUSTOMTEXTinvokeEnableWindow,eax,FALSE;选中"显示图片"invokeCheckDlgButton,hWnd,IDC_SHOWBMP,BST_CHECKED;选中"允许更换图片"invokeCheckDlgButton,hWnd,IDC_ALOW,BST_CHECKED;选中"可变边框"invokeCheckDlgButton,hWnd,IDC_THICKFRAME,BST_CHECKED;设置滚动条的范围invokeSendDlgItemMessage,hWnd,IDC_SCROLL,\SBM_SETRANGE,0,100.elseifeax == WM_COMMAND;用户操作对话框中定义的控件时,对话框过程会收到消息WM_COMMAND,;消息的wParam的第十六位用户定义的控件IDmoveax,wParam.ifax == IDCANCELinvokeEndDialog,hWnd,NULLinvokeDeleteObject,hBmp1invokeDeleteObject,hBmp2.elseifax == IDOKmoveax,hBmp1xchgeax,hBmp2movhBmp1,eaxinvokeSendDlgItemMessage,hWnd,IDC_BMP,\STM_SETIMAGE,IMAGE_BITMAP,eax.elseifax == IDC_ONTOPinvokeIsDlgButtonChecked,hWnd,IDC_ONTOP.ifeax == BST_CHECKEDinvokeSetWindowPos,hWnd,HWND_TOPMOST,\0,0,0,0,SWP_NOMOVE or SWP_NOSIZE.elseinvokeSetWindowPos,hWnd,HWND_NOTOPMOST,\0,0,0,0,SWP_NOMOVE or SWP_NOSIZE.endif.elseifax == IDC_SHOWBMPinvokeGetDlgItem,hWnd,IDC_BMPmovebx,eaxinvokeIsWindowVisible,ebx.ifeaxinvokeShowWindow,ebx,SW_HIDE.elseinvokeShowWindow,ebx,SW_SHOW.endif.elseifax == IDC_ALOWinvokeIsDlgButtonChecked,hWnd,IDC_ALOW.ifeax == BST_CHECKEDmovebx,TRUE.elsemovebx,FALSE.endifinvokeGetDlgItem,hWnd,IDOKinvokeEnableWindow,eax,ebx.elseifax == IDC_MODALFRAMEinvokeGetWindowLong,hWnd,GWL_STYLEandeax,not WS_THICKFRAMEinvokeSetWindowLong,hWnd,GWL_STYLE,eax.elseifax == IDC_THICKFRAMEinvokeGetWindowLong,hWnd,GWL_STYLEoreax,WS_THICKFRAMEinvokeSetWindowLong,hWnd,GWL_STYLE,eax.elseifax == IDC_TITLETEXTshreax,16.ifax == CBN_SELENDOKinvokeSendDlgItemMessage,hWnd,\IDC_TITLETEXT,\CB_GETCURSEL,0,0.ifeax == 2invokeGetDlgItem,hWnd,\IDC_CUSTOMTEXTinvokeEnableWindow,eax,\TRUE.elsemovebx,eaxinvokeSendDlgItemMessage,\hWnd,IDC_TITLETEXT,\CB_GETLBTEXT,ebx,\addr @szBufferinvokeSetWindowText,hWnd,\addr @szBufferinvokeGetDlgItem,hWnd,\IDC_CUSTOMTEXTinvokeEnableWindow,eax,\FALSE.endif.endif.elseifax == IDC_CUSTOMTEXTinvokeGetDlgItemText,hWnd,IDC_CUSTOMTEXT,\addr @szBuffer,sizeof @szBufferinvokeSetWindowText,hWnd,addr @szBuffer.endif;注意,操作滚动条,不会收到WM_COMMAND消息,而是WM_HSCROLL.elseifeax == WM_HSCROLLmoveax,wParam;左移一位.ifax == SB_LINELEFTdecdwPos;右移一位.elseifax == SB_LINERIGHTincdwPos;左移一页,移动长度自定义.elseifax == SB_PAGELEFTsubdwPos,20;右移一页.elseifax == SB_PAGERIGHTadddwPos,10;拖动滚动条.elseifax == SB_THUMBPOSITION || ax == SB_THUMBTRACKmoveax,wParamshreax,16movdwPos,eax.else;有些滚动条事件未处理,留给对话框管理器moveax,FALSE   ret.endif;保证滚动条范围为0~100cmpdwPos,0jge@FmovdwPos,0@@:cmpdwPos,100jle@FmovdwPos,100@@:invokeSetDlgItemInt,hWnd,IDC_VALUE,dwPos,FALSEinvokeSendDlgItemMessage,hWnd,IDC_SCROLL,\SBM_SETPOS,dwPos,TRUE.elsemoveax,FALSEret.endifmoveax,TRUEret_ProcDlgMainendpstart:invokeGetModuleHandle,NULLmovhInstance,eax;调用建立模态对话框的程序,改程序一直到对话框销毁才返回invokeDialogBoxParam,hInstance,DLG_MAIN,\NULL,offset _ProcDlgMain,NULLinvokeExitProcess,NULLendstart

5、例子运行结果

可见,其中有了对对话框的初始化。

 

三、控件资源文件下载

 

 

原创粉丝点击