青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

luqingfei@C++

為中華之崛起而崛起!
兼聽(tīng)則明,偏聽(tīng)則暗。

Win32匯編--使用資源--對(duì)話框--在對(duì)話框中使用子窗口控件(2)

 

2、子窗口控件的通用使用方法

       由于子窗口控件實(shí)際上就是窗口,大部分窗口函數(shù)對(duì)它們都是適用的,如可以用EnableWindow在灰化和允許狀態(tài)之間切換,可以用ShowWindow在顯示和隱藏之間切換,可以用GetWindowTextSetWindowText來(lái)改變上面的文字,也可以用MoveWindow來(lái)改變大小和移動(dòng)位置等。在Control.asm中用“顯示圖片”復(fù)選框切換圖片框的隱藏和顯示,用的就是ShowWindow函數(shù),處理“允許更換圖片”復(fù)選框時(shí)切換“更換圖片”按鈕的狀態(tài),用的是EnableWindow函數(shù)。

 

       除了可以用對(duì)子窗口控件使用窗口的通用函數(shù)外,還可以使用針對(duì)它們的專用函數(shù)。下面介紹一些常用的函數(shù)。

 

       在資源腳本文件中定義的是控件的ID,當(dāng)這些子窗口控件被創(chuàng)建以后同樣會(huì)有一個(gè)窗口句柄,但既然它們不是由我們由自己創(chuàng)建的,那么怎么知道它們的窗口句柄呢?有一個(gè)函數(shù)可以從ID中獲取子窗口句柄:

       invoke GetDlgItem, hDlg, dwIDDlgItem

       mov    hDlgItem, eax

       函數(shù)的輸入?yún)?shù)是對(duì)話框句柄和ID值,返回值是子窗口句柄;反過(guò)來(lái),有兩種方法可以從子窗口句柄獲取ID

       1invoke GetDlgCtrolID, hWndCtrl ;輸入子窗口句柄,返回值是控件ID

       2invoke GetWindowLong, hWndCtrl, GWL_ID

 

       當(dāng)需要向控件發(fā)送消息的時(shí)候,當(dāng)然可以先用GetDlgItem獲取子窗口句柄再用SendMessage函數(shù),但有一個(gè)函數(shù)更為簡(jiǎn)便:

       invoke SendDlgItemMessage, hDlg, dwIDDlgItem, Msg, wParam, lParam

 

       這個(gè)函數(shù)可以直接向控件發(fā)送消息,只需要在參數(shù)中指定對(duì)話框句柄和子窗口ID(注意:并沒(méi)有PostDlgItemMessage這樣的函數(shù)!)。

 

       如果要想知道在一個(gè)控件上按下了Tab鍵或Shift+Tab鍵會(huì)跳到哪一個(gè)控件上去,也就是說(shuō)下一個(gè)或上一個(gè)Tab停留位在哪里,可以使用GetNextDlgTabItem函數(shù):

       invoke GetNextDlgTabItem, hDlg, hCtl, bPrevious

       .if eax

        mov hWinNext, eax

.endif

 

其中的bPrevious參數(shù)指定了搜索的方向;與之相似,使用GetNextDlgGroupItem函數(shù)可以返回下一個(gè)分組的位置:

invoke GetNextDlgGroupItem, hDlg, hCtl, bPrevious

.if eax

   mov hWinNext, eax

.endif

 


