第五篇 對話方塊控制項的使用

來源:互聯網
上載者:User

對話方塊對控制項的支援使得建立對話方塊變得格外的簡單,而不需要再像建立普通視窗那樣

麻煩。使用者只需在資源檔中定義好控制項,那麼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、例子運行結果

可見,其中有了對對話方塊的初始化。

 

三、控制項資源檔下載

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.