由于需要我做了一个无标题的窗体,但又需要可以用鼠标拖动,窗体上有一个image
我是这样做的:(bMoveWindow,OldX,OldY都是全局变量)procedure Tmainform.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  iy,ix:boolean;
begin
  OldX := X;
  OldY := Y;
  bMoveWindow := true
end;procedure Tmainform.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  bMoveWindow := false;
end;procedure Tmainform.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var  nTop, nLeft, nHeight, nWidth: integer;begin
  if bMoveWindow = true then
  begin
    nTop := Top + (Y - OldY);
    nLeft := Left + (X - OldX);
    nHeight := Height;
    nWidth := Width;
    MoveWindow(mainform.Handle, nLeft, nTop, nWidth, nHeight, true);  end;end;现在的问题是,我按下鼠标左键窗体就会剧烈闪烁,鼠标拖动的效果很差,请指教!

解决方案 »

  1.   

    在窗体的private部分声明
    procedure wmnchittest(var msg:twmnchittest);
    然后写代码
    procedure TForm1.wmnchittest(var msg:twmnchittest);
    begin
    inherited;
    if (htclient=msg.result) then msg.result:=htcaption;
    end;
    搞定
      

  2.   

    to: DelphiBoy2003(我是李逍遥) 你说的一点用都没有!!有没有高手呀??
      

  3.   

    去掉你关于Image的Mouse相关的代码加入 DelphiBoy2003(我是李逍遥) 的代码然后在Image的MouseDown事件中加入
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      SetCapture(Handle);
    end;
      

  4.   

    应该在窗体的private部分声明
    procedure wmnchittest(var msg:twmnchittest);message wm_nchittest;
    然后写代码
    procedure TForm1.wmnchittest(var msg:twmnchittest);
    begin
    inherited;
    if (htclient=msg.result) then msg.result:=htcaption;
    end;
      

  5.   

    sorry刚才作了下测试,DelphiBoy2003(我是李逍遥) 的完全可用,不受Image的影响
    测试环境Delphi7+Windows 2000 Server (SP3)unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;type
      TForm1 = class(TForm)
        Image1: TImage;
      private
        { Private declarations }
        procedure wmnchittest(var msg:twmnchittest); message WM_NCHITTEST;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.wmnchittest(var msg:twmnchittest);
    begin
      inherited;
      if (htclient=msg.result) then msg.result:=htcaption;
    end;
    end.
      

  6.   

    哎……
     DelphiBoy2003(我是李逍遥) 的少了“message WM_NCHITTEST;”
    procedure wmnchittest(var msg:twmnchittest); message WM_NCHITTEST;当然不行!
      

  7.   

    这样可以移动了但却将窗体上所有组件的mousemove事件都屏蔽了,这如何解决??
    我需要在移动后仍可以激发mousemove事件
      

  8.   

    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ReleaseCapture;
      Perform(WM_SYSCOMMAND, $F012, 1);
    end;
      

  9.   

    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ReleaseCapture;
      SendMessage(Handle, WM_SYSCOMMAND, $F012, 0);
    end;在Image1的MouseDown中输入上述代码。
      

  10.   

    Sorry to jacky_shen(jacky)
    我的贴在前面耶:-)
      

  11.   

    是不是我的DELPHI启动得比你快十秒呀:-),不好意思哦,抢了镜头
      

  12.   

    加分喽!!需要说明的是,经测试procedure TForm1.wmnchittest(var msg:twmnchittest);
    begin
      inherited;
      if (htclient=msg.result) then msg.result:=htcaption;
    end;中的htclient需换成HTSIZE才能满足我得要求!!