大光标(100分)

  • 主题发起人 主题发起人 回顾
  • 开始时间 开始时间

回顾

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在一个大图片里的任意位置截取一个100*100的图片,
需要一个100*100的大光标框来表示选择,如何做?
 
可以单击鼠标左键,以该单击点为中心在canvas上画一个100*100的框。
 
首先在TImage的OnMouseDown里设置矩形框的起始坐标,
然后在OnMouseMove事件里,在Canvas上画框就行了,
不过要注意在画目前矩阵时,要先擦去上一次的。
所以要设置画笔的光栅模式为异或,还要保存每一次
矩形框的顶点坐标。
最后在OnMouseUp里可以得到目标矩形,用CopyRect就能
得到所要的图片部分。
下面是我从前一个程序里的代码。
procedure TForm1.TestCanvaMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
with TempImagedo
begin
Canvas.Pen.Style:=psSolid;
Canvas.Pen.Color:=CurrentColor;
Canvas.MoveTo(X,Y);
end;
if RectStyle.Checked then
begin
Canvas.Pen.Color:=CurrentColor;
Canvas.Pen.Style:=psDash;
TargetRect.Left:=X;
TargetRect.Top:=Y;
TempRect.Left:=X;
TempRect.Top:=Y;
TempRect.Right:=X;
TempRect.Bottom:=y;
end;

begin
Paint:=true;
end;

procedure TForm1.TestCanvaMouseMove(Sender: TObject;
Shift: TShiftState;
X,
Y: Integer);
begin
if not begin
Paint then
exit;
if LineStyle.Checked then
With TempImagedo
Canvas.LineTo(X,Y);
if RectStyle.Checked then
begin
With TempImagedo
begin
// 擦去前一次的窗口
Canvas.Pen.Mode:=pmNotXor;
//光栅模式为异或
Canvas.MoveTo(TempRect.Left,TempRect.Top);
Canvas.Lineto(TempRect.Right,TempRect.Top);
Canvas.LineTo(TempRect.Right,TempRect.Bottom);
Canvas.LineTo(TempRect.Left,TempRect.Bottom);
Canvas.LineTo(TempRect.Left,TempRect.Top);
//
TempRect.Right:=X;
TempRect.Bottom:=y;
Canvas.MoveTo(TempRect.Left,TempRect.Top);
Canvas.Lineto(TempRect.Right,TempRect.Top);
Canvas.LineTo(TempRect.Right,TempRect.Bottom);
Canvas.LineTo(TempRect.Left,TempRect.Bottom);
Canvas.LineTo(TempRect.Left,TempRect.Top);
end;
end;

TestCanva.OnPaint(self);
end;

procedure TForm1.TestCanvaMouseUp(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
if RectStyle.Checked then
begin
TargetRect.Right:=X;
TargetRect.Bottom:=Y;
with TempImagedo
begin
// Canvas.Pen.Mode:=pmNotXor;
//光栅模式为异或
Canvas.MoveTo(TempRect.Left,TempRect.Top);
Canvas.Lineto(TempRect.Right,TempRect.Top);
Canvas.LineTo(TempRect.Right,TempRect.Bottom);
Canvas.LineTo(TempRect.Left,TempRect.Bottom);
Canvas.LineTo(TempRect.Left,TempRect.Top);
Canvas.Brush.Color:=CurrentColor;
Canvas.FillRect(TargetRect);
Canvas.Pen.Mode:=pmCopy;
//恢复缺省光栅模式
end;
TestCanva.OnPaint(self);
end;
begin
Paint:=false;
end;
 
嘿嘿,我把问题看复杂了,用不着这么麻烦。同wolala
 
我用的是JPEG图片,画不上出啊?
 
image.canvas not form.canvas
 
有个出错信息为:
Can only modify an image if it contains a bitmap.
 
Canvas is only available if the Picture property represents a bitmap. Trying to read Canvas when Picture is another type of graphic image raises an EInvalidOperation exception.
 
有一个简单办法,用两个Image中间夹一个Bevel来解决。
底层的Image用来显示图片,Bevel表示光标框,
顶层透明的Image用来检测鼠标的动作,带动Bevel框移动。
 
接受答案了.
 
后退
顶部