常見問題:文字框控制元件的訊息及應用 (轉)

worldblog發表於2007-12-04
常見問題:文字框控制元件的訊息及應用 (轉)[@more@]  文字(或文字)是“文字框控制元件”的簡稱,它通常用於輸入和編輯文字。它屬於標準編輯控制元件的一個子類,所以它支援所有編輯控制元件訊息。這兒講述的技術也適用於由其他廠商設計的,以Windows編輯控制元件類為基礎的其他控制元件。
  本文將介紹文字控制元件的訊息,這些訊息顯著擴充套件了控制元件本身的能力,使我們在中能夠更靈活的控制控制元件,不必只僅僅依賴於所提供的屬性或事件,這些訊息在進行子類處理中很有用處。下面先介紹控制元件的訊息,然後介紹它們的一些應用。


下表列出了文字控制元件的常用通知訊息:

訊息名稱 訊息說明
EN_CHANGE 編輯控制元件的內容一旦發生改變,就傳送這條訊息。
EN_ERRSPACE 任何時候只要由於不足以完成一項編輯操作,就傳送這條訊息。
EN_HSCROLL 只要單擊了從屬於一個編輯控制元件的水平捲軸的任何地方,就會傳送這條訊息。注意這條訊息是在控制元件顯示之前傳送出去的。
EN_KILLFOCUS 一旦控制元件丟失了輸入焦點,則發出這條訊息。
EN_MAXTEXT 只要使用者輸人的文字試圖超出由EM_LIMITTEXT訊息規定購界限,或試圖超出由Maxlength屬性規定的界限,就會傳送這條訊息。此外,倘若不允許自動進行水平滾動,同時插入點要超出控制元件的寬度;或者不允許自動自動滾動,同時插入點要超出接件的高度,那麼也會觸發這條訊息。
EN_SETFOCUS 一旦控制元件接收到了輸入焦點,就發出這條訊息。
EN_UPDATE 這條訊息在控制元件顯示出已改變的文字之前發出。它與EN_CHANGE通知訊息相似,只是它發生於更新文字顯示出來之前。
EN_VSCROLL 只要使用者單擊了從屬於一個編輯控制元件的垂直捲軸的任何地方,就會傳送這條訊息。注意這條訊息是在控制元件更新顯示之前傳送出去的。

下表列出了文字控制元件的常用訊息:
訊息名稱 訊息說明
EM_CANUNDO 決定前一次編輯操作是否能夠撤消
EM_EMPTYUNDOBUFFER 清除控制元件的撤消緩衝區,使其不可能撤消前一次編輯操作
EM_UNDO 撤消前一次編輯操作
EM_FMTLINES 決定是否在取回的文字宇串中包含軟回車字元
EM_GETLIMITTEXT 獲取一個編輯控制元件中文字的最大長度
EM_GETMARGINS 獲取編輯控制元件的左、右邊距(不得用於NT3.51)
EM_GETRECT 獲取一個編輯控制元件的格式化矩形
EM_LIMITTEXT 限制編輯耀件甲購文字長度
EM_SETLIMITTEXT 限制編輯控制元件中的文字長度(不得用於NT3.51)
EM_SETMARGINS 設定編輯控制元件的左、右邊距(不得用於NT3.51)
EM_SETRECT 為一個編輯控制元件設定格式化矩形
EM_SETRECTNP 與EM_SETRECT類似,只是控制元件此時不會重畫
EM_SETTABSTOPS 設定編輯控制元件中的製表站間距
EM_CHARFROMP判斷編輯控制元件指定位置處的字元(不適用於NT3.51)
EM_GETFIRSTVISIBLEIN 判斷編輯控制元件中顯示的第一行
EM_GETLINE 從編輯控制元件取回…行的內容
EM_GETLINECOUNT 判斷一個編輯控制元件的總行數
EM_GETMODIFY 判斷編輯控制元件的內容是否已發生變化
EM_GETPASSCHAR 取得編輯控制元件的密碼字元
EM_GETSEL 判斷編輯控制元件中一段選定內容的起點與終點
EM_LINEFROMCHAR 判斷是哪一行顯示了某個特殊字元
EM_LINEINDEX 判斷指定行第一個字元的編號
EM_LINELENGTH 判斷一行長度
EM_LINESCROLL 滾動編輯控制元件
EM_POROMCHAR 判斷指定字元在編輯控制元件的位置(用於NT3.51)
EM_REPLACESEL 用指定文字替換編輯控制元件中的當前選定內容
EM_SETMODIFY 用於設定或清除一個編輯控制元件的修改標誌
EM_SETPASSWORDCHAR 為指定的控制元件設定密碼字元
EM_READONLY 決定是否將編輯控制元件設為只讀
EM_SETSEL 設定編輯控制元件中一段選定內容的起點一終點


  下面將介紹文字框控制元件訊息的一些應用:

下面的將返回控制元件的文字行數,如果控制元件的文字為空也會返回1。
Function GetLineCount(CTextBox As TextBox) As Long
  GetLineCount = SendMessage(CTextBox.hWnd, EM_GETLINECOUNT, 0, 0)
End Function


下面的函式將返回控制元件中顯示的第一行的行號。
Function GetFirstVisableLine(CTextBox As TextBox) As Long
  GetFirstVisableLine = SendMessageBynum(CTextBox.hwnd, EM_GETFIRSTVISIBLELINE, 0, 0)
End Function


下面的函式將返回控制元件能顯示的行數。
Function GetVisibleLines(CTextBox As TextBox) As Long
Dim rc As RECT
Dim hDC&, lfont&, oldfont&
Dim di&, lc&
Dim tm As TEXTMETRIC

 lc = SendMessage(CTextBox.hwnd, EM_GETRECT, 0, rc)
 lfont = SendMessage(CTextBox.hwnd, WM_GETFONT, 0, 0)
 hDC = GetDC(CTextBox.hwnd)
 If lfont <> 0 Then oldfont = (hDC, lfont)
  di = GetTextMetrics(hDC, tm)
 If lfont <> 0 Then lfont = SelectObject(hDC, oldfont)
  GetVisibleLines = (rc.bottom - rc.top) / tm.tmHeight
  di = ReleaseDC(CTextBox.hwnd, hDC)
End Function


下面的函式能夠滾動控制元件,不過在滾動之前最好判斷控制元件的文字行數和能夠顯示的行數,以免滾動時發生混亂。函式SendMessageBynum是一個SendMessage函式的宣告函式,其定義與SendMessage函式完全相同,只是函式名不同。
Function ScrollTextBox(CTextBox As TextBox, nVal As Long, Optional nVertical As Boolean = True) As Long
 If nVertical Then
  ScrollTextBox = SendMessageBynum(CTextBox.hwnd, EM_LINESCROLL, 0, nVal)
 Else
  ScrollTextBox = SendMessageBynum(CTextBox.hwnd, EM_LINESCROLL, nVal, 0)
 End If
End Function


下面的函式能夠返回控制元件指定行的文字。SendMessageBystring與SendMessageBynum類似。
Function GetLext(CTextBox As TextBox, LineIndex As Long) As String
 Dim lc&, linechar&
 linechar = SendMessageBynum(CTextBox.hwnd, EM_LINEINDEX, LineIndex, 0)
 lc = SendMessageBynum(CTextBox.hwnd, EM_LINELENGTH, linechar, 0) + 1
 GetLineText = String$(lc + 2, 0)
 Mid$(GetLineText, 1, 1) = Chr(lc And &HFF)
 Mid$(GetLineText, 2, 1) = Chr(lc &H100)
 lc = SendMessageBystring(CTextBox.hwnd, EM_GETLINE, LineIndex, GetLineText)
 GetLineText = left(GetLineText, lc)
End Function


下面的函式可以設定控制元件的左邊距。
Public Const EM_SETMARGINS& = &HD3
Public Const EC_LEFTMARGIN& = &H1
Function SetMargins(CTextBox As TextBox, nVal As Long) As Long
 SetMargins = SendMessageBynum(CTextBox.hwnd, EM_SETMARGINS, EC_LEFTMARGIN, nVal)
End Function

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988387/,如需轉載,請註明出處,否則將追究法律責任。

相關文章