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

如何在任意程式區段撰寫繪圖的程式碼!

尚未結案
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-02 11:35:33 IP:61.63.xxx.xxx 未訂閱
請益(一個問題分三段述說):
(1)
      一般繪圖應該是在FormPaint這個method內加入自已的程式碼完成,可能如下:    void __fastcall TForm1::FormPaint(TObject *Sender)
{
 // Use BCB Canvas object
 Form1->Canvas->TextOutA(10,10,"This is a test!");     // Or use SDK representation
 TextOut(GetDC(Handle),10,10,"This is a test!",15);
}        但如果是將程式碼放在FormCreate、或是隨便一個function內再去call它...等等很多的情況是不可行的,FormPaint多做了什麼別的method沒有的動作?    (2)
    當然放在例如說一個button click事件也是可以的,但是下例放在FormActive也是可行的,卻無法解釋(當然它是沒有repaint功能的)?    void __fastcall TForm1::FormActivate(TObject *Sender)
{
 // 要求Form1重繪
 Form1->Perform(WM_PAINT,0,0);
 // Or the easy way
 SendMessage(Handle,WM_PAINT,0,0);     // 繪出字串
 TextOut(GetDC(Handle),10,10,"This is a test!",15);
}    (3)  
     已用暴力攔截Form的WM_PAINT並在內加入繪圖程式碼,當然這是可行的。
請益,謝謝! 發表人 - taishyang 於 2003/12/02 15:48:46
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-02 18:06:47 IP:211.72.xxx.xxx 未訂閱
好奇的問一下,一定要在FORM上面畫圖嗎? 建議你開一個IMAGE,跟FORM一樣大 然後在IMAGE上面畫圖即可 這樣都迷有Refresh or Repain的問題 如下例 void __fastcall TForm1::FormCreate(TObject *Sender) { //假設IMAGE和FORM一樣大 Image1->Top = 0; Image->Left = 0; Image1->Width = this->ClientWidth; Image1->Height = this->ClientHeight; Image1->Picture->Bitmap->Width = this->ClientWidth; Image1->Picture->Bitmap->Height = this->ClientHeight; //將Image1的底色塗成跟Form一樣 Image1->Canvas->Brush->Color = this->Color; Image1->Canvas->FillRect (Image1->Canvas->ClipRect); } void __fastcall TForm1::Button1Click(TObject *Sender) { Image1->Canvas->Font->Color = clRed; //字的顏色 Image1->Canvas->Font->Size = 20; //字的大小 Image1->Canvas->TextOutA(10,10,"This is a test!"); }
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-02 18:33:43 IP:211.75.xxx.xxx 未訂閱
OnPaint是回應WM_PAINT 至於WM_PAINT何時觸發ㄋ,就在視窗重繪時觸發 這樣說你懂嗎?問題出現在何時呼叫的問題啦
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-02 22:14:39 IP:203.73.xxx.xxx 未訂閱
感謝lu 先生/小姐 的回覆,你的方法很好。 但是我主要的意思是:既然BCB有很多視窗物件有提供Canvas這個子物件such as Form、ListView…etc.,那麼像 Form1->Canvas->TextOutA(10,10,"This is a test!"); 這種很直覺的撰寫方式在Form1上畫一個字串卻只能在FormPaint這個method內才能正常顯示,放在其它則不行正常繪出(雖然compile沒問題)。 我要問的是針對上述程式碼可否放在任何程式區段都能正常繪出字串,因為只在FormPaint內撰寫太過侷限了吧。
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-02 22:34:22 IP:203.73.xxx.xxx 未訂閱
感謝jcjroc 先生/小姐 的回覆,但是感覺好像還沒入到重點耶。 首先由你的回覆大概你也了解到可以用攔截Form的WM_PAINT訊息並在它的WndProc內加入: TextOut(GetDC(Handle),10,10,"This is a test!",15); 之類的繪圖程式碼,如此就能正常work,不管繪、重繪… 可是我真正想問的是,硬一點說,例如這樣寫在FormCreate內程式: void __fastcall TForm1::FormCreate(TObject *Sender) { Form1->Canvas->TextOutA(10,10,"This is a test!"); } 它是compile可過但無法繪出字串,能否讓其正常繪出但是就是要寫FormCreate內?
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-03 10:44:23 IP:211.75.xxx.xxx 未訂閱
WM_CREATE比WM_PAINT早處發耶! 所以是有劃,但後來WM_PAINT觸發後就被蓋掉啦! 你是社會人士喔!所以我不會告訴你如何解決你真正的需要. 建議你可以去買本書來KK,打好基礎 書名是"Windows程式設計" 那是一本翻譯書,由Microsoft出版,現在以經是第五版了.
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-05 09:09:36 IP:61.63.xxx.xxx 未訂閱
引言: 感謝jcjroc 先生/小姐 的回覆,好像只有你還在理我。 嗯,你這樣講很明顯的是說對BCB而言一個Form的FormCreate事件包封了原Window的WM_CREATE訊息,那麼硬要讓下例正常繪出, void __fastcall TForm1::FormCreate(TObject *Sender) { Form1->Canvas->TextOutA(10,10,"Iloveyou"); } 還是只能截攔WM_CREATE動手腳了,其它方法? 那麼問題又慢慢引入重點了: 為什麼 這樣不行 void __fastcall TForm1::FormActivate(TObject *Sender) { Form1->Canvas->TextOutA(10,10,"Iloveyou"); } 這樣行 void __fastcall TForm1::FormActivate(TObject *Sender) { SendMessage(Handle,WM_PAINT,0,0); <-----這行放在前面哦! Form1->Canvas->TextOutA(10,10,"Iloveyou"); } 請益,謝謝!
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-05 11:33:13 IP:211.75.xxx.xxx 未訂閱
唉!你已經是上班族了吧!是做堧體工程師嗎?如果是,那你慘啦! WM_ACTIVE只是讓一個有WinProc的視窗獲得控制權,其觸發時間大致分為一前一後 WM_ACTIVE...WM_PAINT....WM_ACTIVE 這樣你說ㄋ.該明白為何畫得出來了吧! 還是老話一句,去買書來研究一下Windows的機制吧
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-08 12:10:29 IP:211.72.xxx.xxx 未訂閱
引言: 感謝lu 先生/小姐 的回覆,你的方法很好。 但是我主要的意思是:既然BCB有很多視窗物件有提供Canvas這個子物件such as Form、ListView…etc.,那麼像 Form1->Canvas->TextOutA(10,10,"This is a test!"); 這種很直覺的撰寫方式在Form1上畫一個字串卻只能在FormPaint這個method內才能正常顯示,放在其它則不行正常繪出(雖然compile沒問題)。 我要問的是針對上述程式碼可否放在任何程式區段都能正常繪出字串,因為只在FormPaint內撰寫太過侷限了吧。
呵呵~~偶倒是想問你,為什麼要自己寫?用現成的元件不是粉好嗎? 要畫圖就用TIMAGE,要寫字就用TLABEL OR TEDIT等等,為什麼要自己寫? 鼻要跟偶說你想練功,練功不是這樣練的^^ 如果真的想練功,偶也建議你去找本書,先狠狠的K他個2、3遍再說吧.... 偶個人覺得,OPP最大的好處就是在於繼承等相關的機制 如果別人寫的元件,你不滿意,就繼承他,然後改寫不就好了.... 還有,鼻要跟偶說,你寫的會比別人好...基本上這是不可能的 就拿BCB來說好了,裡面隨便一個元件,隨時都有成千上萬的人在使用... 自己一個人,怎麼可能去那麼多人,來測試你的程式? 所以,偶個人覺得,能用別人寫的元件,就盡量用別人寫的元件,這樣才能提高生產力,才鼻用天天加班,又寫不出好程式..... 以上是偶個人小小的意見,參考看看... ^^
系統時間:2024-05-19 16:37:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!