請教StringGrid或dbgrid如何插入背景圖片呢 |
答題得分者是:hagar
|
poemkevin
初階會員 發表:26 回覆:77 積分:30 註冊:2002-10-19 發送簡訊給我 |
各位前輩, 請問StringGrid或dbgrid如何插入背景圖片呢
以下是小弟寫的, 但有很多問題, 圖片會把文字遮住呢,
而且圖片不能與stringgrid的視窗大小同,
若與資料同大小, 一旦資料量過大, 則會產生圖片變型失真??
不知版上的大大們, 是如何解決這問題的^^
還望不吝指導小弟一下, 謝謝!! procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.Cells[1,1]:='hello';
StringGrid1.Cells[1,2]:='my friend';
StringGrid1.Canvas.Draw(0,0,Image1.Picture.Graphic);
end; 發表人 - poemkevin 於 2004/11/04 10:24:56
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
參考這篇: http://groups.google.com/groups?hl=zh-TW&lr=&selm=3C893A4A.7080500%40artha.com.br&rnum=3
procedure TForm1.FormCreate(Sender: TObject); begin Image1.Picture.LoadFromFile('c:\xx.bmp'); end; procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var cv: TCanvas; bmp: TBitmap; x, y, dx, dy: Integer; begin cv := TDBGrid(Sender).Canvas; if not (gdFixed in State) then begin bmp := TBitmap.Create; try bmp.Width := ((Rect.Right - Rect.Left) div Image1.Width 2) * Image1.Width; bmp.Height := ((Rect.Bottom - Rect.Top) div Image1.Height 2) * Image1.Height; x := 0; while x < bmp.Width do begin y := 0; while y < bmp.Height do begin bmp.Canvas.CopyRect(Classes.Rect(x, y, x Image1.Width, y Image1.Height), Image1.Canvas, Classes.Rect(0, 0, Image1.Width, Image1.Height)); Inc(y, Image1.Height); end; Inc (x, Image1.Width); end; dx := Rect.Left mod Image1.Width; dy := Rect.Top mod Image1.Height; cv.CopyRect(Rect, bmp.Canvas, Classes.Rect(0 dx, 0 dy, Rect.Right - Rect.Left dx, Rect.Bottom - Rect.Top dy)); finally bmp.Free; end; end; cv.TextOut(Rect.Left 2, Rect.Top 2, Column.Field.DisplayText); end; |
poemkevin
初階會員 發表:26 回覆:77 積分:30 註冊:2002-10-19 發送簡訊給我 |
感謝hagar大大的指導,
只是有些疑問,
1. 這程式會導致,畫面會一直閃爍抖動.
2. 若資料量大時, 就會一直lang,若再移動資料位置時,還會出現如下圖一的錯誤喔
3. 程式只能使用bmp檔,小弟若用gif檔, 就會出錯.
4. 加了application.ProcessMessages, 也是沒有辦法解決問題.
5. 若要畫整個版面的
若用 DBGrid1.Canvas.Draw(0,0,Image1.Picture.Graphic);
讓圖片變成變淡的背景圖,
單一資料錄是可以用
//DBGrid1.Canvas.StretchDraw(Rect,Image1.Picture.Graphic);
若dggrid與stringgrid有transparent的功能就好了
只要直接勾選true就可以用了.
圖一:
發表人 - poemkevin 於 2004/11/04 13:07:56
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
poemkevin
初階會員 發表:26 回覆:77 積分:30 註冊:2002-10-19 發送簡訊給我 |
謝謝hagar大大的指導!!
小弟有測過, 是不會再出現那個錯誤視窗.
但若拖拉資料的速度快一點的話, dbgrid的資料會閃爍, 畫出的圖會有碎格及lang, 小弟想, 若每次都在資料上重畫圖片, 它會佔據很多cpu資源吧! 1.設定 Form1.DoubleBuffered := True; 這是增加它緩衡記憶體嗎?
2.Image1 不要用 size 很大的圖檔... 約用40kb, 但圖檔太小, run的時在dbgrid會出現一小塊一小塊的圖檔 如小弟所想的, 若dggrid與stringgrid有transparent的功能就好了
只要直接勾選true就可以用了.
或者dbgrid內, 增加一個picture背景圖引入功能, 想法1:
看能不能像網頁那樣的背景圖呈現方式,
每次都載入眼睛所見範圍的圖片及資料, 看執行速度會不會比較快一點.. ===========================
沉思, 再沉思! 學習, 再學習!
生活隨喜, 簡單自在^^
===========================
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
poemkevin
初階會員 發表:26 回覆:77 積分:30 註冊:2002-10-19 發送簡訊給我 |
hagar 大大, 小弟有試過您所說的方式
用mouse滾輪向下移動資料, 一旦移得稍微快一點
就會出現黑格喔!!
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:=true;
DBGrid1.DoubleBuffered:=True;
end; 這問題或許只能重新編寫dbgrid控件, 才能解決吧 起初小弟的想法, 是想是否能實現像網頁那樣的方式
顯示資料時, 也能類似浮水印一般淡淡的底圖 有個想法, 是否可以讓dbgrid重畫時,
除了顯示文字及線條外, 其他都變成透明的.
而image圖檔在其下層圖層顯現,
而不用將圖片引入dbgrid來重畫資料,
這樣或許會更好做一點.
但如何使之變透明, 小弟就不太曉得了.
delphi, 小弟也還在學習中.
真的很感謝hagar大大您的指導.
小弟這週末休假時再試著去努力看看. ===========================
沉思, 再沉思! 學習, 再學習!
生活隨喜, 簡單自在^^
===========================
|
enter2004
初階會員 發表:51 回覆:94 積分:34 註冊:2005-04-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |