关于拖动的问题!这句话(twincontrol(parent).perform(wm_syscommand,$f012,0);)怎么解释?(50分)

  • 主题发起人 主题发起人 Puff
  • 开始时间 开始时间
P

Puff

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一期CFAN上看到一篇关于不规则窗口的文章,为了在不显示标题时仍能拖动窗口,
作者写了这样的程序:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button=mbleft then
begin
releasecapture;
twincontrol(parent).perform(wm_syscommand,$f012,0);
end;
end;

可是我试了却没效果,哪为大侠解释一下!
 
试试将TWinControl(Parent).Perform(....)改成GetParentForm(Image1).Perform(...)
或者干脆Form1.Perform(.....)
 
实现这个功能没有必要这样做,截获 WM_NCHITTEST 更方便,也更好理解:
procedure WMNCHITTEST(var Msg: TMessage); message WM_NCHITTEST;
begin
if Msg.Result = htClient then Msg.Result := htCaption;
end;
把客户区的点击转化为标题区的点击。
 
TImage1不是从TWinControl继承下来的,当然不行,TLabel也是一样。
你可以这样做,把TImage放在一个Panel上,再这样:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button=mbleft then
begin
panel1.perform(wm_syscommand,$f012,0);
end;
end;
绝对可以。
 
同意CathyEagle.
 
我试了一下,Another_eYes的两种方法都可以。
用CATHYEAGLE大侠的方法可以拖动,可是IMAGE只能在PANEL的范围内,效果怪怪的。
另外,因为初学,希望能解释一下twincontrol(parent).perform(wm_syscommand,$f012,0);
,如调用它的作用,为什么TWINCONTROL要接PARENT参数,还有PERFORM几个参数的意义,
尤其是$f012。我看了联机帮助,可基础差,不懂!
可以加分!

另外,我觉得BAKUBAKU的思路非常好,可我试了一下却没效果,不知什么原因!
 
看delphi5 自带的Windows SDK help "WM_SYSCOMMAND "
A window receives this message when the user chooses a command from
the window menu (also known as the System menu or Control menu) or
when the user chooses the Maximize button or Minimize button.

$f012 是参数在windows.pas中定义(10进制),估计写错了值了。
估计 应该是CS_MOVE
 
BAKUBAKU的代码里加上Inherited语句后绝对可以,如下:
procedure TForm1.WMNCHitTest(var Msg: TMessage);
begin
inherited;
if (Msg.Result=HTClient) then
begin
Msg.Result:=HtCaption;
end;
end;
 
TO BALASCHEN:
谢谢你的提示!加上inherited;后果然可以,可奇怪的是,procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);这个过程还是不能去掉,否则就会出现异常,
不知何解?

TO 三代坦克:
你说的SDK我看过,关键是我非常想知道TWinControl(Parent)这种用法的意思:
TWinControl不是一个类名吗?不是一个具体的实例,还能调用PERFORM方法吗?此时
加上PARENT有什么用?
可能很幼稚,不过非常想知道答案!

 
多人接受答案了。
 
后退
顶部