如何把點與點連接在一起 |
尚未結案
|
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
以下是我寫的程式..但我不知道我哪裡寫錯了..為什麼不能把紅點和紅點連成線..可不可以請各位大大幫我看哪裏寫錯了..麻煩各位...
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Graphics::TBitmap *TheBitmap; char buf[64]; bool bFirst = false; sprintf(buf,"X座標=>%d, Y座標=>%d",X,Y); ListBox1->Items->Add(buf); x_buffer[number]=X; y_buffer[number]=Y; number ; StartX=X; StartY=Y; HWND hwnd; HDC hdc; hwnd=this->Handle; hdc=GetDC(hwnd); SetPixel(hdc,X Image1->Left , Y Image1->Top ,clRed); //------------------------------------畫成線的程式 Image1->Canvas->Pen->Width=2; Image1->Canvas->Pen->Color=clBlue; Image1->Canvas->LineTo(x,y); Image1->Canvas->MoveTo(x,y); //---------------------------------------------- if(Pasting_Enable) { Pasting=true; Masking=false; Pasting_Enable=false; } else { Masking=true; Pasting=false; TheBitmap=Image1->Picture->Bitmap; // TheBitmap->Canvas->Draw(0,0,OrgBitmap); } Masking=true; TheBitmap=Image1->Picture->Bitmap; //TheBitmap->Canvas->Draw(0,0,OrgBitmap); } |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
RedSnow您好:
我試過了..可以run了...但是有些問題可以請教您一下嗎?
我原本沒畫線時..可以點出紅點...現在能畫線但原本的紅點卻不見了..
且一開始點時應該是直接一點..當我點第二點時..才會連成線..也就是兩點成一條線..是因為我放在MouseDown出問題嗎?..有時候點一點線就不見..有時候會出現黑色的線..但我設的是藍線..請問我該如何改?麻煩大大指教..謝謝..
引言: frankh 您好:引言:為什麼不能把紅點和紅點連成線請將 MoveTo 與 LineTo 那兩行內的 x 與 y 改成大寫 (X, Y),然後再試試看。 如果是要畫紅線的話,就再將它們的前一行設定 Pen Color 的 clBlue 改成 clRed。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/09/23 21:08:04 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
frankh 您好: 您列出來的程式碼有些資料的宣告並未列出,而且我也不知道您其中的一部份程式碼是在做何種處理?因此我僅針對您的問題將相關動作寫出來,請您參考後自行將相關動作融入您的程式內:
// 設定下列全域變數: bool DrawFirStPos = true; // 是否處於繪製第一個點的狀態? int oldX, oldY; // 記錄前一個座標位置的變數 (可能與您設的 x_buffer 與 y_buffer 陣列作用相同) void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ListBox1->Items->Add("X座標=>" IntToStr(X) ", Y座標=>" IntToStr(Y)); Image1->Canvas->Pen->Width = 2; Image1->Canvas->Pen->Color = clRed; if (DrawFirStPos) { // 如果是繪製第一個點的狀態 HDC hdc = GetDC(this->Handle); SetPixel(hdc, X Image1->Left, Y Image1->Top, clRed); // 繪點 oldX = X; // 記錄這次 MouseDown 時的座標值 oldY = Y; DrawFirStPos = false; // 設定檢查旗號為 false } else{ Image1->Canvas->MoveTo(oldX, oldY); // 將畫筆移到前一個點擊位置 Image1->Canvas->LineTo(X, Y); // 畫線至這次點擊的位置 DrawFirStPos = true; // 重設檢查旗號為 true } }7 天天敲鍵盤 v 時時按滑鼠 8 |
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
frankh 您好: 如果是這樣子的話,那麼動作就更簡單了,我前一篇加上去的變數都可以省略,直接沿用您原先的變數即可:
.... 前略 .... ListBox1->Items->Add("X座標=>" IntToStr(X) ", Y座標=>" IntToStr(Y)); Image1->Canvas->Pen->Width = 2; Image1->Canvas->Pen->Color = clRed; if (number > 0) { Image1->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image1->Canvas->LineTo(X, Y); } x_buffer[number] = X; y_buffer[number] = Y; number ; .... 後略 ....至於畫出黑線的問題,那是 OnMouseMove 那一段出的狀況 (按下滑鼠左鍵不要放開,然後移動滑鼠指標位置,就能很明顯的看出來了),但是我並不知道您那一段到底要做何種處理?因此不便提供意見,建議您先將 OnMouseMove 那一段處理動作先 Mark 掉,等到弄清楚程式流程,並設好相關變數之設定 (作為 OnMouseMove 事件中是否要處理某段動作的識別依據) 後,再重新運作該段敘述。 7 天天敲鍵盤 v 時時按滑鼠 8 |
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
frankh 您好: 如果您想要在點陣圖的處理上做 Undo 的動作,以我個人的經驗而言,似乎除了使用記憶體或是磁碟空間將每次圖形變化前的內容記錄下來,然後在執行 Undo 動作時由記憶體或磁碟讀回圖形內容之外,沒有什麼其它的好辦法了。 Redo 的作法則是依樣畫葫蘆即可,關於 Undo 與 Redo 的動作,站上也有一些討論,大體上都是使用 vector 或是 list 來記錄圖形的變化內容,但是 TList 有些問題不大適合直接使用,我在網路上找到一篇文章是 BCBDEV.COM 發表的一篇文章,該文介紹了如何讓 TList 更安全的用法,作者 Harold Howe 還寫了一個命名為 TTypedList 的 class,我使用過的感覺是蠻好用的,該站台似乎已經接不通了,但是網路上有不少站台有轉載或是翻譯,下列網頁就是其中的一個,不妨參考一下:
讓 TList 類型安全 (簡體中文)
http://www.study888.com/computer/pro/cc/200505/35442.html
如果您對原文資料比較有興趣,或是擔心轉載頁面有缺漏的話,可以由 Google 搜尋 "Type-safe TList Objects" 或是 TTypedList 字樣,然後從 Google 的庫存中挖出 BCBDEV.COM 的那篇文章來看。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/09/24 19:48:47
|
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
frankh 您好:
引言:請問一下如果只是純粹的把在圖片上畫的線清楚掉..而不是復原到上一步驟..那該如何做呢?這種狀況還是必須區分清楚,看是有 "底圖" 的狀態,還是沒有 "底圖" 的狀態? 如果是沒有底圖的狀態,那麼直接使用畫布的底色填到滑鼠指標所指的位置就可以 "清除" 掉畫布上的 "內容" 了。 如果是有底圖的狀態,恐怕就無法直接做局部 "還原" 的動作了,如果您確實有這樣的需求,那麼您可以考慮使用支援 "層次" (Layer) 的繪圖元件,這樣子就可以在底圖之上設置多個 "畫布層",然後在這些畫層上作畫,而清除動作可以比照前述 "沒有底圖" 的方式來處理,當處理完畢要儲存或是複製包含底圖與各個圖層資料的整張圖時,就先將它們合併起來,再做那些處理就可以了。 下列是我所知道有支援 "層次" (Layer) 的繪圖元件 (免費、含 Delphi 原始碼): Graphics32 http://www.graphics32.org/wiki/ 7 天天敲鍵盤 v 時時按滑鼠 8 |
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
|
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
frankh 您好:
引言:抱歉再請問您一個問題..就是現在像我的程式裡面是只要是點與點就能連成線...但是我如果想在點回原點後..再另一個範圍可以繼續點..ex.假設我點六點成一個圓...如果我在別的範圍中也要點成一個圓..以現再的程式會變成從第一個圓的一點..直接劃一條線到第二個圓的第一點...能不能把它做分割...兩個圓中間不會再有線..在圖片上看到只是兩個圓...麻煩請您再教導我一下...將相關變數與陣列設為繪製第一個圓形圖時的初值 (歸零) 應該就可以了。 7 天天敲鍵盤 v 時時按滑鼠 8 |
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
frankh
一般會員 發表:25 回覆:36 積分:12 註冊:2005-05-04 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |