如何在点住窗口内的图像拖动整个窗口?(50分)

  • 主题发起人 主题发起人 主持人
  • 开始时间 开始时间

主持人

Unregistered / Unconfirmed
GUEST, unregistred user!
; 前一段时间在一本杂志上看到把一个窗口变成指定的图像. 该
文提供了一个方法说可以实现按住图像而移动窗口: 在图像的OnMouseDown
事件中,
if button = mbleft then
begin
releasecapture
twincontrol(parent).perform(WM_SYSCOMMAND, $F012,0);
end
可是无法实现这个功能. 尽管我使用了一个记录鼠标位置的办
法实现了移动, 可是总想有没有一个简单的函数实现这个功能?
 
我记得应该在OnMouseMove中加入事件
不行再说
 
定义一消息处理函数:
procedure mymove(var AMsg: TMessage); message WM_NCHITTEST;

procedure TForm1.mymove(...);
begin
inherited;
if 鼠标点(AMsg.lparam, AMsg.wparam) in 图形区 then
if AMsg.Result=HTCLIENT then
AMsg.Result:=HTCAPTION;
end;
 
用你自己的"记录鼠标位置的办法"更好一些.
如果你是不规则窗口,那么用它的方法反而会
使你原来的矩形窗口的虚框原形毕露.别用它!
 
在MouseDown中这样试试。
if ssLeft in Shift then begin
ReleaseCapture;
Perform(WM_SYSCOMMAND,$F012,0);
end;
 
完全赞成o*o.
 
把分给了o*o吧
 
if Button <> mbRight then
begin
ReleaseCapture;
Form1.Perform(WM_SysCommand, $f017, 0);
end;

以上是点击任意控件来移动窗体.

private
procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited; { call the inherited message handler }
if M.Result = htClient then { is the click in the clientarea?}
M.Result := htCaption; { if so, make Windows think it's}
{ on the caption}
end;
end.
以上是点击窗体任意部分来移动窗体.
另外,Form1.Perform(WM_SysCommand, $f017, 0);
和O*O的Perform(WM_SYSCOMMAND,$F012,0);
中$F017与$F012的区别是什么?$F017是可以的,我试过,两者有区别吗?
 
$F012是一个未公开的参数,SC_DRAGMOVE
请问汤兄$F017有什么含义?
 
$F017是什么我不知道哇,但是可以用的.
这是经过历史考验的.(我用过,可行)
 
你真走运,伙计!刚好我前几天为此琢磨,彻底搞明白了。用以下方法,你可以针对
窗体上的任何控件拖动,就可以拖动Form。而且,你可以定义拖动的条件,例如是按下Ctrl还是按下Shift键才能开始拖动,或者选中一个CheckBox以后才能拖动。
说起来这么麻烦,其实关键的地方只有一个,请看:
下面的例子假设要拖动Image1,并且只有按下Ctrl键才会拖动。

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
const
SC_DRAGMOVE=$f012;//You Must add this line.
begin
if (ssCtrl in shift) then//Press Ctrl key
begin//drag move
ReleaseCapture;
TWinControl(Application.MainForm).Perform(WM_SYSCOMMAND,SC_DRAGMOVE,0);
end;//if ssCtrl in shift
end;
 
为什么要用OnMouseDown?不如用OnMouseMove:

procedure TForm1.OnMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if ssleft in shift then
begin
releasecapture;
form1.perform(WM_syscommand, $F012, 0);
end;
end;

这样绝对可以,我试过了,给分吧! :-)
 
多人接受答案了。
 
后退
顶部