3
、使用單選鈕和復(fù)選框

       單選鈕是互斥的選擇鈕,同一組的多個(gè)單選鈕只能有一個(gè)被選中,單選鈕的外形是一個(gè)圓形的標(biāo)記加上文本,圓形中有黑點(diǎn)表示被選中。復(fù)選框不是互斥的,多個(gè)復(fù)選框的狀態(tài)不會(huì)互相影響,復(fù)選框的外形是一個(gè)方框加上文本,方框中可以用有無(wú)對(duì)鉤來(lái)表示是否被選中。

 

       單選鈕和復(fù)選框控件都是基于Button類的,只不過(guò)它們的窗口風(fēng)格分別是BS_RADIOBUTTONBS_CHECKBOX。既然它們是特殊的“按鈕”,所以和它們有關(guān)的函數(shù)都帶有“Button”一詞,查看一個(gè)單選鈕或復(fù)選框是否被選中可以用下面的函數(shù)來(lái)檢測(cè):

       invoke IsDlgButtonChecked, hDlg, nIDButton

       函數(shù)的返回值可能是BST_CHECKED(選中狀態(tài)),BST_INDETERMINATE3態(tài)復(fù)選框的灰化狀態(tài))或BST_UNCHECKED(未選中狀態(tài))。也可以用向子窗口控件發(fā)送BM_GETCHECK消息的方法來(lái)檢測(cè),返回值和上面的函數(shù)是一樣的。

 

       如果想設(shè)置單選鈕或復(fù)選框的狀態(tài),可以使用下面的語(yǔ)句:

       invoke CheckDlgButton, hDlg, nIDButton, uCheck

       參數(shù)uCheckBST_CHECKEDBST_INDETERMINATEBST_UNCHECKED來(lái)表示需要設(shè)置的狀態(tài),含義同上。向控件發(fā)送BM_SETCHECK消息也可以取得同樣的效果,這時(shí)消息的wParam中放置需要設(shè)置的狀態(tài)。

 

       復(fù)選框是不互斥的,所以可以隨意設(shè)置狀態(tài)。而對(duì)于BS_RADIOBUTTON風(fēng)格的單選鈕來(lái)說(shuō),并不是把某個(gè)按鈕設(shè)置為選中狀態(tài)以后,同組的其他按鈕就會(huì)自動(dòng)變成非選中狀態(tài),所以用CheckDlgButton函數(shù)選中了一個(gè)單選鈕以后,如果不是手動(dòng)把同組的其他按鈕全部改為非選中狀態(tài)(逐個(gè)地調(diào)用CheckDlgButton),就會(huì)看到同時(shí)有兩個(gè)單選鈕是選中的。但把同組的所有單選鈕逐個(gè)地設(shè)置顯得有點(diǎn)麻煩,所以針對(duì)單選鈕有一個(gè)專用函數(shù):

       invoke CheckRadioButton, hDlg, nIDFirstButton, nIDLastButton, nIDCheckButton

       這個(gè)函數(shù)把IDnIDFirstButtonnIDLastButton之間的單選鈕全部設(shè)置為非選中狀態(tài),只有nIDCheckButton是選中狀態(tài),當(dāng)然在使用中要注意將這一批ID定義為連續(xù)的數(shù)值。

       如果還嫌CheckRadioButton有點(diǎn)麻煩,還有一種最簡(jiǎn)單的辦法——使用自動(dòng)單選鈕,同組的AUTORADIOBUTTON會(huì)隨著用戶選中一個(gè)而自動(dòng)清除其他單選鈕的狀態(tài),所以在程序中只需要在初始化的時(shí)候預(yù)設(shè)一次,其他時(shí)間就可以不必關(guān)心設(shè)置問(wèn)題了,以后唯一用到的就是調(diào)用IsDlgButtonChecked檢查狀態(tài)了。

 

4、使用靜態(tài)控件

       靜態(tài)控件是基于Static類的子窗口控件,之所以叫“靜態(tài)”控件,是因?yàn)樗?#8220;安靜”的——它們不向?qū)υ捒虬l(fā)送WM_COMMAND消息,所以靜態(tài)控件的ID一般是沒(méi)有用處的,定義時(shí)常常將它們定義為-1,如果需要在程序中改變屬性,那么也可以為靜態(tài)控件指定一個(gè)唯一的ID

 

       資源腳本文件中可以使用縮寫的基于Static類的有LTEXTCTEXTRTEXT(文本框)和ICON(圖標(biāo)框),除了這些常用的類型之外,Static類還可以用CONTROL語(yǔ)句通過(guò)指定不同的窗口風(fēng)格派生出不同用途的控件來(lái)。

 

       下面說(shuō)明靜態(tài)控件的一些用法。

       對(duì)于文本框,文本長(zhǎng)度超過(guò)邊界的時(shí)候默認(rèn)是自動(dòng)換行的,但如果同時(shí)指定SS_SIMPLE風(fēng)格的話,就不會(huì)自動(dòng)換行。讀者可以在程序中用SetWindowText或發(fā)送WM_SETTEXT消息來(lái)動(dòng)態(tài)改變顯示的文本,同樣,也可以用GetWindowText或發(fā)送WM_GETTEXT消息來(lái)獲取其中的文本。

 

       靜態(tài)控件可以用來(lái)構(gòu)筑簡(jiǎn)單的線條和圖形,如果指定SS_BLACKFRAMESS_GRAYFRAMESS_WHITEFRAME風(fēng)格,那么靜態(tài)控件顯示為填充的矩形,填充顏色分別是黑色、灰色或白色;而指定SS_BLACKRECTSS_GRAYRECTSS_WHITERECT風(fēng)格的話,則顯示為非填充的矩形框,邊線顏色是黑色、灰色或白色。

 

       靜態(tài)控件也可以用來(lái)做立體感的線條或邊框,指定SS_ETCHEDHORZ風(fēng)格顯示為橫線,指定SS_ETCHEDVERT風(fēng)格顯示為豎線,指定SS_ETCHEDFRAME風(fēng)格則顯示為立體的矩形框,視覺(jué)上的效果似于沒(méi)有文字的GROUPBOX

 

       靜態(tài)控件還有一個(gè)用途是做圖形顯示,當(dāng)圖形是圖標(biāo)的時(shí)候,用ICON語(yǔ)句就可能定義了,其默認(rèn)的風(fēng)格是SS_ICON,如果想使用位圖,那么可以指定SS_BITMAP風(fēng)格,例子程序中的圖片框就是這樣定義的。

CONTROL IDB_1, IDC_BMP, “Static”, SS_BITMAP | WS_CHILD | WS_VISIBLE, 5, 5, 40, 95

       在這里,“文字”部分指定位圖資源的ID,前面已經(jīng)把Picture1.bmp的資源ID定義為IDB_1IDC_BMP是圖片框自己的ID,如果不需要在程序中改變圖片的話,那么這里可以定義為-1

 

       在程序中可以通過(guò)向控件發(fā)送STM_SETIMAGE消息來(lái)設(shè)置新的圖片,消息的wParam指定圖片的格式,取值可以是IMAGE_BITMAPIMAGE_CURSORIMAGE_ICON,分別對(duì)應(yīng)新圖片的格式,lParam是圖片的句柄,如果是位圖,lParam就是用LoadBitmap裝入的位圖句柄,同樣,圖片類型是光標(biāo)和圖標(biāo)的時(shí)候,這里就是用LoadCursorLoadIcon裝入的句柄。

 

       在例子程序中,用來(lái)改變圖片框圖片的語(yǔ)句是:

       invoke SendDlgItemMessage, hWnd, IDC_BMP, STM_SETIMAGE, IMAGE_BITMAP, eax

       eax中是位圖句柄,IDC_BMP是圖片框的IDwParamIMAGE_BITMAP表示要設(shè)置的圖片類型是位圖。

 

