全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6900
推到 Plurk!
推到 Facebook!

如何選取Image上所畫的圖形 並且可以拉大、拉小、移動圖形

 
aconxu
一般會員


發表:18
回覆:41
積分:11
註冊:2006-12-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-01-09 11:15:30 IP:211.23.xxx.xxx 訂閱
大家好~
有個問題想請問大家~
我現在
在Image上畫出 "矩形" & "圓形"
希望可以選取圖形後
可以 "移動"、"拉大"、"拉小"我所畫的元件放大、縮小的教學
可是我要的是我所畫的圖形拉大、拉小
謝謝大家~
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-09 12:00:18 IP:220.130.xxx.xxx 訂閱
選取的部份,小畫家在選取的時候都會畫一個虛線框出來,所以你也要照抄,這樣才知道選了什麼..:P
那麼,就在MouseDown裡面畫虛線,直到MouseUp
假設你會畫矩形,會畫圓形,這應該不成問題
但是有個問題,你要判別什麼時候是選取什麼時候是畫圖,自己用個flag去判斷
重點就是當你要畫虛線框時,如果你直接畫在Image的Canvas上面,那會跟你原先的圖合在一起
所以你需要額外的一個Bitmap,這個Bitmap當畫圖的時候,就跟著一起存一份一樣的,
當你要選取的時候,你就可以直接畫在Image上面,你只要知道起始跟停止的兩個坐標,就可以知道範圍
這兩個坐標跟額外的Bitmap會一樣,所以你就可以直接處理Bitmap,也不會把虛線框跟原圖混在一起

畫完之後你要用元件去放大縮小,就等於是跟你一般的圖作放大縮小是一樣的道理
移動的話,就再用另一個Bitmap把框內的圖形畫上去,然後把原圖的Bitmap上的那一塊清空
當MouseDown未放開的時候,滑鼠移多少,就畫在Image上移多少
畫的時候就是先把Image清空,畫上原圖,再算你滑鼠移動的距離,對上原圖的距離,跟著畫上剛剛搬出來的那一塊就是了XD
大概是這樣XD

這就是傳說中抄小畫家的技能(?)
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
aconxu
一般會員


發表:18
回覆:41
積分:11
註冊:2006-12-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-01-11 14:00:13 IP:211.23.xxx.xxx 訂閱
我可以把在我會控制元件放大縮小~
你所說的中間這一段我不太懂~
可以再說的清楚一點嗎??
謝謝~

===================引 用 文 章===================
選取的部份,小畫家在選取的時候都會畫一個虛線框出來,所以你也要照抄,這樣才知道選了什麼..:P
那麼,就在MouseDown裡面畫虛線,直到MouseUp
假設你會畫矩形,會畫圓形,這應該不成問題
但是有個問題,你要判別什麼時候是選取什麼時候是畫圖,自己用個flag去判斷
重點就是當你要畫虛線框時,如果你直接畫在Image的Canvas上面,那會跟你原先的圖合在一起
所以你需要額外的一個Bitmap,這個Bitmap當畫圖的時候,就跟著一起存一份一樣的,
當你要選取的時候,你就可以直接畫在Image上面,你只要知道起始跟停止的兩個坐標,就可以知道範圍
這兩個坐標跟額外的Bitmap會一樣,所以你就可以直接處理Bitmap,也不會把虛線框跟原圖混在一起


畫完之後你要用元件去放大縮小,就等於是跟你一般的圖作放大縮小是一樣的道理
移動的話,就再用另一個Bitmap把框內的圖形畫上去,然後把原圖的Bitmap上的那一塊清空
當MouseDown未放開的時候,滑鼠移多少,就畫在Image上移多少
畫的時候就是先把Image清空,畫上原圖,再算你滑鼠移動的距離,對上原圖的距離,跟著畫上剛剛搬出來的那一塊就是了XD
大概是這樣XD

這就是傳說中抄小畫家的技能(?)
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-01-11 14:13:01 IP:220.130.xxx.xxx 訂閱
當你要選取的時候,你就可以直接畫在Image上面,你只要知道起始跟停止的兩個坐標,就可以知道範圍

這兩個坐標跟額外的Bitmap會一樣,所以你就可以直接處理Bitmap,也不會把虛線框跟原圖混在一起

因為你的原圖跟你的畫布是一樣的大小,所以坐標也是一樣的,不管是放大縮小,就是先處理原圖之後,再畫回畫布上
總之,你的畫布因為會一直不斷的被「亂畫」,所以你想要有什麼動作就得另外儲存,
比如說你想要模擬Ctrl Z的還原,就最簡單的實現而言,就是儲存一份上一次更改的Bitmap
在這裡,為了要實現可以畫虛線框來作選取的動作,所以我們需要一塊可以拿來儲存我們原本畫的圖以避免虛線框也被當成圖形處理

我表達的好像不是很好,如果有問題就再問好了Orz
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
aconxu
一般會員


發表:18
回覆:41
積分:11
註冊:2006-12-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-01-16 15:50:36 IP:211.23.xxx.xxx 訂閱
Form2->Canvas->Ellipse(m_ptOrigin.x,m_ptOrigin.y,m_ptMove.x,m_ptMove.y);
m_ptMove.x = X;
m_ptMove.y = Y;
Form2->Canvas->Ellipse(m_ptOrigin.x,m_ptOrigin.y,m_ptMove.x,m_ptMove.y);

