可能需要API吧?
听说有RichTextBox SDK的,可是找不到
听说有RichTextBox SDK的,可是找不到
解决方案 »
- 十六进制转换成十进制 怎么办 vb?
- 求證代碼是否錯誤?-VB
- vb编程俱乐部qq群(8017281)
- 我有一个在98下用VB5.0编的程序,但在XP下运行不了,求教解决方法?
- 在日文环境中打印汉字时出现乱码
- 在朋友处,"偷"得几个他说是非常非常经典的VB源程序. 谁知运行时, 说找不到crystl32.ocx这个控件.
- 求InstallShield6.31以及它可用的语言包下载网址
- 如何改Msgbox的capition?
- data report 能做横着的报表么?
- 谁有音乐键盘的原码?
- 什么是数据偏移?
- 为什么使用set adoRs=adoCn.Execute("select * from table_A") 之后无法得到adoRs.RecordCount的值?
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383
Static strText As String
Static strRTF As String
If rtbText.Text = strText And rtbText.TextRTF <> strRTF Then
rtbText.TextRTF = strRTF
End If
strText = rtbText.Text
strRTF = rtbText.TextRTF
End Sub
strRTF = rtbText.TextRTF
会要求越来越多的内存,严重时会使程序崩溃
您这办法的确是不太好用
这个帖子我看过,可惜没把问题解决
图片已经插入了的,我是用Ctrl+V 插入的,插入后不想让用户动态拉伸,怎解?
http://blog.csdn.net/rainstormmaster/archive/2006/02/09/595210.aspx
这篇文章中提到的接口你的程序中会用到,另外,获得图片对应的rect的程序就包含在文章中刷新部分的代码中其实,你还不如直接用文章的方法插入图片:
只要指定REOBJECT的
.dwFlags = REO_BELOWBASELINE
自然就不能拉伸图片,必要的话,还可以屏蔽掉剪贴板具体怎么做,看你项目的要求了
'我也一直在关注这个问题
'照你的函数写了一个过程
'可是,还有点小问题
'望赐教
'虽说VB学了很久了,可一直没碰过OLE和COM
'呵呵,偶还是对API比较有兴趣.Dim mIRichEditOle As IRichEditOle
Dim mIOleClientSite As IOleClientSite
Dim mReObject As REOBJECT
Const WM_USER = &H400
Const EM_GETOLEINTERFACE = WM_USER + 60
Const EM_POSFROMCHAR = (WM_USER + 38)With RichText1
'向richtextbox发送EM_GETOLEINTERFACE消息获得IRichEditOle接口,实例化mIRichEditOle
SendMessage .hWnd, EM_GETOLEINTERFACE, 0, mIRichEditOle
If ObjPtr(mIRichEditOle) = 0 Then
MsgBox "Error to get IRichEditOle"
Exit Sub
End If
'调用GetClientSite函数,实例化mIOleClientSite
Set mIOleClientSite = mIRichEditOle.GetClientSite
If ObjPtr(mIOleClientSite) = 0 Then
MsgBox "Error to get ClientSite"
Exit Sub
End If
Dim i As Long
For i = 0 To mIRichEditOle.GetObjectCount - 1
mReObject.cbStruct = LenB(mReObject)
mIRichEditOle.GetObject i, mReObject, REO_GETOBJ_ALL_INTERFACES
With mReObject
'去掉Resizeable样式
.dwFlags = .dwFlags And Not REO_RESIZABLE
End With
'************
'这里应该怎么写回OLE对象呢?
'好像没有找到SetObject方法
Next
End WithSet mIRichEditOle = Nothing
Set mIOleClientSite = Nothing
'好像没有找到SetObject方法是的,并没有SetObject方法,想利用这种思路实现的话,可以考虑获得REOBJECT后先删除图片,改变dwflags后再InsertObject,这个应该是个可行的方法
这句,我一直行不通
那IRichEditOle不知道被哪个TLB给封装了?
http://www.mvps.org/emorcillo/download/vb6/tl_ole.zip
下载后,解压,然后添加对tlb文件的引用
且在VB里已经引用了的,我再引用那个下载下来的没反应啊
是不是要把系统目录里的那个替换掉?
Dim mIRichEditOle As IRichEditOle找不到 IRichEditOle
都没辄我看这个问题也就这样了.呵呵,只是针对图片的话,问题倒是不难解决,我在想如何适用于所有对象
有高招?
分享一下,大家都亟待解决这个问题。
把你前几天的代码改成:
With mReObject
'去掉Resizeable样式
.dwFlags = .dwFlags And Not REO_RESIZABLE
End With这样不行吗?我测试过的,适用于所有对象。
'rainstormmaster写于2006年2月19日凌晨
'转载请保留上述信息
Private Const WM_USER = &H400
Private Const EM_GETOLEINTERFACE = WM_USER + 60
Private Const EM_POSFROMCHAR = (WM_USER + 38)
Private Const EM_EXGETSEL = (WM_USER + 52)
Private Const EM_EXSETSEL = (WM_USER + 55)
Private Type CharRange
cpMin As Long
cpMax As Long
End Type
Private Declare Function PutFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
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
Private Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" (dest As Any, ByVal numBytes As Long)'改变richtextbox中索引(从0开始)为index的oleobject的dwFlags,如果index小于等于-1,则应用于全部对象
Private Sub changeReobjectsFlag(ByVal mHwnd As Long, ByVal newFlag As REO_FLAGS, Optional index As Long = -1)
Dim mIRichEditOle As IRichEditOle
Dim mReObject As REOBJECT
Dim mILockBytes As ILockBytes
Dim OldCharRange As CharRange
Dim NewCharRange As CharRange
Dim objCount As Long
Dim mIStorage As IStorage
Dim mIOleClientSite As IOleClientSite
Dim mIOleObject As IOleObject
Dim mUUID As UUID
SendMessage mHwnd, EM_GETOLEINTERFACE, 0, mIRichEditOle
If ObjPtr(mIRichEditOle) = 0 Then
MsgBox "Error to get IRichEditOle"
Exit Sub
End If
'获得richtextbox中oleobject的数量
objCount = mIRichEditOle.GetObjectCount
If objCount = 0 Then
MsgBox "richtextbox中没有包含oleobject"
Set mIRichEditOle = Nothing
Exit Sub
End If
If index <= -1 Then '全部改变
'记录下richtextbox当前选定的内容
SendMessage mHwnd, EM_EXGETSEL, 0, OldCharRange
Dim i As Long
For i = 0 To objCount - 1
' '获得oleobject对象的信息
mReObject.cbStruct = LenB(mReObject)
mIRichEditOle.GetObject i, mReObject, REO_GETOBJ_ALL_INTERFACES
Set mIOleObject = mReObject.poleobj
With NewCharRange
.cpMin = mReObject.cp
.cpMax = mReObject.cp
End With
'删除当前的oleobject
'只所以不用selstart之类的属性控制,是因为ReObject.cp是基于字节的
PutFocus mHwnd
SendMessage mHwnd, EM_EXSETSEL, 0, NewCharRange
SendKeys "{DEL}", True
'改变dwflags后重新插入oleobject
Set mILockBytes = CreateILockBytesOnHGlobal(0&, True)
If ObjPtr(mILockBytes) = 0 Then
MsgBox "Error to create Global Heap"
Exit Sub
End If
'创建storage,实例化mIStorage
Set mIStorage = StgCreateDocfileOnILockBytes(mILockBytes, STGM_SHARE_EXCLUSIVE _
Or STGM_CREATE Or STGM_READWRITE, 0)
If ObjPtr(mIStorage) = 0 Then
MsgBox "Error to create storage"
Exit Sub
End If
'调用GetClientSite函数,实例化mIOleClientSite
Set mIOleClientSite = mIRichEditOle.GetClientSite
If ObjPtr(mIOleClientSite) = 0 Then
MsgBox "Error to get ClientSite"
Exit Sub
End If
OleSetContainedObject mIOleObject, True
mIOleObject.GetUserClassID mUUID
With mReObject
.cbStruct = LenB(mReObject)
.clsid = mUUID
.cp = REO_CP_SELECTION
.dwFlags = newFlag
Set .poleobj = mIOleObject
Set .polesite = mIOleClientSite
Set .pStg = mIStorage
End With
'恢复richtextbox原来选定的内容
mIRichEditOle.InsertObject mReObject
Next
SendMessage mHwnd, EM_EXSETSEL, 0, OldCharRange
Else
If index > objCount - 1 Then
MsgBox "无效的索引,请检查index属性值"
Set mIRichEditOle = Nothing
Exit Sub
Else
'记录下richtextbox当前选定的内容
SendMessage mHwnd, EM_EXGETSEL, 0, OldCharRange
'获得oleobject对象的信息
mReObject.cbStruct = LenB(mReObject)
mIRichEditOle.GetObject index, mReObject, REO_GETOBJ_ALL_INTERFACES
Set mIOleObject = mReObject.poleobj
'获得当前对象在richtextbox中的位置
With NewCharRange
.cpMin = mReObject.cp
.cpMax = mReObject.cp
End With
'删除当前的oleobject
'只所以不用selstart之类的属性控制,是因为ReObject.cp是基于字节的
PutFocus mHwnd
SendMessage mHwnd, EM_EXSETSEL, 0, NewCharRange
SendKeys "{DEL}", True
'改变dwflags后重新插入oleobject
Set mILockBytes = CreateILockBytesOnHGlobal(0&, True)
If ObjPtr(mILockBytes) = 0 Then
MsgBox "Error to create Global Heap"
Exit Sub
End If
'创建storage,实例化mIStorage
Set mIStorage = StgCreateDocfileOnILockBytes(mILockBytes, STGM_SHARE_EXCLUSIVE _
Or STGM_CREATE Or STGM_READWRITE, 0)
If ObjPtr(mIStorage) = 0 Then
MsgBox "Error to create storage"
Exit Sub
End If
'调用GetClientSite函数,实例化mIOleClientSite
Set mIOleClientSite = mIRichEditOle.GetClientSite
If ObjPtr(mIOleClientSite) = 0 Then
MsgBox "Error to get ClientSite"
Exit Sub
End If
OleSetContainedObject mIOleObject, True
mIOleObject.GetUserClassID mUUID
With mReObject
.cbStruct = LenB(mReObject)
.clsid = mUUID
.cp = REO_CP_SELECTION
.dwFlags = newFlag
Set .poleobj = mIOleObject
Set .polesite = mIOleClientSite
Set .pStg = mIStorage
End With
mIRichEditOle.InsertObject mReObject
'恢复richtextbox原来选定的内容
SendMessage mHwnd, EM_EXSETSEL, 0, OldCharRange
End If
End If
'释放资源
Set mIRichEditOle = Nothing
Set mILockBytes = Nothing
Set mIStorage = Nothing
Set mIOleClientSite = Nothing
Set mIOleObject = Nothing
End Sub
Private Sub Command1_Click()
changeReobjectsFlag Me.RichTextBox1.hwnd, REO_BELOWBASELINE, 0
End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
RichTextBox1.TextRTF = ""
End Sub