分享

RichTextBox 控件插入图片的两种方法 - 代码发布 - 编程 ,PLM研究,PLM,PDM,漂亮妹,漂亮美,漂亮吗,漂亮妈,plm是什么 - Powered by Discuz!

 nxhujiee 2010-08-15
前天经过了连续 6个小时的试验,终于突破了二十多天的困扰,取得了成功!哇,爽,好爽,爽极了!我接连打了10个响指,又吹了一分钟的口哨,以发泄我无比喜悦的心情。代码看起来非常简单,却浸透我的脑汁,每个字符至少要消耗 100个脑细胞!

好,下面就让弟兄们一道来分享我的快乐吧。

我们知道,RichTextBox 控件插入图片时,最令人头大的事情就是:当控件中有汉字时,插入的图片不能将它粘贴在指定的位置——它会出现在你意想不到的地方!SelStart属性丝毫不起作用,这无疑是RichTextBox控件的一个BUG。以下的代码就是为了解决这个问题。

第一种方法:

本方法直接将图片定位到所需要的位置。

优点:一步到位,操作便捷,缺点:要多用一个 RichTextBox 控件。

新建一个工程,在窗体上添加两个 RichTextBox 控件,RichTextBox1作为主窗口,RichTextBox2作为专用控件,可以画小一点。RichTextBox2 的属性设置

ScrollBars=3
TabStop=False
Text=""
Visible=False

再在窗体上添加五个按纽,按纽的标题和名称均为:

1.打开图片文件
2.特殊剪切
3.特殊复制
4.剪切
5.复制
6.粘贴

本方法的操作与常用的编辑操作基本相同,唯一不同之处是,当你要剪切或复制图文混合的内容粘贴到本窗口别的地方时,必须使用“特殊剪切”或“特殊复制”。

代码如下:

Private Sub 打开图片文件_Click()'可打开的图片类型为:bmp,jpg,gif,WMF
Clipboard.Clear
Clipboard.SetData LoadPicture("(全路径文件名)")
If Clipboard.GetData Then 粘贴_Click
End Sub

Sub 复制_Click()
SendMessage RichTextBox1.hwnd, 769, 0, 0
End Sub

Sub 剪切_Click()
SendMessage RichTextBox1.hwnd, 768, 0, 0
End Sub

Sub 粘贴_Click()
If Clipboard.GetFormat(vbCFText) Then RichTextBox1.SelRTF = Clipboard.GetText: Exit Sub
If Clipboard.GetFormat(vbCFBitmap) Then
  SendMessage RichTextBox2.hwnd, 1088, 2, 1
Else
  SendMessage RichTextBox2.hwnd, 770, 0, 0
End If
RichTextBox2.SelStart = 0: RichTextBox2.SelLength = 1
Clipboard.SetText RichTextBox2.SelRTF
RichTextBox2 = "": RichTextBox1.SetFocus
RichTextBox1.SelRTF = Clipboard.GetText
End Sub

Private Sub 特殊复制_Click()
Clipboard.SetText RichTextBox1.SelRTF
End Sub

Private Sub 特殊剪切_Click()
Clipboard.SetText RichTextBox1.SelRTF
RichTextBox1.SelText = ""
End Sub

第二种方法:
本方法先将图片粘贴到窗口,再通过操作将图片定位。
优点:少用一个 RichTextBox 控件,缺点:在进行实际编辑操作时稍微麻烦一些。
新建一个工程,在窗体上添加一个 RichTextBox 控件和七个按纽,按纽的标题和名称均为:

1.打开图片文件
2.特殊剪切
3.特殊复制
4.特殊粘贴
5.剪切
6.复制
7.粘贴

以下三种情况请先点击一下 RichTextBox 控件上的图片,再用"特殊剪切"或"特殊复制"功能将图片复制到系统剪贴板,再将光标定位,最后使用"粘贴"功能将它粘贴到你需要的地方:

1.当你新打开了一个图片文件;
2.你从系统的画图程序中复制了图片,并用"特殊粘贴"功能粘贴到了本窗口;
3.图片定位好了,你又想将它复制或剪切到本窗口的其它地方。

如果你想复制或剪切 RichTextBox 控件上的图片粘贴到画图程序上去,就用"常规复制"或"常规剪切"即可,但如果是粘贴到另外的使用 RichTextBox 控件的记事本上,仍然要用"图片复制"。
代码如下:

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 Sub 打开图片文件_Click()'可打开的图片类型为:bmp,jpg,gif
Clipboard.Clear
Clipboard.SetData LoadPicture("(全路径文件名)")
If Clipboard.GetData Then 特殊粘贴_Click
End Sub

Private Sub 特殊复制_Click()
Clipboard.SetText RichTextBox1.SelRTF
End Sub

Private Sub 特殊剪切_Click()
Clipboard.SetText RichTextBox1.SelRTF
RichTextBox1.SelText = ""
End Sub

Private Sub 特殊粘贴_Click()
RichTextBox1.SetFocus
SendMessage RichTextBox1.hwnd, 1088, 2, 1
End Sub

Private Sub 复制_Click()
SendMessage RichTextBox1.hwnd, 769, 0, 0
End Sub

Private Sub 剪切_Click()
SendMessage RichTextBox1.hwnd, 768, 0, 0
End Sub

Private Sub 粘贴_Click()
RichTextBox1.SelRTF = Clipboard.GetText
End Sub

试一试,怎么样?呵呵,再调皮的图片也要俯首称臣,乖乖地听你的指挥了,你就可以随心所欲地制作图文并茂的 RTF 文档了!
我的理解是:要将图片定位,就必须使用 SelRTF 属性,而要使用 SelRTF 属性,就必须使剪贴板中的内容为 Txet 类型(不能为 Data 类型),哪位兄弟有别的见解或更好的代码,请贴上来,互相学习一下。

2007-8-25

引用:
Private Sub 特殊粘贴_Click()
RichTextBox1.SetFocus
SendMessage RichTextBox1.hwnd, 1088, 2, 1
End Sub

Private Sub 复制_Click()
SendMessage RichTextBox1.hwnd, 769, 0, 0
End Sub

Private Sub 剪切_Click()
SendMessage RichTextBox1.hwnd, 768, 0, 0
End Sub

至少,这些数字是令人费解的。
一个对API熟悉的人,是不会写出这样的代码的。

2007-8-26

呵呵,老兄,在我的程序中,所有API函数的常数都没有赋值,都是直接用相应的数字,对API熟悉也好不熟悉也好,这就是我的编程特色吧,有个人不是说,不管白猫黑猫抓住老鼠就是好猫吗?

2007-8-26

可读性差.
不要说这些数字是你试验出来的?
汗!!

吟一手好诗不难,难得的是吟一被子的好诗!
最近比较忙,有空会上来看看

2007-8-26

引用:
呵呵,老兄,在我的程序中,所有API函数的常数都没有赋值,都是直接用相应的数字,对API熟悉也好不熟悉也好,这就是我的编程特色吧,有个人不是说,不管白猫黑猫抓住老鼠就是好猫吗?

然而,你现在抓住了老鼠,一年后,你还会明白抓住这只老鼠的方法是什么吗?
并且,你这样怎么让人家明白你是怎么抓住这只老鼠的呢?

当然,对于只要结果的人无所谓,但我相信,这些人以后只会复制代码,并且还要根据具体环境作出相应的修改,这些活已经足够累死他了(因为他不可能明白,1088,768,769这些是什么东西)

2007-8-26

Private Sub Form_Click()
    MsgBox "你知道这个对话框有什么效果吗?", 4163
End Sub

2007-8-26

哈哈,这东东这么重要?也许是我的一个坏习惯,改不了。好,我将这几个消息列如下,自己去对号入座吧:
EM_PASTESPECIAL(&H440=1088),2(1),1  RichEdit控件粘贴剪贴板中的位图(或文本)
WM_CUT(&H300=768)                  剪切
WM_COPY(&H301=769)                  复制
WM_PASTE(&H302=770)                 粘贴
WM_CLEAR(&H303=771)                 删除
WM_UNDO(&H304=772)                  撤消

强烈建议各位将常用消息弄到一个TXT文件中,可以随时对照,如果需要,我可以另发一个新贴,将我收集的消息贴出来

2007-8-26

bz还是这么有说服力,呵呵。

2007-8-27

引用:
Private Sub Form_Click()
    MsgBox "你知道这个对话框有什么效果吗?", 4163
End Sub

Private Sub Form_Click()
    MsgBox "你知道这个对话框有什么效果吗?", vbYesNoCancel Or vbInformation Or vbSystemModal
End Sub

看看两者,哪个更加容易理解?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多