RichTextBox 控件插入圖片的兩種方法 - 代碼發(fā)布 - 編程 ,PLM研究,PLM,PDM,漂亮妹,漂亮美,漂亮嗎,漂亮媽,plm是什么 - Powered by Discuz!
前天經(jīng)過了連續(xù) 6個小時的試驗,終于突破了二十多天的困擾,取得了成功!哇,爽,好爽,爽極了!我接連打了10個響指,又吹了一分鐘的口哨,以發(fā)泄我無比喜悅的心情。代碼看起來非常簡單,卻浸透我的腦汁,每個字符至少要消耗 100個腦細胞!
好,下面就讓弟兄們一道來分享我的快樂吧。
我們知道,RichTextBox 控件插入圖片時,最令人頭大的事情就是:當控件中有漢字時,插入的圖片不能將它粘貼在指定的位置——它會出現(xiàn)在你意想不到的地方!SelStart屬性絲毫不起作用,這無疑是RichTextBox控件的一個BUG。以下的代碼就是為了解決這個問題。
第一種方法:
本方法直接將圖片定位到所需要的位置。
優(yōu)點:一步到位,操作便捷,缺點:要多用一個 RichTextBox 控件。
新建一個工程,在窗體上添加兩個 RichTextBox 控件,RichTextBox1作為主窗口,RichTextBox2作為專用控件,可以畫小一點。RichTextBox2 的屬性設(shè)置:
ScrollBars=3
TabStop=False
Text=""
Visible=False
再在窗體上添加五個按紐,按紐的標題和名稱均為:
1.打開圖片文件
2.特殊剪切
3.特殊復制
4.剪切
5.復制
6.粘貼
本方法的操作與常用的編輯操作基本相同,唯一不同之處是,當你要剪切或復制圖文混合的內(nèi)容粘貼到本窗口別的地方時,必須使用“特殊剪切”或“特殊復制”。
代碼如下:
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
第二種方法:
本方法先將圖片粘貼到窗口,再通過操作將圖片定位。
優(yōu)點:少用一個 RichTextBox 控件,缺點:在進行實際編輯操作時稍微麻煩一些。
新建一個工程,在窗體上添加一個 RichTextBox 控件和七個按紐,按紐的標題和名稱均為:
1.打開圖片文件
2.特殊剪切
3.特殊復制
4.特殊粘貼
5.剪切
6.復制
7.粘貼
以下三種情況請先點擊一下 RichTextBox 控件上的圖片,再用"特殊剪切"或"特殊復制"功能將圖片復制到系統(tǒng)剪貼板,再將光標定位,最后使用"粘貼"功能將它粘貼到你需要的地方:
1.當你新打開了一個圖片文件;
2.你從系統(tǒng)的畫圖程序中復制了圖片,并用"特殊粘貼"功能粘貼到了本窗口;
3.圖片定位好了,你又想將它復制或剪切到本窗口的其它地方。
如果你想復制或剪切 RichTextBox 控件上的圖片粘貼到畫圖程序上去,就用"常規(guī)復制"或"常規(guī)剪切"即可,但如果是粘貼到另外的使用 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
試一試,怎么樣?呵呵,再調(diào)皮的圖片也要俯首稱臣,乖乖地聽你的指揮了,你就可以隨心所欲地制作圖文并茂的 RTF 文檔了!
我的理解是:要將圖片定位,就必須使用 SelRTF 屬性,而要使用 SelRTF 屬性,就必須使剪貼板中的內(nèi)容為 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
至少,這些數(shù)字是令人費解的。
一個對API熟悉的人,是不會寫出這樣的代碼的。
2007-8-26
呵呵,老兄,在我的程序中,所有API函數(shù)的常數(shù)都沒有賦值,都是直接用相應(yīng)的數(shù)字,對API熟悉也好不熟悉也好,這就是我的編程特色吧,有個人不是說,不管白貓黑貓抓住老鼠就是好貓嗎?
2007-8-26
可讀性差.
不要說這些數(shù)字是你試驗出來的?
汗!!
吟一手好詩不難,難得的是吟一被子的好詩!
最近比較忙,有空會上來看看
2007-8-26
引用:
呵呵,老兄,在我的程序中,所有API函數(shù)的常數(shù)都沒有賦值,都是直接用相應(yīng)的數(shù)字,對API熟悉也好不熟悉也好,這就是我的編程特色吧,有個人不是說,不管白貓黑貓抓住老鼠就是好貓嗎?
然而,你現(xiàn)在抓住了老鼠,一年后,你還會明白抓住這只老鼠的方法是什么嗎?
并且,你這樣怎么讓人家明白你是怎么抓住這只老鼠的呢?
當然,對于只要結(jié)果的人無所謂,但我相信,這些人以后只會復制代碼,并且還要根據(jù)具體環(huán)境作出相應(yīng)的修改,這些活已經(jīng)足夠累死他了(因為他不可能明白,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文件中,可以隨時對照,如果需要,我可以另發(fā)一個新貼,將我收集的消息貼出來
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
看看兩者,哪個更加容易理解?
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。