关于窗口拖动的问题(20分)

  • 主题发起人 Yamazaki
  • 开始时间
Y

Yamazaki

Unregistered / Unconfirmed
GUEST, unregistred user!
Windows98的窗口在拖动时会显示出虚框,如何用Api类的函数解决这问题?<br>即拖动时窗口内容一起移动。
 
不是呀,你只要在win98的显示属性中选择'效果'页,<br>再点中'拖动窗口时显示其内容'就行啦.
 
我说的是只在自己的程序内实现,而无需更改显示属性内的选项.
 
你不用98吗?<br>是在做工具条吗?
 
我只是在做有关窗体移动的程序,烦请各位大师伸出援助之手!
 
截获窗口移动消息,自己写当鼠标按下并移动时的代码来移动窗口。<br>不过这样的效率会降低。
 
试试:<br>procedure TForm1.onMouseMove(Sender: TObject; Shift: TShiftState; X,<br>&nbsp; Y: Integer);<br>begin<br>&nbsp; if ssleft in shift then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; ReleaseCapture;<br>&nbsp; &nbsp; Perform(WM_SYSCOMMAND,$F012,0);<br>&nbsp; &nbsp; end;<br>end;
 
上面说的是,点住窗口任一部分拖动!
 
pyh_jerry的方法不行!<br>可以用纪录坐标的方法(对于不规则窗口同样适用)<br>比如要让用户点击label1来移动窗口:<br>...<br>&nbsp;procedure Label1MouseDown(Sender: TObject; Button: TMouseButton;<br>&nbsp; Shift: TShiftState; X, Y: Integer);<br>&nbsp;procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,<br>&nbsp; Y: Integer);<br>...<br>var<br>&nbsp;Form1: TForm1;<br>&nbsp;X1, Y1: Integer;<br>...<br>procedure TForm1.Label1MouseDown(Sender:TObject;Button:TMouseButton;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Shift: TShiftState; X, Y: Integer);<br>begin<br>&nbsp; X1 := X;<br>&nbsp; Y1 := Y;<br>end;<br><br>procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;X, Y: Integer);<br>begin<br>&nbsp; if HiWord(GetAsyncKeyState(VK_LBUTTON)) &gt; 0 then<br>&nbsp; begin<br>&nbsp; &nbsp;Form1.Left := Form1.Left + X - X1;<br>&nbsp; &nbsp;Form1.Top := Form1.Top + Y - Y1;<br>&nbsp; end;<br>end;<br>这样,无论怎样拖动,窗口和内容都是同时移动,不会显示虚框.
 
另一种思路:<br>在系统设置里能改的,肯定就会在注册表里有所表现,可以用注册表跟踪工具看看究竟改了什么地方,然后在程序中实现,这样应该会好得多吧?
 
无边界窗体的移动 <br> 在用Delphi制作Windows程序的窗体时,窗体的边界有四种选择:对话框式(bsDialog),单边固定式(bsSingle),双边可变式(bsSizeable),无边界式(bsNone)。当设置为bsNone时,窗体也就没有标题条,很显然,程序运行以后就无法移动窗体了。事实上,无边界窗体是很有用的,例如,象Word里面的浮动式工具箱其实就是无边界窗体,它可以大大节约屏幕空间。那么,如何用Delphi实现这个功能呢?显然,这需要修改Windows的内部消息,也就是说,需要把“MouseDownonForm”这个消息改为“MouseDownonCaption”,这其中有三个关键:捕捉MouseDown消息、判断光标位置、发送MouseDown消息。如果光标在窗体中,则发送MouseDownonCaption消息。<br>&nbsp; &nbsp; 在Delphi的对象巡检器中列出的所有事件是不能捕捉到Windows消息的,因为这些都是已经发出的消息,无法修改了。捕捉Win?dows消息有两种办法:一个就是增加一个消息处理句柄,直接处理Windows消息;另一个是对消息进行过滤,滤出所需消息。第二个办法比较常用,适用于各种情况,下面就是移动无边界窗体程序片断,加注释部分是手动加入的:<br><br>unit Unit1;<br>……<br>type<br>TForm1Κclass(TForm)<br>procedureFormCreate(Sender:TObject);<br>……<br>public<br>{申明消息过滤过程}<br>procedureAppMessage(varMsg:TMsg;varHandled:Boolean);<br>……<br>implementation<br>procedureTForm1.FormCreate(Sender:TObject);<br>begin<br>{捕捉消息:将程序的收到消息事件与消息过滤过程关联起来}<br>Application.OnMessage:=AppMessage;<br>end;<br>procedureTForm1.AppMessage(varMsg:TMsg;varHandled:Boolean);<br>begin<br>{如果鼠标左键按下的话}<br>if Msg.message=WM—LButtonDown then<br>begin<br>{判断光标是否在用户工作区内}<br>if DefWindowProc(Handle,WM—NCHitTest,0,GetMessagePos)=HTClient then<br>begin<br>{发出鼠标在用户标题栏内被按下的消息}<br>SendMessage(Handle,WM—NCLButtonDown,HTCaption,GetMessagePos);<br>Handled:=true;<br>{消息处理完毕,窗体不再接受MouseDown及Click事件,如果为false,程序的运行稍微有些不正常。}<br>end;<br>end;<br>end;<br>end.<br><br>&nbsp;<br>
 
接受答案了.
 
顶部