5、使用文本編輯控件

       文本編輯控件是基于Edit類的控件,可以用縮寫EDITTEXT定義,讀者可以在文本編輯控件中輸入并編輯文本。每當(dāng)用戶在文本編輯控件中輸入一個(gè)字符的時(shí)候,控件就會(huì)向?qū)υ捒蜻^(guò)程發(fā)送一個(gè)WM_COMMAND消息,所以在例子程序中,當(dāng)在自定義文字的編輯框中每輸入一個(gè)字,標(biāo)題欄文字就會(huì)馬上改變。

 

       要獲取編輯框中的文本有多種方法,可以用GetWindowText,也可以用發(fā)送WM_GETTEXT消息的辦法,要設(shè)置文本,同樣可以用SetWindowText或發(fā)送WM_SETTEXT,但最簡(jiǎn)便的辦法還是使用下面的函數(shù):

       invoke GetDlgItemText, hDlg, nIDDlgItem, lpString, nMaxCount      ;取文本

       invoke SetDlgItemText, hDlg, nIDDlgItem, lpString                         ;設(shè)置文本

       lpString是放置字符的緩沖區(qū)地址,用GetDlgItemText函數(shù)來(lái)獲取文本的時(shí)候,要用nMaxCount參數(shù)指定緩沖區(qū)的最大長(zhǎng)度,以免獲取的文本長(zhǎng)度超過(guò)緩沖區(qū)長(zhǎng)度引起溢出,設(shè)置的時(shí)候若使用SetDlgItemText函數(shù)時(shí)就不需要這個(gè)參數(shù)。

 

       在實(shí)際使用中,經(jīng)常要在文本編輯控件中輸入輸出數(shù)值型參數(shù),將文本轉(zhuǎn)換為數(shù)值比較麻煩,把數(shù)值轉(zhuǎn)換為文本也要經(jīng)過(guò)一個(gè)wsprintf調(diào)用,為了簡(jiǎn)化操作,Windows提供了兩個(gè)函數(shù)來(lái)處理這個(gè)問(wèn)題:

       invoke SetDlgItemInt, hDlg, nIDDlgItem, uValue, bSigned                ;設(shè)置控件中的數(shù)值

       invoke GetDlgItemInt, hDlg, nIDDlgItem, lpTranslated, bSigned              ;取控件中的數(shù)值

       SetDlgItemInt函數(shù)將uValue參數(shù)先轉(zhuǎn)換成字符串格式,然后設(shè)置到文本編輯控件中,bSigned參數(shù)指定了uValue的格式,如果是TRUE的話,表示uValue是有符號(hào)數(shù);是FALSE的話,表示uValue是無(wú)符號(hào)數(shù)。

       GetDlgItemInt函數(shù)則將對(duì)話框中的文本轉(zhuǎn)換成數(shù)值型返回,同樣,用bSigned指定轉(zhuǎn)換的方式,TRUE表示按照符號(hào)數(shù)格式轉(zhuǎn)換,這時(shí)函數(shù)會(huì)檢測(cè)文本的第一個(gè)字符是不是負(fù)號(hào);FALSE則按照無(wú)符號(hào)數(shù)轉(zhuǎn)換。參數(shù)lpTranslated是指向一個(gè)dword型變量的指針,GetDlgItemInt會(huì)在這個(gè)變量中返回BOOL類型值表示函數(shù)是否調(diào)用成功,成功則返回TRUE,有這樣一個(gè)參數(shù)的原因是函數(shù)的返回值用來(lái)返回轉(zhuǎn)換后的數(shù)值了,以至于沒(méi)有地方可以表示函數(shù)是否執(zhí)行成功。當(dāng)然,lpTranslated參數(shù)也可以輸入NULL,這樣,當(dāng)函數(shù)返回0的時(shí)候就無(wú)法知道是文本框是“0還是文本不符合格式造成轉(zhuǎn)換失敗。

 

       SetDlgItemIntGetDlgItemInt函數(shù)不僅適用于文本編輯控件,所有對(duì)其上面的文本可以修改的控件都可以使用它們。

 

       使用文本編輯控件的時(shí)候,文本的長(zhǎng)度也是個(gè)需要注意的問(wèn)題。如果控件的寬度定義得過(guò)窄,當(dāng)字符填充到最右邊的時(shí)候,編輯框就不允許繼續(xù)輸入了,為了繼續(xù)輸入并讓文本自動(dòng)卷動(dòng),可以指定WS_HSCROLL風(fēng)格;反之,定義WS_HSCROLL風(fēng)格后輸入文本的長(zhǎng)度不受限制又不好,那么可以用向控件發(fā)送EM_LIMITTEXT消息的方式來(lái)設(shè)定最大長(zhǎng)度。

 

       下面的例子將IDC_EDIT的輸入最大長(zhǎng)度定為10個(gè)字符:

       invoke SendDlgItemMessage, hDlg, IDC_EDIT, EM_LIMITTEXT, 10, NULL

 

       另外,有時(shí)候可能需要把編輯框設(shè)置為只讀的(和灰化不同,灰化的編輯框中文本無(wú)法進(jìn)行任何操作,包括卷動(dòng)操作,而只讀的僅僅是不能修改),要把初始狀態(tài)定義為只讀的,只需在定義語(yǔ)句中加上ES_READONLY風(fēng)格,在程序中需要?jiǎng)討B(tài)改變只讀狀態(tài)可以發(fā)送EM_SETREADONLY消息,下面的第一句把編輯框設(shè)為只讀,第二句把編輯框改回到可寫狀態(tài):

       invoke SendDlgItemMessage, hDlg, IDC_EDIT, EM_SETREADONLY, TRUE, NULL ;只讀

       invoke SendDlgItemMessage, hDlg, IDC_EDIT, EM_SETREADONLY, FALSE, NULL;可寫

 

       文本編輯框在默認(rèn)狀態(tài)下是單行的,也可以通過(guò)加上EM_MULTILINE風(fēng)格變成多行的,這時(shí)可以同時(shí)加上WS_VSCROLL風(fēng)格顯示一個(gè)垂直方向的滾動(dòng)條。

 

6、使用滾動(dòng)條

       滾動(dòng)條有水平和垂直兩種,默認(rèn)的SCROLLBAR語(yǔ)句定義的是水平的滾動(dòng)條,它的默認(rèn)風(fēng)格是SBS_HORZ,例子程序中用下面的語(yǔ)句定義了一個(gè)水平滾動(dòng)條:

       SCROLLBAR IDC_SCROLL, 6, 118, 125, 10

       如果要定義垂直的滾動(dòng)條,那么要指明SBS_VERT風(fēng)格:

       SCROLLBAR IDC_SCROLL, x, y, 寬度, 高度, SBS_VERT

 

       和其他子窗口控件發(fā)送WM_COMMAND消息不同,水平滾動(dòng)條向?qū)υ捒虼翱诎l(fā)送WM_HSCROLL消息,而垂直滾動(dòng)條則發(fā)送WM_VSCROLL消息,所以針對(duì)兩種方式的滾動(dòng)條要分別處理不同的消息。

 

       WM_xSCROLL消息的參數(shù)如下所示:

       wParam的低16 = nScrollCode             ;動(dòng)作碼

       wParam的高16 = nPos                       ;滾動(dòng)條當(dāng)前位置

       lParam = hwndScrollBar                                   ;滾動(dòng)條控件的窗口句柄

 

       其中nScrollCode代表了滾動(dòng)條的當(dāng)前動(dòng)作,定義值及其含義如下:

       SB_BOTTOM                      滾動(dòng)條移到了最下/右邊。

       SB_ENDSCROLL                用戶停止了滾動(dòng)動(dòng)作。

       SB_THUMBPOSITION        滾動(dòng)條被拖動(dòng)到某處。

       SB_THUMBTRACK             滾動(dòng)條在拖動(dòng)中。

       SB_TOP                              滾動(dòng)條移到了最上/左邊。

       SB_LINELEFT                    滾動(dòng)條左移了一格(對(duì)于水平滾動(dòng)條)。

       SB_LINERIGHT                  滾動(dòng)條右移了一格(對(duì)于水平滾動(dòng)條)。

       SB_PAGELEFT                    滾動(dòng)條左移了一頁(yè)(對(duì)于水平滾動(dòng)條)。

       SB_PAGERIGHT                 滾動(dòng)條右移了一頁(yè)(對(duì)于水平滾動(dòng)條)。

       SB_LINEDOWN                  滾動(dòng)條下移了一格(對(duì)于垂直滾動(dòng)條)。

       SB_LINEUP                        滾動(dòng)條上移了一格(對(duì)于垂直滾動(dòng)條)。

       SB_PAGEDOWN                 滾動(dòng)條下移了一頁(yè)(對(duì)于垂直滾動(dòng)條)。

       SB_PAGEUP                        滾動(dòng)條上移了一頁(yè)(對(duì)于垂直滾動(dòng)條)。

 

       nPos的值只有當(dāng)動(dòng)作碼是SB_THUMBPOSITIONSB_THUMBTRACK時(shí)才有效,其他的時(shí)候?yàn)?/span>0

 

       第一眼看到SB_xxx動(dòng)作碼的時(shí)候,讀者可能會(huì)以為水平滾動(dòng)條和垂直滾動(dòng)條的動(dòng)作碼是不相同的——水平滾動(dòng)條是SB_xxxLEFTSB_xxxRIGHT,而垂直滾動(dòng)條是SB_xxxUPSB_xxxDOWN,但在Windows.inc中查看一下就可以發(fā)現(xiàn),SB_xxxLEFTSB_xxxUP在數(shù)值上是相同的,SB_xxxRIGHTSB_xxxDOWN也是如此,所以不同定義方法只是為了直觀起見(jiàn)而已。

 

       以水平滾動(dòng)條為例,處理滾動(dòng)條消息的代碼一般是如下結(jié)構(gòu):

       .elseif eax == WM_HSCROLL          ;窗口的消息處理分支,eaxwMsg

              mov eax, lParam

           .if    eax == hWnd滾動(dòng)條1

                 mov eax, wParam

                 .if ax == SB_LINELEFT

                     dec 位置變量

                 .elseif ax == SB_LINERIGHT

                     inc   位置變量

                 .elseif ax == SB_PAGELEFT

                     sub   位置變量,頁(yè)長(zhǎng)

                 .elseif ax == SB_PAGERIGHT

                     add   位置變量,頁(yè)長(zhǎng)

                 .elseif ax == SB_THUMBPOSITION || ax == SB_THUMBTRACK

                     mov   eax, wParam

                     shr    eax, 16

                     mov   位置變量,eax

                 .endif

       .elseif eax == hWnd滾動(dòng)條2

           ;處理滾動(dòng)條2的代碼,同上面的結(jié)構(gòu)

.endif

 

在例子程序Control.asm中只定義了一個(gè)滾動(dòng)條,所有的消息肯定都是它發(fā)出的,所以去掉了判斷lParam是哪個(gè)滾動(dòng)條的步驟直接處理wParam中的動(dòng)作碼。

 

在用戶按動(dòng)滾動(dòng)條后,滾動(dòng)條不會(huì)自己移動(dòng)位置,它只是將用戶的動(dòng)作以WM_xSCROLL消息的形式反饋給程序,真正要移動(dòng)它還是要靠程序來(lái)設(shè)置,所以代碼中要根據(jù)不同的動(dòng)作首先計(jì)算新的位置,并判斷新的位置是否越界,例子程序中的這些代碼判斷新的位置是否超出0~100的范圍,如果是,則校正到0~100之間:

cmp dwPos, 0

jge @F

mov dwPos, 0

@@:

cmp dwPos, 100

jle @F

mov dwPos,100

 

在介紹MASM語(yǔ)句的時(shí)候提到過(guò),.if dwPos > 0語(yǔ)句只可以用來(lái)比較無(wú)符號(hào)數(shù),所以在這里使用cmp指令自己測(cè)試分支而不是使用.if偽指令。

不計(jì)算好新位置的時(shí)候要將位置設(shè)置回去,用戶才會(huì)看到滾動(dòng)條移動(dòng)了,方法是向滾動(dòng)發(fā)送SBM_SETPOS消息:

