Windows API的SendMessage函數可以用來向Visual Basic控件中 發送消息,例如向文本框控件上發送消息。本文介紹如何利用該函數 防止文本框控件中的部分文本滾動,即該控件中不能滾動的部分不能 被用戶看見。
發送消息到文本框控件
Visual Basic中的文本框控件就是一個最小化的字處理程序。當 該文本控件的Mult iLine屬性被設置為True時,則文本可以自動換行; 當在文本框控件中鍵入了許多文本時,控件中的文本會向上滾動。這 時文本就變得看不到了,但這些文本實際上仍然在控件中——它們並 沒有被刪除。
Windows API的SendMessage函數可以用來防止文本框控件中的文 本滾動而超出我們的視線。當創建該文本框控件時,它的客戶區域格 式化為一個矩形(該區域就是鍵入文本的地方),可以給該控件發送EM_ SETRECTNP消息,對該矩形區域進行限制,以在文本框的客戶區域中指 定一個特定區域。
在下面的樣例程序中,我們希望文本控件的後一半原封不動地保 持完整,即不希望文本滾動而超出視線。可以從文本框控件的Height 屬性中提取出它的高度,並將該值除以2,得到該文本框控件後一半的 坐標。然後將該結果傳遞給SendMessage函數,告訴EM_SETR ECTNP防 止該矩形區域滾動。
有些程序員可能會希望使用EM_SETRECT消息代替EM_SETRECTNP消 息。但是,使用EM_ SETRECT消息會停止Windows對該格式化矩形區域 中的文本的重新繪制,導致文本框控件中的文本看不到。
樣例程序
該程序顯示了如何臨時凍結一個文本框控件中的特定部分,該部 分包含的文本不能滾動,因而不會超出視線之外,如下圖所示。
1.在Visual Basic中開始一個新的工程,采用缺省的方法建立For m1。
2.將如下常量和聲明語句添加到Form1的通用聲明部分中(注意該 聲明語句需要書寫在一行內):
Private Declare Function SendMessage Lib "User" (ByVal h Wnd As Integer, ByVal wMsg As Integer, ByVal wParam As Inte ger, lParam As Any) As Long Const WM_USER = &H400 Const EM_SETRECTNP = WM_USER + 4 Const EM_SETRECT = WM_USER + 3
對於32位環境下使用Visual Basic 5.0的用戶,需要將如下聲明 語句添加到Form1的通用聲明部分中:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVa l wParam Long, lParam As Any) AsLong Const EM_SETRECTNP = &HB4 Const EM_SETRECT = &HB3
3.將如下代碼添加到Form1的Form_Load事件中:
Private Sub Form_Load() Text1.Text = "這是我們希望顯示出來的第一段" Text1.Text = Text1.Text & "它位於文本框控件中" Text1.Text = Text1.Text & Chr$(13) & Chr$(10) & "這是第 二段,我們" Text1.Text = Text1.Text & "希望將之凍結以使文本不能滾動 " End Sub
4.將如下代碼添加到Form1的Click事件中:
Private Sub Form_Click() Dim R As RECT Dim X As Long ScaleMode = 3 R.Left = 0 R.Top = 0 R.Right = Text1.Width R.Bottom = Text1.Height / 2 X = SendMessage(Text1.hWnd, EM_SETRECTNP, 0, R) End Sub
5.創建一個新的模塊,采用缺省的方法建立Module1.Bas。
6.將如下TYPE結構添加到Module1.Bas中:
Type RECT Left As Integer Top As Integer Right As Integer Bottom As Integer End Type
對於32位環境下使用Visual Basic 5.0的用戶,需要將如下TYPE 結構添加到Module1 .Bas中:
Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type
7.在Form1上添加一個文本框控件,采用缺省的方法建立Text1,將 其MultiLine屬性設置為True。
按下F5來執行該程序,我們可以看到文本框顯示在Form1上。在窗 體上單擊一次鼠標,將新的文本鍵入到該文本框控件中。這時我們可 以注意到,當我們在文本框控件的開頭處鍵入新的文本時,在文本框控 件下半部分的文本不會滾動。
如果我們將EM_SETRECT消息替代EM_SETRECTNP消息發送給文本框 ,再次運行該程序,這時我們會發現,文本框的下半部分顯示不出來,盡 管實際上文本仍然是存儲在控件中的。