常見問題:文字框控制元件的訊息及應用 (轉)
常見問題:文字框控制元件的訊息及應用 (轉)[@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
本文將介紹文字控制元件的訊息,這些訊息顯著擴充套件了控制元件本身的能力,使我們在中能夠更靈活的控制控制元件,不必只僅僅依賴於所提供的屬性或事件,這些訊息在進行子類處理中很有用處。下面先介紹控制元件的訊息,然後介紹它們的一些應用。
下表列出了文字控制元件的常用通知訊息:
訊息名稱 訊息說明
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 訊息中介軟體應用的常見問題與方案
- RabbitMQ訊息佇列入門及解決常見問題MQ佇列
- 訊息佇列常見問題分析佇列
- 得物技術訊息中介軟體應用的常見問題與方案
- ERP應用過程常見問題及解決建議(轉)
- 訊息佇列常見的 5 個應用場景佇列
- 訊息佇列常見的5個應用場景佇列
- 淺談訊息佇列及常見的訊息中介軟體佇列
- 訊息佇列常見面試題佇列面試題
- 快應用稽核常見問題
- Android應用安全常見問題及解決方案Android
- MQTT 客戶端應用及常見問題(C#)MQQT客戶端C#
- Solaris 常見問題及解決方法(轉)
- 【常見Web應用安全問題】—7、CRLFinjectionWeb
- 【常見Web應用安全問題】—12、URLredirectionWeb
- 常見問題及解決
- 使用ActiveX控制元件開發網頁常見的問題 (轉)控制元件網頁
- [分散式][高併發]訊息佇列的使用場景、概念、常見問題及解決方案分散式佇列
- SDWebImage的基本用法及常見問題Web
- mfc中的訊息的應用 (轉)
- SSH原理常見應用升級及埠轉發
- Ceph常規操作及常見問題梳理
- 移動推送訊息送達常見問題與解決辦法
- 把TXT文字匯入SQLServer常見問題SQLServer
- Git常見問題及解決Git
- 常見問題及解決方案
- 【基礎】比較常見的訊息
- Anbox安卓apk應用安裝及使用說明和常見問題安卓APK
- Kafka常見的問題及解決方案Kafka
- 深度解析移動應用安全的四大常見問題及解決方案
- Rational Functional Tester 測試 Web 應用程式中的常見問題及解決方案FunctionWeb
- 【常見Web應用安全問題】—4、DirectorytraversalWeb
- 常見開源訊息系統
- vi 命令常見問題解答(轉)
- Java常見問題集錦(轉)Java
- Windows 98 常見問題解答(轉)Windows
- C 語言常見問題(轉)
- Nacos 常見問題及解決方法