项目需要 我现在有一个TImage控件放在一个TPanel上,TImage上面已经load一张图片进来 我现在要达到这样的效果,
在图片区域内点鼠标左键然后按住左键拖动 而且仅限向右下拖动有效,会出现一个空心的虚线矩形框 画这个矩形并不影响下边的图片 可以随意拖动 当松开鼠标左键 则矩形消失,图片和没有画矩形前一样。也就是说不能影响图片 画这个矩形只是临时的随画随擦。我现在画线是可以画 但一是擦不干净 二图片被破坏了 画过矩形的地方都成了白色 找了好久没有合适的解决方案 希望高手们帮忙 分不够我再加!因为是项目时间很紧,所以最好能有代码例子,谢谢大家!
在图片区域内点鼠标左键然后按住左键拖动 而且仅限向右下拖动有效,会出现一个空心的虚线矩形框 画这个矩形并不影响下边的图片 可以随意拖动 当松开鼠标左键 则矩形消失,图片和没有画矩形前一样。也就是说不能影响图片 画这个矩形只是临时的随画随擦。我现在画线是可以画 但一是擦不干净 二图片被破坏了 画过矩形的地方都成了白色 找了好久没有合适的解决方案 希望高手们帮忙 分不够我再加!因为是项目时间很紧,所以最好能有代码例子,谢谢大家!
源码见下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;type
TForm1 = class(TForm)
Image1: TImage;
Shape1: TShape;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
StartP: TPoint;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
StartP.X := X;
StartP.Y := Y;
end;
end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if (Shift = [ssLeft]) and (X > StartP.X) and (Y > StartP.Y) then
begin
Shape1.Left := StartP.X;
Shape1.Top := StartP.Y;
Shape1.Width := X - StartP.X;
Shape1.Height := Y - StartP.Y;
end
else
begin
Shape1.Width := 0;
Shape1.Height := 0;
end;
end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Shape1.Width := 0;
Shape1.Height := 0;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Shape1.Pen.Color := clYellow;
Shape1.Pen.Mode := pmMask; //一定要设为Mask
Shape1.Pen.Width := 2;
end;end.
如果想要截取获取的图形,只要算出TRect这个范围,然后调用BitBlt函数即可。
Y: Integer);
begin
if (Shift = [ssLeft]) and (X > StartP.X) and (Y > StartP.Y) then
begin
Shape1.Left := StartP.X;
Shape1.Top := StartP.Y;
Shape1.Width := X - StartP.X;
Shape1.Height := Y - StartP.Y;
end
else
begin
Shape1.Width := 0;
Shape1.Height := 0;
end;
end;
这行代码中的
Shape1.Left := StartP.X;
Shape1.Top := StartP.Y;
应该为:
Shape1.Left := StartP.X + Image1.Left; // 你的为Panel1.Left;
Shape1.Top := StartP.Y + Image.Top; //你的为Panel1.Top;
画矩形就用Img.Canvas.Rectangle就可以了。