⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 无 标 题 窗 口 的 移 动move.htm

📁 对于学习很有帮助
💻 HTM
字号:
<html>

<head>
<link REL="stylesheet" HREF="/style.css" TYPE="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>计算机世界日报:
无标题窗口的移动
</title>
<!--***********-->
</head>

<body bgcolor="#FFFFFF" >














<p><br>
<font color="#b904e8"><b><em><a href="class.htm">返回</a></em></b></font>
<center>
<font color="#0000c0"><h2>
无 标 题 窗 口 的 移 动
</h2></font>
<h3>
天 津 纺 织 工 学 院104#
<br><a href="mailto:lsj78@telekbird.com.cn">姚 佩 云</a>
</h3>
</center>
<p><font color="#ffffff">----</font>

   在Delphi 编 程 中 有 时 要 对 无 标 题 窗 体 进 行 移 动, 以 下 就 结 合 本 人 的 经 验 介 绍 几 种 对 无 标 题 窗 体 移 动 的 方 法。
<p><font color="#ffffff">----</font>
<b> 方 法 一:</b>
<p><font color="#ffffff">----</font>
    通 过 响 应“wm_NCHitTest” 消 息 来 移 动 窗 体。Windows 发 送“wM_NCHitTest” 消 息 来 确 定 鼠 标 操 作 是 否 发 生 在 窗 体 的 客 户 区, 或 边 框 的 特 殊 区 上( 非 客 户 区)
。 如 果Windows 发 现 用 户 单 击 了 窗 体 标 题, 系 统 将 移 动 窗 体, 单 击 了 窗 体 边 框,
 则 系 统 将 开 始 改 变 窗 体 大 小。
<p><font color="#ffffff">----</font>
 例 程 如 下:
<pre>
  .
  .
  private
{ Private declarations }
Procedure MoveForm(var M:TWMNCHITTEST);
Message WM_NCHITTEST;
    //声明一自定义事件,拦截“WM_NCHITTEST”消息
  public
  .
  .
{$R *.DFM}

Procedure TForm1.MoveForm (var M:TWMNCHITTEST);
begin
  inHerited;//继承,窗体可以继续处理以后的事件
  if (M.Result=HTCLIENT) //如果发生在客户区
and ((GetKeyState(vk_CONTROL) < 0) 
 //检测“Ctrl”键是否按下
  then   M.Result:=HTCAPTION;
  //更改“.Result”域的值
end;
</pre>

<p><font color="#ffffff">----</font>
<b> 方 法 二:</b>
<p><font color="#ffffff">----</font>
    通 过 为Application.OnMessage 创 建 一 个 处 理 程 序 获 得Windows 消 息, 可 以 调
 整 应 用 程 序 对 不 同 消 息 的 响 应 或 为 不 能 正 常 识 别 的 消 息 提 供 服 务。 这 里 受 到 窗 体
 客 户 区 的 鼠 标 按 下 的 消 息 后, 发 送 一 条 在 标 题 栏 内 按 下 的 消 息。
<p><font color="#ffffff">----</font>
 例 程 如 下:
<pre>
.
  .
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure AppMessage(var Msg:TMsg;var Handled:Boolean);
  .
  .

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
    Application.OnMessage:=AppMessage;
   //捕捉消息:将程序的收到消息事件与消息过滤过程关联起来
end;

procedure TForm1.AppMessage(var Msg:TMsg;var Handled:Boolean);
begin
  if (Msg.message=WM_LButtonDown) and 
  //如果鼠标左键按下的话
(DefWindowProc(Handle,WM_NCHitTest,
0,GetMessagePos)=HTClient) and
      //判断光标是否在客户区内
((GetKeyState(vk_CONTROL) < 0) 
//检测“Ctrl”键是否按下
    then
      begin
        SendMessage(Handle,WM_NCLButtonDown,
           HTCaption,GetMessagePos);
         //发送鼠标在标题栏内按下的消息
        Handled:=true;
      end;
end;
</pre>
<p><font color="#ffffff">----</font>
<b>方 法 三:</b>
<p><font color="#ffffff">----</font>
    直 接 向 窗 体 发 送 一 条“wm_SysCommand” 消 息, 需 要 使 用 未 归 档 的“sc_DragMove” 标 志, 定 义 如 下:
<pre>
            const
              sc_DragMove:LongInt=$F012;
</pre>
<p><font color="#ffffff">----</font>
    我 们 只 能 向TWinControl 派 生 组 件 发 送 该 消 息, 而 且 只 能 响 应 鼠 标 按 下 事 件,
 因 为 系 统 会 在 此 时 捕 获 鼠 标( 当 释 放 鼠 标 键 时, 拖 动 操 作 是 没 有 意 义 的)。
<p><font color="#ffffff">----</font>
 例 程 如 下:
<pre>
  .
  . 
const
  sc_DragMove:longint=$F012;

implementation

{$R *.DFM}

procedure TForm1.FormMouseDown
(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssCtrl in Shift then
  //判断“Ctrl”键是否按下
  Begin
ReleaseCapture;
//释放鼠标事件的对象
    (Sender as TWinControl).PerForm(wm_SysCommand,
       sc_DragMove,0);
       //发送消息
  end;
end;
</pre>
<p><font color="#ffffff">----</font>
    这 种 方 法 适 用 与 窗 体 与 组 件, 如 想 移 动 组 件, 将 其“OnMouseDown” 事 件 写 成 与Form 的“OnMouseDown” 事 件 一 样 即 可。 如 只 想 移 动 窗 体 可 按 以 下 方 法 编 写 代 码:
<pre>
  .
  .
procedure TForm1.FormMouseDown
(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if SsCtrl in Shift then
  Begin
    ReleaseCapture;
    SendMessage(handle,wm_SysCommand,
      sc_DragMove,0);
  end;
end;
</pre>
<p><font color="#ffffff">----</font>
<b>运 行 结 果:</b>
<p><font color="#ffffff">----</font>
    按 下“Ctrl” 键 拖 动 鼠 标 即 可 移 动 窗 体。
<p><font color="#ffffff">----</font>
<b>总 结:<b>
<p><font color="#ffffff">----</font>
    要 实 现 无 标 题 窗 体 的 移 动 有 很 多 种 方 法, 还 可 以 通 过 检 测 鼠 标 的 位 置( 坐 标) 来 确 定Form 的“left” 与“top” 值 等 方 法, 在 此 不 再 详 细 举 例.
<p><font color="#ffffff">----</font>
    以 上 程 序 均 在Delphi 3.0 下 编 译 通 过。



 



<p align="right"><small><em>中国计算机世界出版服务公司版权所有</em></small> 
<br>
</p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -