如何在任意程式區段撰寫繪圖的程式碼! |
尚未結案
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
請益(一個問題分三段述說):
(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 發送簡訊給我 |
好奇的問一下,一定要在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 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
感謝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 發送簡訊給我 |
感謝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 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 感謝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 發送簡訊給我 |
|
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
引言: 感謝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來說好了,裡面隨便一個元件,隨時都有成千上萬的人在使用... 自己一個人,怎麼可能去那麼多人,來測試你的程式? 所以,偶個人覺得,能用別人寫的元件,就盡量用別人寫的元件,這樣才能提高生產力,才鼻用天天加班,又寫不出好程式..... 以上是偶個人小小的意見,參考看看... ^^ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |