線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2455
推到 Plurk!
推到 Facebook!

请问有简单方法重画canvas上的line吗?

答題得分者是:jow
rainxie
一般會員


發表:20
回覆:27
積分:14
註冊:2008-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-13 20:27:13 IP:58.38.xxx.xxx 訂閱
请问各位高手,我如果在canvas上画了一条线,比如:
form1.Canvas.LineTo(x,y);
如何在该canvas被其他对象挡住后重画该line?(因为我发现当其他对象移走后该line不见了)
是不是在form1.onPaint时再执行form1.Canvas.LineTo(x,y)?还是有其他更好的办法?

我是初学者,不好意思,问这样简单的问题。

期待您的不吝赐教,谢谢!
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-14 07:54:57 IP:203.67.xxx.xxx 訂閱
不畫在 Form 上
改用 TImage 做背景
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
rainxie
一般會員


發表:20
回覆:27
積分:14
註冊:2008-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-14 09:10:05 IP:116.226.xxx.xxx 訂閱

===================引 用 AndrewK 文 章===================
不畫在 Form 上
改用 TImage 做背景

可是现在有个需求,一定要画在Canvas,不知道可以实现吗?
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-14 19:31:21 IP:203.67.xxx.xxx 訂閱
方便的話,描述你的
1.需求是什麼??
2.動機為何??
3.畫面參考??
這樣也許有幫助於提供其他解決方式
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
rainxie
一般會員


發表:20
回覆:27
積分:14
註冊:2008-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-14 19:57:15 IP:222.64.xxx.xxx 訂閱

===================引 用 AndrewK 文 章===================
方便的話,描述你的
1.需求是什麼??
2.動機為何??
3.畫面參考??
這樣也許有幫助於提供其他解決方式

谢谢您!主要我是想在透明的Form上画线,以对透明Form后的背景做标记(且背景可能是动态的)

Timage我试过,确实不会清除,但好像不透明
rainxie
一般會員


發表:20
回覆:27
積分:14
註冊:2008-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-14 20:07:18 IP:222.64.xxx.xxx 訂閱
我把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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-07-14 20:20:24 IP:222.64.xxx.xxx 訂閱
不能把背景放到Image里,因为背景是个WebBrowser控件,里面显示的是网页
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-07-14 23:48:13 IP:123.193.xxx.xxx 未訂閱
(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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-07-15 08:42:35 IP:116.226.xxx.xxx 訂閱
非常谢谢您的回复,在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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-07-15 09:39:43 IP:116.226.xxx.xxx 訂閱
算了,最后我在application.onActivate里重画一遍

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