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

請問如何使用GDI+ 秀圖時秀在指定的 panel上??

答題得分者是:sos_admin
ykh8569
一般會員


發表:7
回覆:10
積分:3
註冊:2005-08-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-05-18 15:26:45 IP:114.41.xxx.xxx 訂閱
如標題 請問如何使用GDI 秀圖時秀在指定的 panel上??
我有參考範例
用這行秀圖
g.DrawImage(image, 10, 10,60,70);
但他只會秀在 form上
我想請問程式要如何寫才能秀在 panel上?
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-05-18 19:05:43 IP:220.128.xxx.xxx 未訂閱
Panel 是用來裝容器,不具有繪圖功能。GDI 沒用過,如果是一般 Delphi 繪圖功能,放一個 TImage 在 Panel 上面,佔滿所有空間,在 TImage 上面繪圖,使用者看不出有甚麼差異。
ykh8569
一般會員


發表:7
回覆:10
積分:3
註冊:2005-08-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-05-18 21:03:47 IP:114.41.xxx.xxx 訂閱
前輩方便寫一段你說的方法的範例給我參考嗎?感恩!!

===================引 用 cancer 文 章===================
Panel 是用來裝容器,不具有繪圖功能。GDI 沒用過,如果是一般 Delphi 繪圖功能,放一個TImage 在 Panel 上面,佔滿所有空間,在 TImage 上面繪圖,使用者看不出有甚麼差異。
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-05-19 08:58:31 IP:220.128.xxx.xxx 未訂閱
ykh8569 大,不好意思,我都是寫資料庫程式,繪圖部份只用在一支報表程式上,都是用 Canvas 的老方法,GDI+ 是新功能,沒用過,無法提供範例。舊方法的話,就是用 TImage 有 Canvas,用 Canvas 的內建函式就能繪圖了。
GDI 不曉得能不能用在 TPrinter?不然,只能輸出到螢幕,不能印出來。
===================引 用 ykh8569 文 章===================
前輩方便寫一段你說的方法的範例給我參考嗎?感恩!!

===================引 用 cancer 文 章===================
Panel 是用來裝容器,不具有繪圖功能。GDI 沒用過,如果是一般 Delphi 繪圖功能,放一個TImage 在 Panel 上面,佔滿所有空間,在 TImage 上面繪圖,使用者看不出有甚麼差異。
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-05-19 09:15:33 IP:220.137.xxx.xxx 訂閱
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.Create;
// 建立 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-05-19 11:40:46 IP:114.41.xxx.xxx 訂閱
前輩 感謝你的回答和範例.又讓我在 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.Create;
// 建立 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]

編輯記錄
ykh8569 重新編輯於 2011-05-18 21:41:37, 註解 無‧
ykh8569 重新編輯於 2011-05-18 21:42:27, 註解 無‧
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-05-19 16:04:54 IP:220.137.xxx.xxx 訂閱
秀圖那就更簡單了, 不過我要先請你告訴我你的 OS 跟 Delphi 版本
如果是 Win7 Delphi 2010 以上(含) 的版本, 我就示範 TDirect2DCanvas 的方式
如果是其他版本, 我就示範 TCanvas 的繪圖方式
------
Mephise Chen
前興德工程師
ykh8569
一般會員


發表:7
回覆:10
積分:3
註冊:2005-08-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-05-19 18:25:17 IP:114.41.xxx.xxx 訂閱
你好 我的 是XP D7 但要是使用GDI的 麻煩你了
===================引 用 mephise 文 章===================
秀圖那就更簡單了, 不過我要先請你告訴我你的 OS 跟 Delphi 版本
如果是 Win7 Delphi 2010 以上(含) 的版本, 我就示範 TDirect2DCanvas 的方式
如果是其他版本, 我就示範 TCanvas 的繪圖方式
編輯記錄
ykh8569 重新編輯於 2011-05-19 04:26:41, 註解 無‧
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-05-20 15:27:54 IP:121.229.xxx.xxx 訂閱
你可以直接用此方法在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;
ykh8569
一般會員


發表:7
回覆:10
積分:3
註冊:2005-08-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-05-20 15:49:05 IP:114.41.xxx.xxx 訂閱
大大 再問一下 那要把  .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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-05-20 17:21:49 IP:121.229.xxx.xxx 訂閱
图片缩放肯定会失真的!

下面贴图,更多用法需要自己摸索!

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;

系統時間:2024-03-29 21:15:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!