?? 30.txt
字號:
防止文本控件中的部分滾動
譚 翁
Windows API的SendMessage函數(shù)可以用來向VisualBasic控件中發(fā)送消息,例如向文本框控件上發(fā)送消息。本文介紹如何利用該函數(shù)防止文本框控件中的部分文本滾動,即該控件中不能滾動的部分不能被用戶看見。
發(fā)送消息到文本框控件
Visual Basic中的文本框控件就是一個最小化的字處理程序。當該文本控件的MultiLine屬性被設(shè)置為True的時候,則文本可以自動換行;當在文本框控件中鍵入了許多文本時,控件中的文本會向上滾動。這時文本就變得看不到了,但這些文本實際上仍然在控件中——它們并沒有被刪除。
Windows API的SendMessage函數(shù)可以用來防止文本框控件中的文本滾動因而超出我們的視線。當創(chuàng)建該文本框控件時,它的客戶區(qū)域格式化為一個矩形(該區(qū)域就是鍵入文本的地方),可以給該控件發(fā)送EM_SETRECTNP消息,對該矩形區(qū)域進行限制,以在文本框的客戶區(qū)域中指定一個特定區(qū)域。
在下面的樣例程序中,我們希望文本控件的后一半原封不動地保持完整,即不希望文本滾動而超出視線。可以從文本框控件的Height屬性中提取出它的高度,并將該值除以2,得到該文本框控件后一半的坐標。然后將該結(jié)果傳遞給SendMessage函數(shù),告訴EM_SETRECTNP防止該矩形區(qū)域滾動。
有些程序員可能會希望使用EM_SETRECT消息代替EM_SETRECTNP消息。但是,使用EM_SETRECT消息會停止Windows對該格式化矩形區(qū)域中的文本的重新繪制,導致文本框控件中的文本會看不到。
樣例程序
該程序顯示了如何臨時凍結(jié)一個文本框控件中的特定部分,該部分包含的文本不能滾動,因而不會超出視線之外。
1.在VisualBasic中開始一個新的工程,采用缺省的方法建立Form1。
2.將如下常量和聲明語句添加到Form1的通用聲明部分中(注意該聲明語句需要書寫在一行內(nèi)):
Private Declare Function SendMessage Lib "User"
(ByVal hWnd As Integer, ByVal wMsg As Integer,
ByVal wParam As Integer, lParam As Any) As Long
Const WM_USER = &H400
Const EM_SETRECTNP = WM_USER + 4
Const EM_SETRECT = WM_USER + 3
對于32位環(huán)境下使用Visual Basic5.0的用戶,需要將如下聲明語句添加到Form1的通用聲明部分中:
Private Declare Function SendMessage Lib "user32"
Alias "SendMessageA" (ByVal hwnd As Long, ByVal
wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
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 & " 希 望 將 之 凍 結(jié) 以 使 文 本 不 能 滾 動 "
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.創(chuàng)建一個新的模塊。采用缺省的方法建立Module1.Bas。
6.將如下TYPE結(jié)構(gòu)添加到Module1.Bas中:
Type RECT
Left As Integer
Top As Integer
Right As Integer
Bottom As Integer
End Type
對于32位環(huán)境下使用Visual Basic 5.0的用戶,需要將如下TYPE結(jié)構(gòu)添加到Module1.Bas中:
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
7.在Form1上添加一個文本框控件,采用缺省的方法建立Text1,將其MultiLine屬性設(shè)置為True。
按下F5來執(zhí)行該程序,我們可以看到文本框顯示在Form1上。在窗體上單擊一次鼠標,將新的文本鍵入到該文本框控件中。這時我們可以注意到,當我們在文本框控件的開頭處鍵入新的文本時,在文本框控件下半部分的文本不會滾動。
如果我們將EM_SETRECT消息替代EM_SETRECTNP消息發(fā)送給文本框,再次運行該程序,這時我們會發(fā)現(xiàn),文本框的下半部分顯示不出來,盡管實際上文本仍然是存儲在控件中的。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -