永发信息网

DELPHI为什么我定义了LABEL的ONstartdrag事件LABLE还是拖不动呢

答案:2  悬赏:10  手机版
解决时间 2021-12-25 14:44
DELPHI为什么我定义了LABEL的ONstartdrag事件LABLE还是拖不动呢
最佳答案
楼主真是执着啊。这个问题一点都不难,不过要注意一点,如果每次拖动都要改变Label位置的话,Label的OnMouseMove事件会不断被触发,Label 就会像猴子一样在屏幕上跳来跳去。最好像Delphi一样,拖动的时候画个拖曳框,最后停止拖曳的时候再把Label的位置改变,这样效率较高。
代码如下:
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
procedure Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
FDrag: Boolean;
FDragDC: HDC;
FOrgPos: TPoint;
FPos: TPoint;
procedure DrawDragRect;
public
{ Public declarations }
end;
...
procedure TForm1.DrawDragRect;
var
dx, dy, x1, y1, x2, y2: Integer;
brOld: HBRUSH;
begin
dx := FPos.X - FOrgPos.X;
dy := FPos.Y - FOrgPos.Y;
x1 := Label1.Left + dx;
y1 := Label1.Top + dy;
x2 := x1 + Label1.Width;
y2 := y1 + Label1.Height;
brOld := SelectObject(FDragDC, GetStockObject(NULL_BRUSH));
Windows.Rectangle(FDragDC, x1, y1, x2, y2);
SelectObject(FDragDC, brOld);
end;

procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
GetCursorPos(FOrgPos);
Windows.ScreenToClient(Label1.Parent.Handle, FOrgPos);
FPos := FOrgPos;
FDragDC := GetDC(Label1.Parent.Handle);
SetROP2(FDragDC, R2_NOTXORPEN);
DrawDragRect;
FDrag := True;
end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FDrag then
begin
DrawDragRect;
GetCursorPos(FPos);
Windows.ScreenToClient(Label1.Parent.Handle, FPos);
DrawDragRect;
end;
end;

procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDrag := False;
DrawDragRect;
ReleaseDC(Label1.Parent.Handle, FDragDC);
Label1.Left := Label1.Left + FPos.X - FOrgPos.X;
Label1.Top := Label1.Top + FPos.Y - FOrgPos.Y;
end;
全部回答
我不会~~~但还是要微笑~~~:)
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
有哪部电视剧里面的插曲是唱东北松花江上的??
英雄联盟阿木木怎么卡住一大波兵线
联通异地卡能不能办过户?
新买的皮衣有很大的味道怎么办?
2011年国家公务员考试审查合理报考人数达到14
在路上跌倒了在人面前应该说什么化解尴尬
风铃草种下后,大概多久发芽?大神们帮帮忙
我的员工私自篡改我已经批准的请假条如何处理
我大家帮忙看一下你们说买液晶电视买TCL好还
死神271一护牛头虚化怎么回事?
下飞机后取行李要多久
在哲学课堂上,某班四位同学对“哲学是什么”
白碱滩区中通快递地址在哪,我要去那里办事,
梦见买摩托车
澳大利亚的宝宝面霜怎么样?
推荐资讯
卫生间一般多大合适
脂肪会分解成什么
手机怎么改百度云昵称
The girl arranged to have piano lessons at
点A在x轴下方,y轴右侧,距离x轴1个单位长度
肇源县环境保护局办公位置在哪啊?好找么?
可以苛求自己吗?
三生直销加盟费多少钱?怎么加入三生直销会员
射手座符号图片
你们股票多久没中签了,我一年没中了,分享一
微交易投资被骗钱了怎么办
数学思考:已知圆加正方形等于91,三角形加正
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?