前天经过了连续 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 看看两者,哪个更加容易理解? |
|