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