[专业]求VB中API实现RichTextBox优化追加文本方法
发布网友
发布时间:2024-10-21 22:01
我来回答
共5个回答
热心网友
时间:2024-11-22 03:47
1.SelStart
思路:
借用内存操作高速取得Length
步骤:
得到Len>SelStart>SelText。
原理:
VB字符串(BSTR)地址(StrPtr(String))的前面(之前)4个字节储存的是长度
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Sub Form_Click()
Dim length As Long
CopyMemory ByVal VarPtr(length), ByVal (StrPtr(Text1.Text) - 4), 4
length = length / 2
Text1.SelStart = length
Text1.SelText = "AA"
End Sub
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2.SendMessage
思路:
发送Ctrl+End到TextBox
步骤:
SendMessage>SelText。
原理:
发送Ctrl+End的消息给文本框(不是给前台,即不会影响用户)实现光标定位到最后
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 VK_CONTROL = &H11
Const VK_END = &H23
Const WM_KEYDOWN = &H100
Private Sub Form_Click()
SendMessage Text1.hwnd, WM_KEYDOWN, VK_CONTROL, 0
SendMessage Text1.hwnd, WM_KEYDOWN, VK_END, 0
SendMessage Text1.hwnd, WM_KEYDOWN, VK_CONTROL, 1
SendMessage Text1.hwnd, WM_KEYDOWN, VK_END, 1
Text1.SelText = "aa"
End Sub
我是原6#
正在着手解决(貌似不是光标最后也会有这个问题)。
我正在考虑SendMessage其他API.
Solution将于周六晚上放上,因为周六上午下午我还要上课(我们学校连周六也不放过我们……)
热心网友
时间:2024-11-22 03:47
- -真不给分呀。给点吧。好歹还是做个沙发。
10mb.postmessage也不行吧好像也有*发的一次最多个数。也要分段发送。
不在前。那就让他在前。弄死他。让他setwindowpos到前边来。不来就K他。
这个东西两句话还真没法解答。
不写了。太累今天不写代码
热心网友
时间:2024-11-22 03:48
'常量给你写一下。
'因为你这个10mb。考虑到有多个页面。使用滚动条的
那么只是End。VK_END。是本页的最后。对于多页是没用的。只能是当页的最后一个。你可以试试。有滚动条时候end只是本页的最后一个。并不是所有内容的最后。所以只能拉动滚动条最后。然后再pag
常量部分- -。这么麻烦。下次不写代码了。
Private Const WM_VSCROLL = &H115
Private Const WM_KEYDOWN = &H100
Private Const WM_CHAR = &H102
Private Const SB_BOTTOM = 7
Private Const VK_NEXT = &H22
建议用翻页。如果Ctrl的话。和其他键会组合冲突。
声音的话屏蔽的是系统。但是不建议这么做。
'常量
Private Const VK_LEFT = &H25
换个思路就ok。在四楼的代码后边加一句。
PostMessage RichTextBox1.hwnd, WM_KEYDOWN, VK_LEFT, 0
就是模拟移一下左
这样就不会出声音了。
'===
那楼主肯定只是看看代码而已。没仔细看
你既然已经发送了文字。既然发送完的文字。前边是有信息的。而不是为空。怎么会有声音呢- -。真逗。换个意思。你如果前边有问题。又考虑后边。那我们只要想一下。放前边还是放后边就ok
而且next之后光标就再最后一个。然后倒前了 - -郁闷。这个贴不回复了。
你都不知道真正的思路倒是是解决方法还是什么。郁闷。无语了。
热心网友
时间:2024-11-22 03:48
我是楼主小号,在此公布最终方案。学习交流可到我的博客http://blog.sina.com.cn/s/blog_5d0ddbfc0100f58g.html
感谢孤独二进制。
新建一工程,添加RichTextBox改名为Text1,另加Timer1(Interval=1000)。
代码如下:
Option Explicit
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_KEYDOWN = &H100
Private Const WM_VSCROLL = &H115
Private Const VK_LEFT As Long = &H25
Private Const VK_NEXT As Long = &H22
Private Const SB_BOTTOM = 7
Private Sub txtwrite(str As String)
PostMessage Text1.hwnd, WM_KEYDOWN, VK_LEFT, 0
PostMessage Text1.hwnd, WM_VSCROLL, SB_BOTTOM, 0
PostMessage Text1.hwnd, WM_KEYDOWN, VK_NEXT, 0
DoEvents
Text1.SelText = str & vbNewLine
PostMessage Text1.hwnd, WM_KEYDOWN, VK_LEFT, 0
PostMessage Text1.hwnd, WM_VSCROLL, SB_BOTTOM, 0
PostMessage Text1.hwnd, WM_KEYDOWN, VK_NEXT, 0
End Sub
Private Sub Timer1_Timer()
txtwrite Now
End Sub
试验结果:能够安静地快速输出内容(光标位于最左侧时除外),不要求活动窗口,不干扰输入输出,不占用过多资源。用鼠标点击或选中不会干扰内容显示。
原理:先左移光标一位,翻页到底部,再发送PageDown键,相当于Ctrl+End移至最后。左移是为了消除声音。DoEvents是关键,不加的话会失败。
方法比较:(低配置电脑切勿尝试)
一、Text=Text+str(极慢)
二、SelStart=Len(Text) SelText=str SelStart=Len(Text)
三、全局变量缓存光标位置
四、SendKeys(严重干扰输入输出)
五、PostMessage移至末尾(测试时未加左移)
每次追加100KB*5 共五轮
一 0.28 0.91 2.00 3.49 5.30
二 0.22 0.86 2.30 4.50 7.34
三 0.14 0.23 0.36 0.45 0.61
四 0.01 0.01 0.08 0.01 0.01
五 0.13 0.13 0.13 0.14 0.13
每次追加1MB*5
一 13.2
二 1.42
三 0.86
四 1.38
五 0.92
每次追加10MB*5
一 N/A
二 N/A
三 15.3
四 8.9
五 9.4
已有100MB 追加1KB
一 N/A
二 N/A
三 6.8
四 0.15
五 0.16
可见最常用的Sel三步法是相当慢的,缓存可以大大节约时间但仍较慢,而模拟发送法只比模拟键盘法慢不到10%,是一种相当好的方法。
PS:在Form_Unload中加入 Text1.Text = "" 可大大加快退出时的速度。
参考资料:http://blog.sina.com.cn/s/blog_5d0ddbfc0100f58g.html
热心网友
时间:2024-11-22 03:49
- -郁闷。我是一楼。已经给你代码了。你自己不会测试么。测试回复效果。
模拟后台。追加10mb。你就把再发送的时候处理就可以了。每次截取一段。根据字数。设置一个single的量来记录。然后分割每次发送的。试用mid(x,第一个开始,个数)。取出来就ok了。这个好像不是你本次的问题了。