//建立一個Bitmap物件
Graphics::TBitmap* bmp=new Graphics::TBitmap();
bmp->Width=Image1->Width;
bmp->Height=Image1->Height;
bmp->Transparent=true;
bmp->Canvas->Brush->Style=bsClear;
bmp->Assign(Image1->Picture->Bitmap);

問題二:如何將Bitmap貼回Canvas上


抱歉~表達的不好~
大家懂不懂
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-01-17 01:10:41 IP:203.73.xxx.xxx 訂閱
一、你可以建立一個一模一樣大小的Bitmap(藉由指定長寬),就如同你自己寫的Code一樣,然後你畫什麼在Canvas上就在Bitmap的Canvas畫一樣的效果,除了畫虛線跟移動等效果(直到效果確認,才把圖畫到備份上),比如你已經使用Ellipse畫了圓,那麼你可以用同樣的函式同樣的Brush,只不過是改成操作一個叫bkpBmp的TBitmap,所有的事情都作兩遍就對了,這是最快的方法XD
但是你要知道你在操作哪一個畫布,Form有自己的Canvas,Image也有自己的Canvas,我建議你畫在Image上才比較好控制
二、貼的話,你可以找一下函式,Draw就是可以指定你要在Canvas上的某一點,畫上整個Bitmap,因為你只是要畫上原圖而已,所以不需要考慮太多。如果你需要像我之前說的當成物件,就要考慮背景或不規則處理的問題。當然,你也可以參考Scanline,它處理圖形的效率會更好,相關的說明你參考help上的範例,應該不難,有問題歡迎繼續問XD
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
aconxu
一般會員


發表:18
回覆:41
積分:11
註冊:2006-12-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-01-17 14:46:39 IP:211.23.xxx.xxx 訂閱
已經可以在Canvas上畫圖,並且可以在bitmap上複製一份

TShiftState Shift, int X, int Y)
void __fastcall TForm2::FormMouseMove(TObject *Sender, TMouseButton Button,
1.在Form->Canvas上畫出圓形
3.在bitmap->Canvas上畫出圓形 //同樣的圖形同時在Form及Bitmap上各畫一個

TShiftState Shift, int X, int Y)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
但是~現在要判斷什麼時候該把bitmap上的圖貼上??
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-01-17 22:36:48 IP:203.73.xxx.xxx 訂閱
什麼時候才要畫在bkp裡面,那就取決於你真正要把圖畫上去或者是執行某個效果的時候,
而bkp什麼時候才要拿出來用?就是當你在使用效果的時候,這時候跟原圖沒有關,
但是你又在畫布上畫上因為執行效果需要的圖,那麼你就需要在每次效果執行(如滑鼠拖曳)時先畫上原圖再畫上效果
你可以動手玩玩小畫家,仔細想一下,如果要移動圖形,那麼就會有以下的動作
按住滑鼠不放,
拖曳,這時候會產生虛線框,直到你放開滑鼠,
這時候點選虛線框內的圖形按住不放,
拖曳,這時候虛線內的圖形隨著你的滑鼠移動跟著移動,且原先框住的部份會變成空白
滑鼠放開,圖形固定,
在虛線框以外點一下或者是使用其它效果,則虛線框消失,

所以,你該在哪邊畫bkp呢?:P
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
aconxu
一般會員


發表:18
回覆:41
積分:11
註冊:2006-12-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-01-19 13:26:42 IP:211.23.xxx.xxx 訂閱
感謝Coffee~

我現在的問題在於:
畫圖時~透過MouseUP 、 MouseDown、MouseMove事件 ~來得知圖形的大小及位置

但是~在選取並移動圖形也利用 MouseUP 、 MouseDown、MouseMove事件~ 來得知圖形移動多少距離~

這二個會互相影響~
應該是我在邏輯上沒想好~
哈~還要再努力~
真的很感謝你~
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-01-20 15:24:57 IP:203.73.xxx.xxx 訂閱
畫圖時~透過MouseUP 、 MouseDown、MouseMove事件 ~來得知圖形的大小及位置
但是~在選取並移動圖形也利用 MouseUP 、 MouseDown、MouseMove事件~ 來得知圖形移動多少距離~

其實就差一步了喔!
這些你都會了,那麼,你有發現嗎?你這兩行的差別是不是在於「畫圖」或「選取」、「移動圖形」
你可以用一個flag來表示你現在的狀態,所以你的函式就會變成

on MouseDown

switch CurrentState

csDraw :

csSelect:

csMove:
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
aconxu
一般會員


發表:18
回覆:41
積分:11
註冊:2006-12-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-01-24 10:49:45 IP:211.23.xxx.xxx 訂閱
感謝 Coffee~
我有去請教別人~

假設知道如何在執行時~移動及改變元件的大小~(網路上很多教學)
首先~當你在畫圖時
1.當MouseUp時就
動態產生一個跟你畫的圖形一樣大小的Image
2.清除畫在Form上的圖,並將圖形畫
在動態產生的Image上
這樣就可以移動了

至於拉大、拉小~
還不太會就是了~
因為不知道如何在改變Image大小時 Image上的圖形也能同步的改變~
因為~Image沒有OnPaint的事件~
所以還在想~
這個問題我有另外發問了~
所以我要將這個主題~結案了~
謝謝你~Coffee
系統時間:2024-04-30 16:03:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!