我要求在一个已经显示在image里的图像(图像位于image的中央)上运用鼠标划定一个区域(可以是一个矩形),然后拖动这个区域,在这个图像上选择我所感兴趣的部分,再把最后确定的区域的四个顶点的坐标位置传送到一个过程里面
谢谢 那位大哥可以解答
谢谢 那位大哥可以解答
解决方案 »
- D7裝了CNPACK,原來的快捷鍵沒用了,怎麼恢復?
- 从Dll中加载菜单项的疑问
- DBComboBox+Table+DataSource出错问题》?
- 网络检测方法 向大家请教
- 有制作过“帮助”的朋友们,进来看看。一个关于制作帮助的简单,提示性问题!(轻松可拿份20)
- 增加记录-dbgrild,dbedit
- 如何将很多小数点只保留二位,比如:0.45667->0.45,不用copy,急,在线等
- 救命 fastreport 问题?在打印时出现 fastreport_unregisterde 为注册字样!!!!
- 询问: 参数传递 动态控件的onclick属性等
- 求助!这个错误什么意思?怎么处理?
- 如何编程使在桌面任意地方双击都在该地方弹出开始菜单?
- 关于在dll实现窗体重用问题
即你将一个区域选择后拖动到一个地方,空余出来的地方是白的。如果你在重新选择一个区域,再拖动,则原来被覆盖的地方同样是空白区域?如果这样的话就好一点。
不过还是不明白。好像你的拖动和参数是两个不相关的功能。实际上你使用Image是非常不现实的选择,因为Image本身集成了很多功能,你如果进行画图的时候会触发很多的东西,会造成屏幕的闪烁。
我使用Form的Canvas来做,首先将现实图片的功能写在下面:
首先声明一个全局变量:
bmp: TBitmapformOnCreate:
begin
bmp:=TBitmap.Create;
Bmp.LoadFromFile('');
BitBlt(Canvas.Handle,0,0,Width,Height,bmp.canvas.handle,0,0,srccopy); //具体范围和参数需要你自己设置,你自己看bitblt的帮助。
end;formOnPaint
begin
BitBlt(Canvas.Handle,0,0,Width,Height,bmp.canvas.handle,0,0,srccopy); //具体范
围和参数需要你自己设置,你自己看bitblt的帮助。
end;formOnDestroy
begin
bmp.Free;
end;
[email protected]
Panel1: TPanel;
chb_SelectRect: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure chb_SelectRectClick(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
selectRect: TRect;
bmp: TBitmap; //图片载入。全局变量,在formcreat和OnPaint的时候重新刷新。
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
bmp:=TBitmap.Create;
bmp.LoadFromFile('e:\1.bmp');
BitBlt(Canvas.handle,0,0,bmp.Width,bmp.Height,bmp.Canvas.Handle,0,0,SRCCopy);
end;procedure TForm1.FormPaint(Sender: TObject);
begin
BitBlt(Canvas.handle,0,0,bmp.Width,bmp.Height,bmp.Canvas.Handle,0,0,SRCCopy);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
bmp.Free;
end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if chb_SelectRect.Checked then
begin
SelectRect.Left:=x;
SelectRect.Top:=y;
SelectRect.Right:=x;
SelectRect.Bottom:=y;
end;
end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if SelectRect.Left<0 then exit;
if chb_SelectRect.Checked then
with Canvas do
begin
Pen.Mode:=pmNotXor;
MoveTo(SelectRect.Left,SelectRect.Top);
LineTo(SelectRect.Left,SelectRect.Bottom);
LineTo(SelectRect.Right,SelectRect.Bottom);
LineTo(SelectRect.Right,SelectRect.Top);
LineTo(SelectRect.Left,SelectRect.Top);
SelectRect.Right:=x;
SelectRect.Bottom:=y;
MoveTo(SelectRect.Left,SelectRect.Top);
LineTo(SelectRect.Left,SelectRect.Bottom);
LineTo(SelectRect.Right,SelectRect.Bottom);
LineTo(SelectRect.Right,SelectRect.Top);
LineTo(SelectRect.Left,SelectRect.Top);
end;
end;procedure TForm1.chb_SelectRectClick(Sender: TObject);
begin
SelectRect.Left:=-1;
end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Chb_SelectRect.Checked then
chb_SelectRect.Checked:=False;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Panel1: TPanel;
chb_SelectRect: TCheckBox;
chb_DrawRect: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure chb_SelectRectClick(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
selectRect: TRect;
bmp: TBitmap; //图片载入。全局变量,在formcreat和OnPaint的时候重新刷新。
RectBmp: TBitmap;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
bmp:=TBitmap.Create;
bmp.LoadFromFile('e:\1.bmp');
RectBmp:=TBitmap.Create;
BitBlt(Canvas.handle,0,0,bmp.Width,bmp.Height,bmp.Canvas.Handle,0,0,SRCCopy);
end;procedure TForm1.FormPaint(Sender: TObject);
begin
if not chb_DrawRect.Checked then
BitBlt(Canvas.handle,0,0,bmp.Width,bmp.Height,bmp.Canvas.Handle,0,0,SRCCopy);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
bmp.Free;
RectBmp.Free;
end;procedure TForm1.chb_SelectRectClick(Sender: TObject);
begin
if Chb_SelectRect.Checked then
SelectRect.Left:=-1;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if chb_SelectRect.Checked then
begin
SelectRect.Left:=x;
SelectRect.Top:=y;
SelectRect.Right:=x;
SelectRect.Bottom:=y;
end else
end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if chb_SelectRect.Checked then
begin
if SelectRect.Left<0 then exit;
with Canvas do
begin
Pen.Mode:=pmNotXor;
MoveTo(SelectRect.Left,SelectRect.Top);
LineTo(SelectRect.Left,SelectRect.Bottom);
LineTo(SelectRect.Right,SelectRect.Bottom);
LineTo(SelectRect.Right,SelectRect.Top);
LineTo(SelectRect.Left,SelectRect.Top);
SelectRect.Right:=x;
SelectRect.Bottom:=y;
MoveTo(SelectRect.Left,SelectRect.Top);
LineTo(SelectRect.Left,SelectRect.Bottom);
LineTo(SelectRect.Right,SelectRect.Bottom);
LineTo(SelectRect.Right,SelectRect.Top);
LineTo(SelectRect.Left,SelectRect.Top);
end;
end; if chb_DrawRect.Checked then
if [ssLeft]=Shift then
begin LockWindowUpdate(Canvas.handle); //锁定屏幕的刷新
try
//=======刷新背景===============
BitBlt(Canvas.Handle,0,0,Bmp.Width,Bmp.Height,Bmp.Canvas.Handle,0,0,SrcCopy);
//=======画新被拖动的图片========
BitBlt(Canvas.Handle,x,y,RectBmp.Width,RectBmp.Height,RectBmp.Canvas.Handle,0,0,SrcCopy);
finally
LockWindowUpdate(0); //解除屏幕刷新锁定
end;
end;
end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Chb_SelectRect.Checked then
chb_SelectRect.Checked:=False;
if Chb_DrawRect.Checked then
chb_DrawRect.Checked:=False; //========将选择的图片复制到rectBmp中
RectBmp.Width:=SelectRect.Right-SelectRect.Left;
RectBmp.Height:=SelectRect.Bottom-SelectRect.Top;
BitBlt(RectBmp.Canvas.Handle,0,0,RectBmp.Width,RectBmp.Height,Bmp.Canvas.Handle,SelectRect.Left,SelectRect.Top,SrcCopy);
end;end.
还有很多的小bug,不过基本的算法就是这样的,你自己改吧。
如果你一定要用Image,则只要在Image的Mouse事件中写东西就可以了,另外bitblt的参数中form.canvas要改成Image.Canvas就可以了