全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3722
推到 Plurk!
推到 Facebook!

請教StringGrid或dbgrid如何插入背景圖片呢

答題得分者是:hagar
poemkevin
初階會員


發表:26
回覆:77
積分:30
註冊:2002-10-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-04 10:17:58 IP:210.202.xxx.xxx 未訂閱
各位前輩, 請問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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-04 11:25:27 IP:202.39.xxx.xxx 未訂閱
參考這篇: 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-04 12:53:45 IP:210.202.xxx.xxx 未訂閱
感謝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-04 13:15:13 IP:202.39.xxx.xxx 未訂閱
1.設定 Form1.DoubleBuffered := True; 試訌 2.Image1 不要用 size 很大的圖檔 3.gif 要先轉為 Bitmap 才能使用, 轉換方式參考: http://delphi.ktop.com.tw/topic.php?topic_id=51462 5.要畫在整個 DBGrid 上的小弟再研究看看
poemkevin
初階會員


發表:26
回覆:77
積分:30
註冊:2002-10-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-04 17:41:29 IP:210.202.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-05 16:08:23 IP:202.39.xxx.xxx 未訂閱
TDBGrid.DoubleBuffered 也設為 True 的話, 閃爍情況會好一點.
poemkevin
初階會員


發表:26
回覆:77
積分:30
註冊:2002-10-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-06 00:58:04 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-29 13:13:10 IP:218.168.xxx.xxx 未訂閱
您好: 我已經找到一種可以使任何元件貼上背景的方法 請參考我發表的函示庫 【BCB】【發表】超炫!任何元件變成AlphaBlend半透明特效 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=81992 但目前沒有Delphi版的。
------
人生就像泡泡一樣,乘著風被吹著跑,等你發現時已經消失了。
就在快要消失的瞬間,希望能再飛高一點,
但是回神時總是慢了一步。
系統時間:2024-03-28 21:24:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!