線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2062
推到 Plurk!
推到 Facebook!

如何把點與點連接在一起

尚未結案
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-23 20:34:22 IP:220.134.xxx.xxx 未訂閱
以下是我寫的程式..但我不知道我哪裡寫錯了..為什麼不能把紅點和紅點連成線..可不可以請各位大大幫我看哪裏寫錯了..麻煩各位...
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-23 21:00:43 IP:59.115.xxx.xxx 未訂閱
frankh 您好:
引言:為什麼不能把紅點和紅點連成線
請將 MoveTo 與 LineTo 那兩行內的 x 與 y 改成大寫 (X, Y),然後再試試看。 如果是要畫紅線的話,就再將它們的前一行設定 Pen Color 的 clBlue 改成 clRed。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/09/23 21:08:04
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-24 11:38:58 IP:220.142.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-24 13:49:15 IP:61.217.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-24 14:55:21 IP:220.142.xxx.xxx 未訂閱
RedSnow您好: 我把我的程式放在http://delphi.ktop.com.tw/topic.php?TOPIC_ID=78810 不知道您能不能幫我看看..我已經把我原來的程式碼註解掉了..現在兩點已經可以畫成線..但如何把點與點之間一直連成線..而不是像現在當我點第三點時無法跟第二點連起來?還有一個問題是我如果點很多點..那些點都不會見..變成一個框..且線條變黑色?麻煩您指導我一下..不好意思麻煩您了..
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-24 16:47:33 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-24 18:18:26 IP:218.165.xxx.xxx 未訂閱
RedSnow您好: 非常感謝您的指導..關於那個會點很多點出現問題的錯誤..我已經把Mark註解掉了...所以已經不會再出現這個問題..抱歉再請教您最後一個問題..就是如果劃線畫錯要做復原的動作..不知道bcb有沒有提供這個功能..還是要寫指令..如果是指令..那該用什麼關鍵字去尋找相關範例?謝謝您
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-24 19:36:57 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-24 21:00:19 IP:220.142.xxx.xxx 未訂閱
RedSnow您好: 請問一下如果只是純粹的把在圖片上畫的線清楚掉..而不是復原到上一步驟..那該如何做呢?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-24 23:13:20 IP:59.115.xxx.xxx 未訂閱
frankh 您好:
引言:請問一下如果只是純粹的把在圖片上畫的線清楚掉..而不是復原到上一步驟..那該如何做呢?
這種狀況還是必須區分清楚,看是有 "底圖" 的狀態,還是沒有 "底圖" 的狀態? 如果是沒有底圖的狀態,那麼直接使用畫布的底色填到滑鼠指標所指的位置就可以 "清除" 掉畫布上的 "內容" 了。 如果是有底圖的狀態,恐怕就無法直接做局部 "還原" 的動作了,如果您確實有這樣的需求,那麼您可以考慮使用支援 "層次" (Layer) 的繪圖元件,這樣子就可以在底圖之上設置多個 "畫布層",然後在這些畫層上作畫,而清除動作可以比照前述 "沒有底圖" 的方式來處理,當處理完畢要儲存或是複製包含底圖與各個圖層資料的整張圖時,就先將它們合併起來,再做那些處理就可以了。 下列是我所知道有支援 "層次" (Layer) 的繪圖元件 (免費、含 Delphi 原始碼): Graphics32 http://www.graphics32.org/wiki/ 7 天天敲鍵盤 v 時時按滑鼠 8
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-24 23:53:25 IP:220.142.xxx.xxx 未訂閱
RedSnow您好: 非常感謝您幫我解答我的問題..使我受益良多...非常謝謝您^^
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-25 21:39:06 IP:220.134.xxx.xxx 未訂閱
RedSnow您好: 再請問您ㄧ個問題...如果我總共要點四點..是否能將第四點連接到第一點? 假設現在第一點(243.32)..線再我的程式要點回到第一點的座標還是有偏差..變成(241.32)...而不是第一點的座標位址..請問我該如還改?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-25 23:28:01 IP:61.217.xxx.xxx 未訂閱
frankh 您好:
引言:再請問您ㄧ個問題...如果我總共要點四點..是否能將第四點連接到第一點? 假設現在第一點(243.32)..線再我的程式要點回到第一點的座標還是有偏差..變成(241.32)...而不是第一點的座標位址..請問我該如還改?
您不是有記錄下每次按下滑鼠時的座標資料嗎?要畫回第一個點的位置時,直接取用 x_buffer[0] 與 y_buffer[0] 的值就可以了。 7 天天敲鍵盤 v 時時按滑鼠 8
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-09-26 00:48:25 IP:218.165.xxx.xxx 未訂閱
RedSnow您好: 抱歉再請問您一個問題..就是現在像我的程式裡面是只要是點與點就能連成線...但是我如果想在點回原點後..再另一個範圍可以繼續點..ex.假設我點六點成一個圓...如果我在別的範圍中也要點成一個圓..以現再的程式會變成從第一個圓的一點..直接劃一條線到第二個圓的第一點...能不能把它做分割...兩個圓中間不會再有線..在圖片上看到只是兩個圓...麻煩請您再教導我一下...非常感謝您..
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-09-26 02:16:10 IP:61.230.xxx.xxx 未訂閱
frankh 您好:
引言:抱歉再請問您一個問題..就是現在像我的程式裡面是只要是點與點就能連成線...但是我如果想在點回原點後..再另一個範圍可以繼續點..ex.假設我點六點成一個圓...如果我在別的範圍中也要點成一個圓..以現再的程式會變成從第一個圓的一點..直接劃一條線到第二個圓的第一點...能不能把它做分割...兩個圓中間不會再有線..在圖片上看到只是兩個圓...麻煩請您再教導我一下...
將相關變數與陣列設為繪製第一個圓形圖時的初值 (歸零) 應該就可以了。 7 天天敲鍵盤 v 時時按滑鼠 8
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-09-26 11:31:47 IP:218.165.xxx.xxx 未訂閱
RedSnow您好: 抱歉..直接取用 x_buffer[0] 與 y_buffer[0] 的值這個地方我有些不懂耶... 這個值我放在listbox裡面...但是我不知道該怎麼直接取用?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-09-26 11:55:35 IP:59.115.xxx.xxx 未訂閱
frankh 您好:    您雖然有將那個陣列內容設給 ListBox,但是陣列本身的內容並未被清除掉,因此直接取用即可,例如:
Image1->Canvas->LineTo(x_buffer[0], y_buffer[0]);
7 天天敲鍵盤 v 時時按滑鼠 8
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-09-27 23:06:05 IP:220.134.xxx.xxx 未訂閱
RedSnow您好: 想請問如何清除listbox1陣列裡面的內容...用listbox1->clear();是不是只能清除在listbox欄位的數值..但不能清除到陣列本身的內容呢??
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-09-28 00:07:33 IP:61.230.xxx.xxx 未訂閱
frankh 您好:
引言:想請問如何清除listbox1陣列裡面的內容...用listbox1->clear();是不是只能清除在listbox欄位的數值..但不能清除到陣列本身的內容呢??
是的,陣列歸陣列、元件規元件,兩者是不同的東西,要個別處理。 關於清除陣列的方式請練習一下站上的搜尋功能,相信您能找到不少參考資訊的。 7 天天敲鍵盤 v 時時按滑鼠 8
frankh
一般會員


發表:25
回覆:36
積分:12
註冊:2005-05-04

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-09-28 20:20:53 IP:220.134.xxx.xxx 未訂閱
RedSnow您好: 我有參考一些文章寫出一些程式:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     ListBox1->Clear();
    delete []  x_buffer;//清除全部
    delete []  y_buffer;
}
但是為什麼還是只能做到清除listbox1裡面的資料..並不能刪除陣列裡面的資料?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-09-29 01:25:52 IP:61.230.xxx.xxx 未訂閱
frankh 您好:    以您的 case 而言,應該是不需要做那個刪除陣列的動作 (用 new 動態配置出來的陣列才需要 delete),使用 memset() 將陣列內容清為 0,並將 number 也歸零就可以了,要不然您就搜尋站上有關動態陣列的相關討論,將陣列改為動態配置好了。      7 天天敲鍵盤 v 時時按滑鼠 8
系統時間:2024-05-18 5:33:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!