怎么在一个程序中显示两个(鼠标)光标 现在的程序界面上有两个TImage,分别显示原图和放大图,真实的鼠标位置在放大图上,现在在原图上需要有个类似于光标的东西来指示鼠标当前位置。该怎么实现啊,有谁有想法吗?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 去年下半年没上CSDN今年春天重新回来回了N多贴但有大量贴子楼主失踪问题得到解决不结贴而去直接打击了本人的回贴欲不知本贴楼主肯结贴不?如肯,给你代码但要声明:不是画鼠标光标(因为那是个ICON,画上就擦不掉了),而是用十字模拟了一个光标 得,楼主今晚不在,我也别那么小气了请到这里看效果:http://hi.baidu.com/382943850/blog/item/2fb06708eb4d19d463d986ee.html代码写得不好,请别笑话因为百度空间破坏了代码的格式,再贴到这里:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;type TForm1 = class(TForm) Image1: TImage; {缩略图} Image2: TImage; {原始尺寸图} Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Image2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } R : TRect; CanSelect : boolean; xOld, yOld: integer; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);begin with Self.Image1 do begin Width := 100; Height:= 100; Stretch := True; end; Self.Image2.AutoSize:= True;end;procedure TForm1.Button1Click(Sender: TObject);begin Self.Image2.Picture.LoadFromFile('c:\test.bmp'); Self.Image2.Canvas.Pen.Mode := pmNot; Self.Image2.Canvas.Brush.Style := bsCross;{只是演示一种效果,另可用bsClear等} R := Rect(0, 0, 0, 0); with Self.Image1.Canvas do CopyRect(ClipRect, Image2.Canvas, Image2.Canvas.ClipRect);end;procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);begin with Image2.Canvas do begin if (xOld<>0) and (yOld<>0) then begin {此处这个判断有点点问题,但无关紧要} MoveTo(xOld-10, yOld); LineTo(xOld+10, yOld); MoveTo(xOld, yOld-10); LineTo(xOld, yOld+10); end; MoveTo(X-10, Y); LineTo(X+10, Y); MoveTo(X, Y-10); LineTo(X, Y+10); xOld := X; yOld := Y; end; if CanSelect then begin Image2.Canvas.Rectangle(R); R.Right := X; R.Bottom := Y; Image2.Canvas.Rectangle(R); end; with Self.Image1.Canvas do CopyRect(ClipRect, Image2.Canvas, Image2.Canvas.ClipRect);end;procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin if Button = mbLeft then begin CanSelect := True; if (R.Left<>R.Right) and (R.Top<>R.Bottom) then Image2.Canvas.Rectangle(R); R.Left := X; R.Top := Y; R.Right := X; R.Bottom := Y; end;end;procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin CanSelect := False;end;end. 谢谢linhuasoft,当然结了,即使没有合适的答案也会结的刚上线,先研究下你的程序,呵呵。不懂的再问 恩,跟需要的不太一样。那个画方框的思路还挺挺像的,可以先在原图上画标志,在放大到放大图之前在原位置重画标志,这样原图上的标志就不会显示到放大图上。刚试了一下Image1.Picture.bitmap.canvas 和Image1.canvas,以为这两个的内容是不一样的。不然可以在Image1.Canvas上画标志,放大时将Image1.Picture.bitmap.canvas的内容StrechBlt,呵呵失败。 现在是将原图内容StrechBlt到放大图,但不能将原图中用来指示位置的标志也放大出来,放大图的光标是另外定的。如果原图指示位置能用光标形式就最好啦,不然上面这种重画也可以试一下,先给些分,继续等 我每贴都结的,上次谢谢你回答我的问题。我问那个问题就是为了写一个百度css的查看器 to 楼主: 这段程序,是看到你的问题之后写的,并非以前写的。但是我误解了你的意思:你的意思是原图+放大图;而我看走眼了,成了原图+缩略图。不过道理是一样的。稍稍改一下代码就成。你自己就能办到。 另外,关于你在7楼说的前半部分,我读了几遍,猜测了一下你的意思:还是想画Cursor是吗?的确可以的。Cursor是一个TIcon对象,可以获得它的尺寸,然后只要拷贝相应大小的一块图暂时保存起来,Cursor移动之后,再重新画上。但我不打算给你改写代码了。你可以等别人给你改。我认为十字光标好用。^_^ 7楼下半部分,要表达的意思是:用Bitmap.Canvas画,与Image.Canvas画,效果不一样,是吗?首先声明,我为了节省代码,没有用一个幕后的TBitmap对象。两个的Canvas都是一样的,假设图片有尺寸的变形,就不太一样了。但是,只要把工作全部放在TBitmap里做,包括长宽调整等,就没问题了。to 楼上三位兄弟:谢谢你们。 用TreeView做的资源管理如何打开新窗口? cxgrid 列计算 把summersky应得的分还给她-_-# 欢迎加入QQ群、散分 delphi开发三层有这样的问题,怎么解 如何抑制内存的增长?--在线等待(如能解决,另送100大洋) 请列出几款比较好的票据打印机 delphi怎么通过注册表键值方式连接数据库 Delphi奇怪的现象!!!(50) 请问如何取得自定义Key-HOOK的高优先级(在系统级屏蔽按键) 小弟有個問題請教,cxgrid高手請進 如何實現同一個單位,不審覈,審覈以及多級審覈並存呢?
今年春天重新回来
回了N多贴
但有大量贴子楼主失踪
问题得到解决不结贴而去
直接打击了本人的回贴欲不知本贴楼主肯结贴不?
如肯,给你代码
但要声明:不是画鼠标光标(因为那是个ICON,画上就擦不掉了),而是用十字模拟了一个光标
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
Image1: TImage; {缩略图}
Image2: TImage; {原始尺寸图}
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
R : TRect;
CanSelect : boolean;
xOld, yOld: integer;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
with Self.Image1 do begin
Width := 100;
Height:= 100;
Stretch := True;
end;
Self.Image2.AutoSize:= True;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Self.Image2.Picture.LoadFromFile('c:\test.bmp');
Self.Image2.Canvas.Pen.Mode := pmNot;
Self.Image2.Canvas.Brush.Style := bsCross;{只是演示一种效果,另可用bsClear等}
R := Rect(0, 0, 0, 0);
with Self.Image1.Canvas do
CopyRect(ClipRect, Image2.Canvas, Image2.Canvas.ClipRect);
end;procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
with Image2.Canvas do begin
if (xOld<>0) and (yOld<>0) then begin {此处这个判断有点点问题,但无关紧要}
MoveTo(xOld-10, yOld);
LineTo(xOld+10, yOld);
MoveTo(xOld, yOld-10);
LineTo(xOld, yOld+10);
end;
MoveTo(X-10, Y);
LineTo(X+10, Y);
MoveTo(X, Y-10);
LineTo(X, Y+10);
xOld := X;
yOld := Y;
end;
if CanSelect then begin
Image2.Canvas.Rectangle(R);
R.Right := X;
R.Bottom := Y;
Image2.Canvas.Rectangle(R);
end;
with Self.Image1.Canvas do
CopyRect(ClipRect, Image2.Canvas, Image2.Canvas.ClipRect);
end;procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then begin
CanSelect := True;
if (R.Left<>R.Right) and (R.Top<>R.Bottom) then
Image2.Canvas.Rectangle(R);
R.Left := X;
R.Top := Y;
R.Right := X;
R.Bottom := Y;
end;
end;procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
CanSelect := False;
end;end.
刚上线,先研究下你的程序,呵呵。不懂的再问
刚试了一下Image1.Picture.bitmap.canvas 和Image1.canvas,以为这两个的内容是不一样的。不然可以在Image1.Canvas上画标志,放大时将Image1.Picture.bitmap.canvas的内容StrechBlt,呵呵失败。
我问那个问题就是为了写一个百度css的查看器
to 楼主:
这段程序,是看到你的问题之后写的,并非以前写的。但是我误解了你的意思:你的意思是原图+放大图;而我看走眼了,成了原图+缩略图。不过道理是一样的。稍稍改一下代码就成。你自己就能办到。
另外,关于你在7楼说的前半部分,我读了几遍,猜测了一下你的意思:还是想画Cursor是吗?的确可以的。Cursor是一个TIcon对象,可以获得它的尺寸,然后只要拷贝相应大小的一块图暂时保存起来,Cursor移动之后,再重新画上。但我不打算给你改写代码了。你可以等别人给你改。我认为十字光标好用。^_^
7楼下半部分,要表达的意思是:用Bitmap.Canvas画,与Image.Canvas画,效果不一样,是吗?首先声明,我为了节省代码,没有用一个幕后的TBitmap对象。两个的Canvas都是一样的,假设图片有尺寸的变形,就不太一样了。但是,只要把工作全部放在TBitmap里做,包括长宽调整等,就没问题了。to 楼上三位兄弟:谢谢你们。