请问有简单方法重画canvas上的line吗? |
答題得分者是:jow
|
rainxie
一般會員 發表:20 回覆:27 積分:14 註冊:2008-03-13 發送簡訊給我 |
|
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
|
rainxie
一般會員 發表:20 回覆:27 積分:14 註冊:2008-03-13 發送簡訊給我 |
|
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
|
rainxie
一般會員 發表:20 回覆:27 積分:14 註冊:2008-03-13 發送簡訊給我 |
|
rainxie
一般會員 發表:20 回覆:27 積分:14 註冊:2008-03-13 發送簡訊給我 |
我把Timage设为透明,但只要一在上面画线,马上就有白色背景,不知道是不是还有哪里没想到?
以下是我的代码,谢谢您,帮我看看 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin image1.Canvas.LineTo(x,y); end; procedure TForm1.FormCreate(Sender: TObject); begin form1.DoubleBuffered:=true; end; end. |
rainxie
一般會員 發表:20 回覆:27 積分:14 註冊:2008-03-13 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
(1)改寫TForm1的Paint() 及Resize()
(2)新增ImageFileName屬性,作為背景圖檔名 以下程式碼, 提供你參考, 希望能解決你的問題... [code delphi] unit fMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FImageFileName: string; procedure SetImageFileName(const Value: string); procedure DrawBackgroundImage; procedure CustomDrawing; public procedure Paint; override; procedure Resize; override; property ImageFileName: string read FImageFileName write SetImageFileName; end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin AlphaBlend := True; AlphaBlendValue := 200; ImageFileName := 'D:\TEST.BMP'; end; procedure TForm1.Paint; begin inherited; DrawBackgroundImage; CustomDrawing; end; procedure TForm1.Resize; begin Invalidate; end; procedure TForm1.CustomDrawing; var r: TRect; I: Integer; begin Canvas.Pen.Color := clRed; Canvas.Pen.Width := 1; Canvas.Pen.Style := psSolid; Canvas.Pen.Mode := pmCopy; Canvas.Brush.Color := Color; Canvas.Brush.Style := bsSolid; r := ClientRect; for I := 1 to 30 do begin InflateRect(r,-3,-3); Canvas.Polyline([ Point(r.Left,r.Top), Point(r.Right,r.Top), Point(r.Right,r.Bottom), Point(r.Left,r.Bottom), Point(r.Left,r.Top)]); end; end; procedure TForm1.SetImageFileName(const Value: string); begin if Value <> FImageFileName then begin FImageFileName := Value; Invalidate; end; end; procedure TForm1.DrawBackgroundImage; var b: TBitmap; begin if not FileExists(FImageFileName) then begin Canvas.Brush.Color := Color; Canvas.Brush.Style := bsSolid; Canvas.FillRect(ClientRect); end else begin b := TBitmap.Create; try b.LoadFromFile(FImageFileName); Canvas.StretchDraw(ClientRect, b); finally FreeAndNil(b); end; end; end; end. [/code] |
rainxie
一般會員 發表:20 回覆:27 積分:14 註冊:2008-03-13 發送簡訊給我 |
非常谢谢您的回复,在onpaint时重画,我重画时会有下面这样一个问题:
我用的是GDI画抗锯齿线,如果在原来的线没有被擦除时重画,画出的线会被加粗。 是不是在画前要清除前面画的线? 谢谢您抽出宝贵时间来回答我的问题。 ===================引 用 jow 文 章=================== (1)改寫TForm1的Paint() 及Resize() (2)新增ImageFileName屬性,作為背景圖檔名 以下程式碼, 提供你參考, 希望能解決你的問題... [code delphi] unit fMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FImageFileName: string; procedure SetImageFileName(const Value: string); procedure DrawBackgroundImage; procedure CustomDrawing; public procedure Paint; override; procedure Resize; override; property ImageFileName: string read FImageFileName write SetImageFileName; end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin AlphaBlend := True; AlphaBlendValue := 200; ImageFileName := 'D:\TEST.BMP'; end; procedure TForm1.Paint; begin inherited; DrawBackgroundImage; CustomDrawing; end; procedure TForm1.Resize; begin Invalidate; end; procedure TForm1.CustomDrawing; var r: TRect; I: Integer; begin Canvas.Pen.Color := clRed; Canvas.Pen.Width := 1; Canvas.Pen.Style := psSolid; Canvas.Pen.Mode := pmCopy; Canvas.Brush.Color := Color; Canvas.Brush.Style := bsSolid; r := ClientRect; for I := 1 to 30 do begin InflateRect(r,-3,-3); Canvas.Polyline([ Point(r.Left,r.Top), Point(r.Right,r.Top), Point(r.Right,r.Bottom), Point(r.Left,r.Bottom), Point(r.Left,r.Top)]); end; end; procedure TForm1.SetImageFileName(const Value: string); begin if Value <> FImageFileName then begin FImageFileName := Value; Invalidate; end; end; procedure TForm1.DrawBackgroundImage; var b: TBitmap; begin if not FileExists(FImageFileName) then begin Canvas.Brush.Color := Color; Canvas.Brush.Style := bsSolid; Canvas.FillRect(ClientRect); end else begin b := TBitmap.Create; try b.LoadFromFile(FImageFileName); Canvas.StretchDraw(ClientRect, b); finally FreeAndNil(b); end; end; end; end. [/code] |
rainxie
一般會員 發表:20 回覆:27 積分:14 註冊:2008-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |