防止文本控件中的部分滾動

發表于:2007-07-14來源:作者:點擊數: 標簽:
作者:譚翁 Windows API的SendMessage函數可以用來向VisualBasic控件中發送消息,例如向文本框控件上發送消息。本文介紹如何利用該函數防止文本框控件中的部分文本滾動,即該控件中不能滾動的部分不能被用戶看見。 發送消息到文本框控件 Visual Basic中的文
作者:譚翁

Windows API的SendMessage函數可以用來向VisualBasic控件中發送消息,例如向文本框控件上發送消息。本文介紹如何利用該函數防止文本框控件中的部分文本滾動,即該控件中不能滾動的部分不能被用戶看見。
發送消息到文本框控件
Visual Basic中的文本框控件就是一個最小化的字處理程序。當該文本控件的MultiLine屬性被設置為True的時候,則文本可以自動換行;當在文本框控件中鍵入了許多文本時,控件中的文本會向上滾動。這時文本就變得看不到了,但這些文本實際上仍然在控件中——它們并沒有被刪除。
Windows API的SendMessage函數可以用來防止文本框控件中的文本滾動因而超出我們的視線。當創建該文本框控件時,它的客戶區域格式化為一個矩形(該區域就是鍵入文本的地方),可以給該控件發送EM_SETRECTNP消息,對該矩形區域進行限制,以在文本框的客戶區域中指定一個特定區域。
在下面的樣例程序中,我們希望文本控件的后一半原封不動地保持完整,即不希望文本滾動而超出視線??梢詮奈谋究蚩丶腍eight屬性中提取出它的高度,并將該值除以2,得到該文本框控件后一半的坐標。然后將該結果傳遞給SendMessage函數,告訴EM_SETRECTNP防止該矩形區域滾動。
有些程序員可能會希望使用EM_SETRECT消息代替EM_SETRECTNP消息。但是,使用EM_SETRECT消息會停止Windows對該格式化矩形區域中的文本的重新繪制,導致文本框控件中的文本會看不到。
 
樣例程序
該程序顯示了如何臨時凍結一個文本框控件中的特定部分,該部分包含的文本不能滾動,因而不會超出視線之外。
1.在VisualBasic中開始一個新的工程,采用缺省的方法建立Form1。
2.將如下常量和聲明語句添加到Form1的通用聲明部分中(注意該聲明語句需要書寫在一行內):
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位環境下使用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 & " 希 望 將 之 凍 結 以 使 文 本 不 能 滾 動 "
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消息發送給文本框,再次運行該程序,這時我們會發現,文本框的下半部分顯示不出來,盡管實際上文本仍然是存儲在控件中的。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97