SendMessage函數的常用消息及其應用 文本框控件通常用於輸入和編輯文字。它屬於標准 Windows 編輯控件的一個子類,所以它支持所有 編輯控件消息。這兒講述的技術也適用於由其他廠商設計的,以Windows編輯控件類為基礎的其他控件。 函數原型: Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 其中四個參數的含義和說明如下: 1.hWnd: 對象的句柄。希望將消息傳送給哪個對象,就把該對象的句柄作為實參傳送,在 VB 中可以簡單地 用「對象.hWnd」獲得某個對象的句柄,如 Text1.hWnd和 Form1.hWnd分別可以得到 Text1和Form1的句 柄。它是一個長整型數。Windows給每個控件一個編號,這個編號就稱為窗口句柄。有了這個句柄,我們 就可告訴 Windows 我們要控制哪個控件,所以這個句柄在 API 調用中至關重要。VB 的大多數控件都包 括hwnd屬性,如下拉框、TreeView等,窗體也有這個屬性。但也有一些控件沒有這個屬性,如標簽控件。 沒有這個屬性就無法利用Windows API函數,但可以節省系統資源。 2.wMsg: 被發送的消息。根據具體需求和不同的對象,將不同的消息作為實參傳送,以產生預期的動作。使 SendMessage 傳遞消息,大多是為了完成以下幾個工作: ①設置控件的一些選項,象我們要使用的CB_SETDROPPEDWIDTH的就屬於這種情況。盡管VB的每個控 件都提供了許多屬性,但仍然有許多控件的選項沒有包括在其中。而這些選項中的大多數都可以利用該 函數進行設置。 ②獲得控件的一些設置。同上一種情況相反,有時我們需要獲得控件的一些設置,相當於讀取屬性。 例如,如果想知道一個下拉框的下拉部分的寬度是多少,就可以向控件發送CB_GETDROPPEDWIDTH消息。 對於這種情況,SendMessage函數的返回值就是結果。 ③執行一定的操作。例如,我們要在下拉框中尋找是否有「ABC」這個字符串,當然,我們可以編寫 一個循環,逐條比較看是否存在這樣的字符串。如果使用API,我們只需要向下拉框發送CB_FINDSTRING 消息,這條消息就會自動進行查找工作並返回結果。 ④模擬用戶操作。我們有時希望模擬用戶的操作,比如關閉其他應用程序的窗口。其實只要我們能知 道那個窗口的句柄,我們就可以發送WM_CLOSE消息給那個窗口,窗口接受到這條消息就會關閉,如同用戶 關閉窗口一樣。 3.wParam、4.lParam: 附加的消息信息。這兩個是可選的參數,用來提供關於wMsg消息更多的信息,不同的wMsg可能使用這 兩個參數中的0、1或2個,如果不需要哪個附加參數,則將實參賦為NULL(在VB中賦為0)。 lParam定義為Any類型。指定 Any類型可禁止VB進行類型檢查,從而允許將任意數據類型傳遞給該過 程。由於每條消息對參數的類型和傳遞方式的要求都不同:有的可能要求為Long型,有的可能要求為自定 義類型;大多數要求按傳值方式傳遞,但也有一些要求按傳地址方式。為了滿足各種要求,我們將這個參 數定義為Any類型。比如,我們要傳遞一個Long型變量lData。如果消息要求傳地址方式傳遞,可以使用: SendMessage ……, lData 而如果要求傳值方式傳遞,則使用 SendMessage ……, ByVal lData 如果傳遞常數,我們則需要使用類型後綴來指定常數的類型,比如"0&",表示Long型的常數0,如 SendMessage ……, ByVal 0& 我們也可以使用類型轉換函數CLng將常數指定為Long型,如CLng(0)。 程序中,有時定義 lParam As Any,有時定義 ByVal lParam As String。這是為什麼呢?對於 SendMessage函數,lParam的使用是很靈活的,在一般情況下,lParam是一個指針,它指向的數據類型 有三種:長整形、自定義數據結構類型、字符串類型。對於前兩種類型,需要將 lParam定義為 lParam As Any,從而將 lParam 數據的指針傳遞到 SendMessage 函數。對於字符串類型,則需要定義 Byval lParam As String,因為字符串類型數據不同,只有定義 ByVal,得到的才是字符串的指針,如果沒有 ByVal,得到的將是指向字符串指針的指針。另外對於少數的消息來說,SendMessage 函數需要的只是 lParam 本身的值,這時就需要將 lParam定義為 Byval lParam As Long,或者在程序調用時在 lParam 之前加 ByVal。 當用戶在編輯控件上進行各種操作時,其父窗口將收到 WM_COMMAND 通知消息,lParam帶控件句柄 (hWnd),同時 wParam 的低16位帶控件的 ID,高16位帶有如下表的消息代碼: 常用編輯控件消息: EC_LEFTMARGIN(&H1) EC_USEFONTINF 設置左邊距時使用 EC_RIGHTMARGIN EC_USEFONTINF 設置右邊距時使用 EC_USEFONTINF,O,邊距 設置編輯控件的左、右邊距,當wParam含EC_LEFTMARGIN時在lParam的低16位指定左邊距點數,當wParam含EC_RIGHTMARGIN時在lParam的高16位指定右邊距點數。當指定wParam為EC_USEFONTINFO時,則用當前字體的字符"A"的寬度指定右邊距和字符"C"的寬度指定左邊距lParam被忽略。 EM_CHARFROMPOS(&HD7=215),0, 取得編輯控件中指定位置的字符相對於文本頭部的偏移量。使用本操作應先在第4個參數的高16位指定行號,低16位指定列號(或一個POINTAPI結構),行列是按編輯控件的客戶區左上角為原點(0,0)計算的。如果指定的位置超出控件客戶區則返回-1 EM_CANUNDO(&HC6=198),0,0 決定前一次編輯操作是否能夠撤消:檢測控件撤消緩沖區是否為空,通常控件把最後一次在控件的編輯操作保存在一個撤消緩沖區,如果緩沖區非空則返回TRUE表示上次操作可以撤消,否則返回FALSE,應用程序可以利用該返回值來禁止或允許菜單或工具條的"撤消"項。 EM_EMPTYUNDOBUFFER(&HCD=205 ),0,0 清除控件的撤消緩沖區,使其不能撤消前一次編輯操作 EM_FMTLINES(&HC8=200) 決定是否在取回的文本宇串中包含軟回車字符 EM_GETFIRSTVISIBLEINE(&HCE=206),0,0 獲得文本控件中處於可見位置的最頂部的文本所在的行號 EM_GETLINE(&HC4=196 ),行號,ByVal 變量 獲取編輯控件某一行的內容,變量須預先賦空格 EM_GETLINECOUNT(&HBA=186,0,0 獲取編輯控件的總行數 EM_GETMODIFY(&HB8=184),0,0 判斷編輯控件的內容是否已發生變化,返回TRUE則控件文本已被修改,返回FALSE則未變。 EM_GETPASSWORDCHAR( ),0,0 獲取編輯控件的密碼字符,返回NULL表示沒有字符 EM_GETRECT(&HB2=178),0,結構 獲取編輯控件的格式化矩形 EM_GETTHUMB(&HBE=190),0,0 取得多行文本編輯控件的滾動框的當前位置(注意:是象素值) EM_GETSEL(&HB0=176),0,變量 獲取光標位置(以字節數表示),或:(緩沖區起點,緩沖區終點)取得編輯控件中選定內容的范圍,返回值中低16位為起點,高16位為終點 EM_GETHANDLE(&HBD=189),0,0 取得文本緩沖區 EM_GETWORDBREAKPROC(&HD1=209),0,0 取得整字換行回調函數EditWordBreakProc指針 EM_GETLIMITTEXT(WM_USER+37=1061),0,0 獲取一個編輯控件中文本的最大長度 EM_GETMARGINS( ),0,0 獲取編輯控件的左、右邊距,返回值低16位為左邊距,高16位為右邊距(不得用於NT3.51) EM_LIMITTEXT(&HC5=197),最大值,0 設置編輯控件中的文本長度 EM_SCROLLCARET(&HB7=183),0,0 把可見范圍移至光標處 EM_LINEFROMCHAR(&HC9=201),偏移值,0 獲取指定位置(或:-1,0 表示光標位置)所在的行號 EM_LINEINDEX(&HBB=187),行號,0 獲取指定行(或:-1,0 表示光標所在行)首字符在文本中的位置(以字節數表示) EM_LINELENGTH(&hC1=193),偏移值,0 獲取指定位置所在行(或:-1,0 表示光標所在行)的文本長度(以字節數表示) EM_POSFROMCHARPOINT,結構地址,偏移值 取得指定字符位置的行列號,偏移值是字符相對於文本頭部的偏移。 EM_LINESCROLL(&HB6=182),列數,行數 指定行數的文本水平滾動,每次滾動N列 EM_EXGETSEL(&H434=1076) EM_EXSETSEL(&H437=1079),0,結構 RichEdit控件設置文本選定范圍,參閱 EM_SETSEL 消息,結構是指 CHARRANGE 結構 EM_PASTESPECIAL(&H440=1088),2(1),1 RichEdit控件粘貼剪貼板中的位圖(或文本) EM_FINDTEXT(&H738=1080) RichEdit控件正文搜索操作 EM_FINDTEXTEX(&H44F=1103) 同上 EM_SETTEXTEX(&H461=1121) RichEdit控件正文替換/插入操作 EM_SETTARGETDEVICE, GetDC(RichText.hWnd), RichText.Width / 15)設置 RichTextBox 自動換行,後續代碼是:RichText.RightMargin = iif(RichText.RightMargin = 0,1,0) EM_SETTARGETDEVICE, 0, 1 設置 RichTextBox 不自動換行 EM_POSFROMCHAR(&HD6或&H426) 判斷指定字符在編輯控件的位置(用於NT3.51) EM_SCROLL(&HB5=181),*,0 文本垂直滾動。第三個參數*控制滾動方向:SB_LINEDOWN(1)向下滾動一行,SB_LINEUP(0)向上滾動一行,SB_PAGEDOWN(3)向下滾動一頁,SB_PAGEUP(2)向上滾動一頁。 EM_REPLACESEL(&HC2=194),1(0),字符串 用指定字符串替換編輯控件中的當前選定內容,如果第三個參數wParam為1,則本次操作允許撤消,0禁止撤消。字符串可用傳值方式,也可用傳址方式(例:SendMessage Text1.hwnd, EM_REPLACESEL, 0, Text2.Text '這是傳值方式) EM_SETSEL(&HB1=177),起點,終點 設置編輯控件中文本選定內容范圍(或設置光標位置),該范圍被反相顯示,用於為復制、替換、粘貼、剪切、刪除等編輯功能指定范圍,光標將被移至指定的終點後面。還可使用指定相同起點和終點來移動光標而不是選定范圍。當指定的起點等於0和終點等於-1時,文本全部被選中,此法常用在清空編輯控件。當指定的起點等於-2和終點等於-1時,全文均不選,光標移至文本未端,此法常用在文本未端追加內容。注意:當控件沒有輸入焦點時,本操作將會失敗,一般在執行本操作前都應調用SetFocus先取得輸入焦點。 EM_UNDO(&HC7=199),0,0 撤消前一次編輯操作,當重復發送本消息,控件將在撤消和恢復中來回切換 EM_SETCHARFORMAT(&H444) 改變選定文本的顏色 EM_SETHANDLE(&HBC=188),緩沖區指針,0 為編輯控件指定新的文本緩沖區。此操作僅適用對話框創建帶DS_LOCALEDIT風格的控件。 EM_SETLIMITTEXT,長度(字節),0 設置編輯控件中的文本最大長度(不得用於NT3.51) EM_SETMARGINS(&HD3=211) 設置編輯控件的左、右邊距(不得用於NT3.51) EM_SETMODIFY(&HB9=185),1(0),0 設置或清除一個編輯控件的修改標志 EM_SETPASSWORDCHAR(&HCC=204),字符,0 指定控件用來顯示密碼的字符,缺省為"*"。當第三個參數wParam為0時,本操作將清除控件的ES_PASSWORD風格,並按實際字符顯示。 EM_SETREADONLY(&HCF=207),1(0),0 決定是否將編輯控件設為只讀,同時決定控件的ES_READONLY風格 EM_SETRECT(&HB3=179),0(或RECT),結構地址 為一個編輯控件設置格式化矩形 EM_SETRECTNP(&HB4=180),0(或RECT),結構地址 為一個編輯控件設置格式化矩形,只是控件此時不會重畫 EN_CHANGE(&H300=768) 編輯控件的內容發生改變。與EN_UPDATE不同,該消息是在編輯框顯示的正文被刷新後才發出的。 EN_ERRSPACE(&H500=1280) 任何時候只要由於內存不足以完成一項編輯操作 EN_HSCROLL(&H601=1537) 用戶單擊了編輯控件的水平滾動條。注意:這條消息是在控件更新顯示之前發送出去的。 EN_VSCROLL(&H602=1538) 用戶單擊了編輯控件的垂直滾動條。注意:這條消息是在控件更新顯示之前發送出去的。 EN_KILLFOCUS(&H200=512) 編輯控件失去了輸入焦點 EN_SETFOCUS(&H100=256) 編輯控件獲得了輸入焦點 EN_UPDATE(&H400=1024) 控件准備顯示改變了的正文時發送該消息。它與EN_CHANGE通知消息相似,只是它發生於更新文本顯示出來之前。 EN_MAXTEXT(&H501=1281) 用戶輸人的文字數超出由EM_LIMITTEXT消息規定的界限,或超出由VB Maxlength屬性規定的界限,就會發送這條消息 。此外,倘若不允許自動進行水平滾動,同時插入點要超出控件的寬度;或者不允許自動垂直滾動,同時插入點要超出控件的高度,那麼也會觸發這條消息。在沒有ES_AUTOHSCROLL或ES_AUTOVSCROLL的編輯框中,當正文超出了編輯框的邊框時也會發出該消息。 編輯風格消息: ES_MULTILINE 指定編輯控件能否進行多行文本編輯,若多行編輯器不指定ES_AUTOHSCROLL風格,則會自動換行,用戶每按一次Enter,在當前光標處輸入一個回車換行符(0Dh,0Ah),文本增加一行。若不指定ES_AUTOVSCROLL,則多行編輯器會在窗口中正文裝滿時發出警告聲響。 ES_LEFT 文本顯示居左。 ES_CENTER 文本顯示居中。 ES_RIGHT 文本顯示居右。 ES_LOWERCASE 把用戶輸入的字母統統轉換成小寫字母。 ES_UPPERCASE 把用戶輸入的字母統統轉換成大寫字母。 ES_OEMCONVERT 把輸入的文本從ANSI碼轉換成OEM碼,然後又轉換成ANSI碼,目的是保證函數AnsiToOem的正確調用。這在編輯框中包含文件名時是很有用的。 ES_AUTOHSCROLL(自動增加水平滾動條?) 當用戶在行尾鍵入一個字符時,正文將自動向右滾動10個字符,當用戶按回車鍵時,正文總是滾向左邊。 ES_AUTOVSCROLL 當用戶在最後一個可見行按回車鍵時,正文向上滾動一頁。 ES_NUMBER 只接收數碼輸入,其它字符輸入一律無效。 ES_NOHIDESEL(&H100=256) 當編輯框失去輸入焦點時,選中的文本將隱藏,正文中的選擇保持不變。缺省時正文中的選擇將失效,當獲得輸入焦點後才又顯示出來。 ES_READONLY 將編輯框設置成只讀的。 ES_PASSWORD(&H20=32) 使所有鍵入的字符都用"*"來顯示。 ES_WANTRETURN 使多行編輯器接收回車鍵輸入並換行。如果不指定該風格,按回車鍵會選擇缺省的命令按鈕,這往往會導致對話框的關閉。 列表框操作: LB_FINDSTRING(&H18F=399),-1,ByVal 字串 查找列表項的字符串,返回值=字符串所在的列表項的索引。-1表示從第0行開始查找,如果改為一個有效的列表項索引值,將從該行開始查找。 LB_ITEMFROMPOINT(&H1A9=425) 獲取光標所在的列表項的索引 LB_SETHORIZONTALEXTENT(&H194=404),長度,0 設置列表框的橫向滾動條以及滾動長度,長度為象素值 組合框操作: CB_SHOWDROPDOWN(&H14F),1(0),0 打開(關閉)組合框的列表 TVM_SETBKCOLOR(&H1100+29=4381) 設置擴展樹型列表控件的背景色(TVM開頭的常數) 常用窗口消息: WM_GETFONT(&H31=49) 得到當前控件繪制文本的字體(的句柄) WM_GETTEXT(&HD=13),變量長度,變量 取得窗體的標題,變量須預先賦空字串(chr(0)),變量長度=Len(變量) WM_SETTEXT(&HC=12),0,ByVal "字串" 設置窗體的標題 WM_NCLBUTTONDOWN(&HA1=161),2,0 在非客戶區,即邊框及標題欄上(假如定義的是一個組件,則非客戶區包括Form等)按下鼠標左鍵; WM_LBUTTONDOWN(&H201=513),2,0 在客戶區,也就是除邊框及標題欄以外按下鼠標左鍵 WM_VSCROLL(&H115=277),&H10000*p+SB_THUMBPOSITION(&H4),0 同步滾動文本,p是位置改變量 WM_PAINT WM_USER(&H400=1024) WM_CUT(&H300=768),0,0 剪切 WM_COPY(&H301=769)),0,0 復制 WM_PASTE(&H302=770)),0,0 粘貼 WM_CLEAR(&H303=771)),0,0 刪除 WM_UNDO(&H304=772)),0,0 撤消 按紐消息: BM_SETSTYLE(&HF4) 設置按紐樣式 BS_RADIOBUTTON(&H4) 收音機旋紐式的按紐,是 BM_SETSTYLE 使用的參數 |
第1樓
|
第2樓
|
第3樓
|
第4樓
|
第5樓
|
第6樓
|
全站熱搜
留言列表