invoke SendDlgItemMessage, hWnd, IDC_SCROLL, SBM_SETPOS, dwPos, TRUE

最后一個(gè)參數(shù)為TRUE表示設(shè)置后重新繪畫(huà)滾動(dòng)條。

在初始化的時(shí)候,要給滾動(dòng)條發(fā)送SBM_SETRANGE消息來(lái)設(shè)定滾動(dòng)范圍:

invoke SendDlgItemMessage, hWnd, IDC_SCROLL, SBM_SETRANGE, 最小值, 最大值

 

如果需要獲取滾動(dòng)條的信息,可以嘗試發(fā)送下面兩個(gè)消息:SBM_GETPOS可以獲取滾動(dòng)條的當(dāng)前位置,也就是上一次用SBM_SETPOS設(shè)置的值;SBM_GETRANGE可以獲取滾動(dòng)的范圍,也就是用SBM_SETRANGE設(shè)置的值。

 

7、使用組合框

       顧名思義,組合框是一個(gè)“組合”起來(lái)的東西,它由一個(gè)可供選擇的列表和一個(gè)可供輸入的edit類組合而成。組合框讓用戶既可以自己輸入文本,也可以選擇列表中的某一項(xiàng)當(dāng)做輸入。用不同的風(fēng)格定義可以產(chǎn)生3種類型的組合框。

       CBS_SIMPLE風(fēng)格的組合框,它的上面可以輸入文本,下面的列表可供選擇預(yù)設(shè)文本;

       CBS_DROPDOWN風(fēng)格的組合框,上面同樣可以輸入文本,但下面的列表是下拉式的,平時(shí)處于收起狀態(tài),點(diǎn)擊編輯框右邊的三角形才會(huì)拉下來(lái);

       CBS_DROPDOWNLIST風(fēng)格的組合框,它僅是一個(gè)下拉的選擇框,上面的框中不允許輸入文字。

 

       組合框中還有幾種常用的、可以附加的風(fēng)格:

       CBS_AUTOHSCROLL          輸入過(guò)長(zhǎng)的文本時(shí)輸入框自動(dòng)卷動(dòng)。

       CBS_LOWERCASE              自動(dòng)將所有的文本轉(zhuǎn)換成小寫。

       CBS_SORT                         自動(dòng)將插入的文本項(xiàng)排序。

       CBS_UPPERCASE        自動(dòng)將所有的文本轉(zhuǎn)換成大寫。

 

       組合框中列表框部分的文字添加、項(xiàng)目的選擇等操作都是通過(guò)發(fā)送消息來(lái)完成的,主要的消息如下表所示:

組合框的消息

消息

wParam

lParam

說(shuō)明

CB_ADDSTRING

0

字符串地址

把一個(gè)字符串添加到列表中

CB_INSERTSTRING

位置索引

字符串地址

把一個(gè)字符串插入到列表中

CB_FINDSTRING

開(kāi)始查找的位置索引

查看的字符串

在列表中查找以lParam字符串開(kāi)頭的項(xiàng),找到則返回位置索引,未找到則返回CB_ERP

CB_FINDSTRINGEXACT

位置索引

查找的字符串

精確查找字符串

CB_DELETESTRING

位置索引

0

刪除一個(gè)列表項(xiàng)

CB_RESETCONTENT

0

0

刪除所有的列表項(xiàng)

CB_GETLBTEXT

位置索引

緩沖區(qū)地址

獲取指定列表項(xiàng)的字符串,緩沖區(qū)必須足夠大

CB_GETLBTEXTLEN

位置索引

0

獲取指定列表項(xiàng)的字符串長(zhǎng)度

CB_GETCOUNT

0

0

獲取列表項(xiàng)的總項(xiàng)數(shù)

CB_SETCURSEL

位置索引

0

選中一個(gè)列表項(xiàng),并將列表項(xiàng)中的文字拷貝到編輯控件中

CB_SELECTSTRING

開(kāi)始查找的位置索引

字符串地址

查找以lParam指定的字符串開(kāi)始的列表項(xiàng),如果找到則選中它并將字符串拷貝到編輯控件中

CB_GETCURSEL

0

0

獲取當(dāng)前選中的位置索引,沒(méi)有選中的項(xiàng)目則返回CB_ERR

CB_SHOWDROPDOWN

狀態(tài)

0

打開(kāi)(狀態(tài)為TRUE)或收起(狀態(tài)為FALSE)下拉列表

CB_GETDROPPEDSTATE

0

0

檢測(cè)列表的當(dāng)前下拉狀態(tài),返回TRUE表示拉下,FALSE表示收起

 

       當(dāng)用戶在組合框中進(jìn)行選擇操作時(shí),Windows向?qū)υ捒蜻^(guò)程發(fā)送WM_COMMAND消息,消息中wParam參數(shù)的低16位是組合框ID,高16位是通知碼,用來(lái)表示用戶的操作,通知碼的定義如下表所示。

用戶操作組合框后的通知碼

通知碼

說(shuō)明

CBN_SELCHANGE

用戶將要選擇一個(gè)項(xiàng)目(鼠標(biāo)移動(dòng)到了這個(gè)項(xiàng)目上)

CBN_CLOSEUP

下拉列表關(guān)閉(可能是選擇完成也可以是取消選擇)

CBN_SELENDOK

用戶完成選擇項(xiàng)目

CBN_SELENDCANCEL

用戶取消選擇(鼠標(biāo)移動(dòng)到了某個(gè)項(xiàng)目上,但并沒(méi)有按下而是點(diǎn)擊了其他控件,或按動(dòng)了Esc鍵)

CBN_DBLCLK

CBS_SIMPLE的組合框中雙擊了一個(gè)列表項(xiàng)

CBN_DROPDOWN

用戶打開(kāi)了下拉框(按動(dòng)了編輯框的下拉按鈕)

 

       如果想在用戶選擇了一個(gè)項(xiàng)目后做相應(yīng)的動(dòng)作,最好的辦法就是處理CBN_SELENDOK通知碼,因?yàn)檫@才意味著用戶真正完成了一個(gè)選擇動(dòng)作,例子程序中就是這樣處理的:

.elseif ax == IDC_TITLETEXT         ;WM_COMMAND消息中

       shr eax,16

       .if ax == CBN_SELENDOK

           invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_GETCURSEL, 0, 0

                 ;根據(jù)返回的eax值做相應(yīng)動(dòng)作

       .endif

 

       以上的操作都是針對(duì)下拉列表部分的,另外也有很多消息是針對(duì)組合框中的編輯控件的,對(duì)組合框的窗口句柄發(fā)送WM_GETTEXTWM_SETTEXT,操作的對(duì)象就是組合框的編輯控件;如果要限制控件中文本的最大輸入長(zhǎng)度,可以發(fā)送CB_LIMITTEXT的消息,這時(shí)候wParam參數(shù)指定最大數(shù)量;當(dāng)用戶在編輯框中編輯文本的時(shí)候,Windows在用戶輸入之后、字符顯示之前會(huì)發(fā)送CBN_EDITUPDATE通知碼;當(dāng)字符在編輯框中顯示以后,又會(huì)發(fā)送CBN_EDITCHANGE通知碼。所以在處理WM_COMMAND消息時(shí)通過(guò)處理這兩個(gè)通知碼可以檢測(cè)到用戶的輸入操作。

 

       組合框是子窗口控件中比較復(fù)雜的一種,這里僅介紹了常用的消息和通知碼。

 

posted on 2010-09-16 15:27 luqingfei 閱讀(4159) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Win32匯編程語(yǔ)言序設(shè)計(jì)

導(dǎo)航

<2025年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

統(tǒng)計(jì)

留言簿(6)

隨筆分類(109)

隨筆檔案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美中文字幕在线| 亚洲一级黄色片| 99www免费人成精品| 在线免费观看日本欧美| 国产中文一区二区三区| 国产婷婷色一区二区三区在线| 欧美日韩不卡视频| 国产精品久久激情| 国产精品素人视频| 一区一区视频| 亚洲影院免费| 久热精品视频在线| 亚洲一区二区黄| 久久综合狠狠综合久久激情| 免费美女久久99| 国产午夜精品视频| 亚洲午夜久久久久久久久电影院| 亚洲欧美在线免费观看| 久久久精彩视频| av成人免费在线观看| 久久综合九色综合欧美就去吻| 欧美日韩大片| 亚洲大片av| 狼狼综合久久久久综合网| 欧美激情一二三区| 国产麻豆午夜三级精品| 9国产精品视频| 欧美激情四色| 久久人人九九| 亚洲国产精品美女| 免费亚洲一区二区| 亚洲欧美日韩一区在线| 欧美日韩人人澡狠狠躁视频| 在线观看日韩一区| 久久综合免费视频影院| 午夜日韩av| 国产精品一区在线播放| 亚洲免费影视第一页| 一本大道av伊人久久综合| 亚洲天堂av在线免费观看| 国产精品观看| 久久久99免费视频| 蜜桃视频一区| 亚洲午夜国产成人av电影男同| 夜夜嗨av一区二区三区四区| 欧美午夜在线| 美国成人毛片| 欧美精品成人| 亚洲女优在线| 欧美在线观看视频在线| 亚洲国产91精品在线观看| 99精品久久久| 国产一区二区三区自拍| 最新亚洲视频| 国产精品一区二区黑丝| 欧美成人免费全部| 国产精品电影在线观看| 欧美国产欧美综合 | 亚洲欧美日韩精品在线| 国产视频一区二区三区在线观看| 久久精品亚洲| 欧美日韩高清在线播放| 欧美成人在线网站| 国产精品美女久久| 在线一区观看| 一区二区日韩免费看| 免费成人av在线| 久久免费一区| 亚洲承认在线| 美腿丝袜亚洲色图| 亚洲盗摄视频| 亚洲精品日日夜夜| 欧美精品观看| 99re8这里有精品热视频免费| 伊人久久大香线蕉av超碰演员| 亚洲一区影音先锋| 亚洲一区二区精品在线| 国产精品久久久久9999| 亚洲精品你懂的| 亚洲区一区二区三区| 欧美精品日韩一区| 99视频在线观看一区三区| 欧美精品色网| 亚洲国产欧美一区二区三区丁香婷| 欧美一区二区三区免费视| 亚洲日本久久| 欧美国产先锋| 亚洲美洲欧洲综合国产一区| 欧美电影在线免费观看网站| 一区二区不卡在线视频 午夜欧美不卡在| 日韩视频在线你懂得| 国产精品分类| 免费的成人av| 在线成人h网| 美女国产一区| 亚洲欧美综合精品久久成人| 欧美有码在线视频| 亚洲乱码国产乱码精品精98午夜| 欧美人与性动交a欧美精品| 夜夜嗨av色综合久久久综合网| 亚洲国产高清一区| 欧美成人a视频| 亚洲国产精品t66y| 欧美成人免费在线视频| 久久久国产精品亚洲一区| 欧美亚洲三区| 久久精品综合| 免费不卡亚洲欧美| 午夜日韩福利| 亚洲免费视频在线观看| 午夜在线成人av| 亚洲欧美日韩网| 亚洲综合色丁香婷婷六月图片| 夜夜嗨av一区二区三区网站四季av| 亚洲第一区在线观看| 亚洲精品国偷自产在线99热| 亚洲午夜免费视频| 亚洲国产精品一区制服丝袜| 国产欧美精品一区aⅴ影院| 免费日韩成人| 亚洲国产毛片完整版| 你懂的国产精品| 久久久之久亚州精品露出| 欧美精品二区| 伊人久久成人| 久久久噜噜噜久久人人看| 亚洲最黄网站| 久久亚洲综合网| 国产精品高潮在线| 亚洲国产三级在线| 久久夜色精品国产欧美乱极品| 欧美不卡三区| 亚洲欧美日韩精品久久亚洲区| 欧美在线视频播放| 欧美日韩另类字幕中文| 日韩视频亚洲视频| 久久尤物电影视频在线观看| 欧美三级不卡| av不卡在线| 一区二区三区高清不卡| 欧美激情一区二区三区高清视频| 欧美日韩人人澡狠狠躁视频| 亚洲精品中文字幕在线观看| 麻豆av一区二区三区| 久久精品视频在线| 国产在线观看精品一区二区三区 | 久久九九国产| 国产精品综合色区在线观看| 一区二区三区日韩在线观看| 老司机67194精品线观看| 午夜日韩在线| 国产字幕视频一区二区| 久久久亚洲国产美女国产盗摄| 午夜宅男欧美| 国产麻豆9l精品三级站| 久久久一本精品99久久精品66| 亚洲小说春色综合另类电影| 国产精品专区第二| 麻豆精品一区二区综合av| 欧美国产日韩二区| 久久精品99无色码中文字幕 | 久久综合狠狠| 亚洲欧美日韩国产综合精品二区 | 国产精品伦子伦免费视频| 在线观看一区欧美| 99视频在线观看一区三区| 国产精品久久久久免费a∨大胸 | 久久精品视频在线免费观看| 美女脱光内衣内裤视频久久网站| 一区二区三区四区五区视频| 久久福利毛片| 美日韩丰满少妇在线观看| 一区二区三区精品视频在线观看| 亚洲一区精品视频| 亚洲日本成人网| 久久精品视频va| 久久精品国产999大香线蕉| 欧美激情91| 欧美国产精品一区| 国产伦精品一区二区三区视频黑人 | 久久精品国产在热久久| 一区二区三区www| 欧美99久久| 久久综合九色欧美综合狠狠| 国产精品多人| 亚洲一区综合| 日韩午夜中文字幕| 欧美日韩精品不卡| 夜夜嗨网站十八久久| 亚洲小说春色综合另类电影| 欧美精品国产精品| 日韩午夜av在线| 亚洲性色视频| 国产精品亚洲一区二区三区在线| 一本大道久久a久久精二百| 一区二区三区色| 国产精品久久久久久av福利软件| 日韩午夜激情av| 欧美专区在线观看| 亚洲级视频在线观看免费1级|