问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

[专业]求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了。这个好像不是你本次的问题了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
山东沃尔德集团集团所辖公司介绍 齐鲁银行无忧贷和市民贷哪个好 什么叫补按揭 后按揭贷款什么意思 买房者续按揭有什么危害 加按揭是什么意思 八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... VB里richtextbox的格式保存 INR什么意思 INR医学上是什么意思 ...总额这两个什么意思??每月应还贷多少?这两个之和还是还多少?_百度... 菜花几月份种植合适 菜花几月份种 狗场买了一只小体泰迪,到底是不是小体我也不知道,买时四个月特别好动... 4月15日在狗场买了只品相不错的玩具泰迪,结果没几天发现她有癫痫这病... 想问下师傅们 我的车是用朋友的身份证贷款买的 还完贷款后4s寄了一个... 花菜什么季节种植最合适 花菜适合种植的季节 青少年心率正常值范围是多少 《回首碧云西》最新txt全集下载 女主穿越后成公主姓龙有三个男宠,只记得一个是草原首领一个是邻国皇... 弹吉他用得到左手大拇指和小指吗? 王叔叔和李叔叔合打一篇文稿,王叔叔单独打要8小时,李叔叔单独打要10小时... 猪肝和西兰花能一起吃吗猪肝和西兰花一起食用好吗 陈叔叔,王叔叔和李叔叔合伙开出租车,陈叔叔出资7万元,王叔叔出资5万元... 我想买DV,请问哪种品牌好? 索尼DCR-SR82E详细技术参数 凯迪拉克合资还是国产 凯迪拉克国产还是进口的 vb 字符串处理 VB6.0中RichTextBox判断语法 vb RichTextBox1 七年级下册语文假日知新的答案 七年级下册《假日知新》语文数学的答案 七年级下册暑假学习与生活假日知新语文答案 基础垫层作用 2012福建高考你估分多少?分科 福建省2012年高考文科总分613分,成绩怎样?可以报什么大学 非法采伐、毁坏国家重点保护植物罪的构成要件应是什么 答题卡上的准考证号有写的,有涂的,如果写对涂错或者写错涂对会导致什么... 电工操作证考试填错准考证号怎么办 黎明觉醒黑客小米勒下载地址 百乐眠胶囊的功效是什么 百乐眠胶囊治什么型的失眠 百乐眠胶囊治失眠的效果 歌曲《打靶归来》是谁唱的? 请问2015年已经发布的合肥市直事业单位招聘是聘用制还是有编制的?_百 ... 合肥市直事业单位笔试排名 2015合肥市庐阳区招聘笔试培训?