請問如何使用GDI+ 秀圖時秀在指定的 panel上?? |
答題得分者是:sos_admin
|
ykh8569
一般會員 發表:7 回覆:10 積分:3 註冊:2005-08-30 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
|
ykh8569
一般會員 發表:7 回覆:10 積分:3 註冊:2005-08-30 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
ykh8569 大,不好意思,我都是寫資料庫程式,繪圖部份只用在一支報表程式上,都是用 Canvas 的老方法,GDI+ 是新功能,沒用過,無法提供範例。舊方法的話,就是用 TImage 有 Canvas,用 Canvas 的內建函式就能繪圖了。
GDI 不曉得能不能用在 TPrinter?不然,只能輸出到螢幕,不能印出來。 ===================引 用 ykh8569 文 章=================== 前輩方便寫一段你說的方法的範例給我參考嗎?感恩!! ===================引 用 cancer 文 章=================== Panel 是用來裝容器,不具有繪圖功能。GDI 沒用過,如果是一般 Delphi 繪圖功能,放一個TImage 在 Panel 上面,佔滿所有空間,在 TImage 上面繪圖,使用者看不出有甚麼差異。 |
mephise
高階會員 發表:4 回覆:149 積分:205 註冊:2004-02-09 發送簡訊給我 |
TPanel 有 Canvas 屬性, 所以當然是可以在上面繪圖的
不過因為 TPanel 的 Canvas 是 Portect 屬性, 所以不能直接使用, 因此你必須從 TCustomPanel 繼承來作圖 沒圖沒真相, 做法大約是這樣: 當滑鼠在畫面上點下時, Panel上會繪出滑鼠位置 [code delphi] unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Generics.Collections; type TMyPanel = class(TCustomPanel) // Paint 跟 Resize 要覆寫, 不然畫面被最大或最小畫以後, 你原來畫上去的東西會不見 procedure Paint; override; procedure Resize; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } procedure DrawPoint; end; var Form1: TForm1; MyPanel: TMyPanel; // 下面這個 TList 是用來記錄曾經點下的滑鼠位置, 以備用來重繪使用 MousePosition: TList implementation {$R *.dfm} procedure TMyPanel.Paint; begin inherited; Form1.DrawPoint; end; procedure TMyPanel.Resize; begin inherited; Form1.DrawPoint; end; procedure TMyPanel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.TextOut(X,Y,'(' IntToStr(X) ',' IntToStr(Y) ')'); MousePosition.Add(Point(X,Y)); end; procedure TForm1.DrawPoint; var i: Integer; begin for i := 0 to MousePosition.Count-1 do MyPanel.Canvas.TextOut(MousePosition[i].X,MousePosition[i].Y, '(' IntToStr(MousePosition[i].X) ',' IntToStr(MousePosition[i].Y) ')'); end; procedure TForm1.FormCreate(Sender: TObject); begin MousePosition := TList // 建立 Panel 的實體 MyPanel := TMyPanel.Create(Form1); // 把 Panel 的 Parent 設成 Form1, 這樣當程式關閉時會自動釋放 MyPanel.Parent := Form1; // 把 Panel 設成跟 Form1 一樣大 MyPanel.Align := alClient; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin // 要記得把 TList 釋放掉 MousePosition.Free; end; end. [/code]
------
Mephise Chen 前興德工程師 |
ykh8569
一般會員 發表:7 回覆:10 積分:3 註冊:2005-08-30 發送簡訊給我 |
前輩 感謝你的回答和範例.又讓我在 delphi K.top 學到一些技巧
mephise 前輩提供的是在panel上繪圖 可否提供在panel上 秀圖的範例? 另請問前輩 gdi是否有秀完圖後可利用滑鼠移動和放大縮小我們所秀的圖的功能? 還是需要我們自己控制? ===================引 用 mephise 文 章=================== TPanel 有 Canvas 屬性, 所以當然是可以在上面繪圖的 不過因為 TPanel 的 Canvas 是 Portect 屬性, 所以不能直接使用, 因此你必須從 TCustomPanel 繼承來作圖 沒圖沒真相, 做法大約是這樣: 當滑鼠在畫面上點下時, Panel上會繪出滑鼠位置 [code delphi] unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Generics.Collections; type TMyPanel = class(TCustomPanel) // Paint 跟 Resize 要覆寫, 不然畫面被最大或最小畫以後, 你原來畫上去的東西會不見 procedure Paint; override; procedure Resize; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } procedure DrawPoint; end; var Form1: TForm1; MyPanel: TMyPanel; // 下面這個 TList 是用來記錄曾經點下的滑鼠位置, 以備用來重繪使用 MousePosition: TList implementation {$R *.dfm} procedure TMyPanel.Paint; begin inherited; Form1.DrawPoint; end; procedure TMyPanel.Resize; begin inherited; Form1.DrawPoint; end; procedure TMyPanel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.TextOut(X,Y,'(' IntToStr(X) ',' IntToStr(Y) ')'); MousePosition.Add(Point(X,Y)); end; procedure TForm1.DrawPoint; var i: Integer; begin for i := 0 to MousePosition.Count-1 do MyPanel.Canvas.TextOut(MousePosition[i].X,MousePosition[i].Y, '(' IntToStr(MousePosition[i].X) ',' IntToStr(MousePosition[i].Y) ')'); end; procedure TForm1.FormCreate(Sender: TObject); begin MousePosition := TList // 建立 Panel 的實體 MyPanel := TMyPanel.Create(Form1); // 把 Panel 的 Parent 設成 Form1, 這樣當程式關閉時會自動釋放 MyPanel.Parent := Form1; // 把 Panel 設成跟 Form1 一樣大 MyPanel.Align := alClient; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin // 要記得把 TList 釋放掉 MousePosition.Free; end; end. [/code] |
mephise
高階會員 發表:4 回覆:149 積分:205 註冊:2004-02-09 發送簡訊給我 |
|
ykh8569
一般會員 發表:7 回覆:10 積分:3 註冊:2005-08-30 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
ykh8569
一般會員 發表:7 回覆:10 積分:3 註冊:2005-08-30 發送簡訊給我 |
大大 再問一下 那要把 .bmp 的圖秀在panel 上要如何寫?
另 我想用 GDI 這個 實現 秀 .BMP 圖檔 因為他放大縮小比較不會失真 可否有範例可以參考.. 抱歉 繪圖這方面比較不熟問得比較多 煩請見諒.. ===================引 用 sos_admin 文 章=================== 你可以直接用此方法在Panel上绘制! var DC: HDC; cvs: TCanvas; begin DC := GetWindowDC(Panel1.Handle); cvs := TCanvas.Create; try cvs.Handle := DC; cvs.Ellipse(10, 10, 100, 100); finally cvs.Handle := 0; cvs.Free; releaseDC(0, DC); end; end; |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
图片缩放肯定会失真的!
下面贴图,更多用法需要自己摸索! var DC: HDC; cvs: TCanvas; Bmp:TBitmap; begin DC := GetWindowDC(Panel1.Handle); cvs := TCanvas.Create; Bmp:=TBitmap.Create; try cvs.Handle := DC; Bmp.LoadFromFile('C:\WINDOWS\Zapotec.bmp'); cvs.Draw(10,10,Bmp); finally Bmp.Free; cvs.Handle := 0; cvs.Free; releaseDC(0, DC); end; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |