top
Loading...
文本框控件的消息及應用
∥謀?或文字)控件是“文本框控件”的簡稱,它通常用于輸入和編輯文字。它屬于標準Windows編輯控件的一個子類,所以它支持所有編輯控件消息。這兒講述的技術也適用于由其他廠商設計的,以Windows編輯控件類為基礎的其他控件。
本文將介紹文本控件的消息,這些消息顯著擴展了控件本身的能力,使我們在程序中能夠更靈活的控制控件,不必只僅僅依賴于Visual Basic所提供的屬性或事件,這些消息在進行子類處理中很有用處。下面先介紹控件的消息,然后介紹它們的一些應用。


下表列出了文本控件的常用通知消息:

消息名稱 消息說明
EN_CHANGE 編輯控件的內容一旦發生改變,就發送這條消息。
EN_ERRSPACE 任何時候只要由于內存不足以完成一項編輯操作,就發送這條消息。
EN_HSCROLL 只要用戶單擊了從屬于一個編輯控件的水平滾動條的任何地方,就會發送這條消息。注意這條消息是在控件更新顯示之前發送出去的。
EN_KILLFOCUS 一旦控件丟失了輸入焦點,則發出這條消息。
EN_MAXTEXT 只要用戶輸人的文字試圖超出由EM_LIMITTEXT消息規定購界限,或試圖超出由VB Maxlength屬性規定的界限,就會發送這條消息。此外,倘若不允許自動進行水平滾動,同時插入點要超出控件的寬度;或者不允許自動自動滾動,同時插入點要超出接件的高度,那么也會觸發這條消息。
EN_SETFOCUS 一旦控件接收到了輸入焦點,就發出這條消息。
EN_UPDATE 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_CHARFROMPOS 判斷編輯控件指定位置處的字符(不適用于NT3.51)
EM_GETFIRSTVISIBLEIN 判斷編輯控件中顯示的第一行
EM_GETLINE 從編輯控件取回…行的內容
EM_GETLINECOUNT 判斷一個編輯控件的總行數
EM_GETMODIFY 判斷編輯控件的內容是否已發生變化
EM_GETPASSWORDCHAR 取得編輯控件的密碼字符
EM_GETSEL 判斷編輯控件中一段選定內容的起點與終點
EM_LINEFROMCHAR 判斷是哪一行顯示了某個特殊字符
EM_LINEINDEX 判斷指定行第一個字符的編號
EM_LINELENGTH 判斷一行長度
EM_LINESCROLL 滾動編輯控件
EM_POSFROMCHAR 判斷指定字符在編輯控件的位置(用于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 $#@60;$#@62; 0 Then oldfont = SelectObject(hDC, lfont)
di = GetTextMetrics(hDC, tm)
If lfont $#@60;$#@62; 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 GetLineText(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
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