无标题窗体拖动

通 过 响 应“wm_NCHitTest” 消 息 来 移 动 窗 体。
Windows 发 送“wM_NCHitTest” 消 息 来 确 定 鼠 标 操 作 是 否 发 生 在 窗 体
的 客 户 区, 或 边 框 的 特 殊 区 上( 非 客 户 区)。 
如 果Windows 发 现 用 户 单 击 了 窗 体 标 题, 系 统 将 移 动 窗 体,
单 击 了 窗 体 边 框, 则 系 统 将 开 始 改 变 窗 体 大 小。
例 程 如 下:
ExpandedBlockStart.gif 代码
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 ;

 

方 法 二:
通 过 为Application.OnMessage 创 建 一 个 处 理 程 序 获 得Windows 消 息,
可 以 调 整 应 用 程 序 对 不 同 消 息 的 响 应 或 为 不 能 正 常 识 别 的 
消 息 提 供 服 务。 这 里 受 到 窗 体 客 户 区 的 鼠 标 按 下 的 消 息 后, 
发 送 一 条 在 标 题 栏 内 按 下 的 消 息。
例 程 如 下:
ExpandedBlockStart.gif 代码
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 ;

 

方 法 三:
直 接 向 窗 体 发 送 一 条“wm_SysCommand” 消 息, 需 要 使 用 未 归 档 
的“sc_DragMove” 标 志, 定 义 如 下:
const
sc_DragMove:LongInt=$F012;
我 们 只 能 向TWinControl 派 生 组 件 发 送 该 消 息, 而 且 只 能 响 应 
鼠 标 按 下 事 件, 因 为 系 统 会 在 此 时 捕 获 鼠 标( 当 释 放 鼠 标 键 时,
拖 动 操 作 是 没 有 意 义 的)。
例 程 如 下:
ExpandedBlockStart.gif 代码
const
sc_DragMove:longint
= $F012;
implementation
{ $R *.DFM }
procedure  TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; XY: Integer);
begin
if  ssCtrl  in  Shift  then
// 判断“Ctrl”键是否按下
Begin

ReleaseCapture;

// 释放鼠标事件的对象

(Sender 
as  TWinControl).PerForm(wm_SysCommand
sc_DragMove
0 );
// 发送消息
end ;
end ;

 

这 种 方 法 适 用 与 窗 体 与 组 件, 如 想 移 动 组 件, 
将 其“OnMouseDown” 事 件 写 成 与Form 的“OnMouseDown” 事 件 一 样 即 可。
如 只 想 移 动 窗 体 可 按 以 下 方 法 编 写 代 码:
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;
运 行 结 果:
按 下“Ctrl” 键 拖 动 鼠 标 即 可 移 动 窗 体。
要 实 现 无 标 题 窗 体 的 移 动 有 很 多 种 方 法,
还 可 以 通 过 检 测 鼠 标 的 位 置( 坐 标) 来 确 定Form 的“left”
与“top” 值 等 方 法, 在 此 不 再 详 细 举 例.
========================
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if ssleft in shift then
     releasecapture;
perform(WM_SYSCOMMAND,$F012,0);
end; 

转载于:https://www.cnblogs.com/rogee/archive/2010/09/20/1832063.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是两种C#实现无标题窗体的方法: 1.使用Win32 API函数实现无标题窗体 ```csharp using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace NoTitleBarForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.FormBorderStyle = FormBorderStyle.None; // 去掉边框 } // 使用Win32 API函数实现拖动窗体 [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); private const int WM_SYSCOMMAND = 0x0112; private const int SC_MOVE = 0xF010; private const int HTCAPTION = 0x0002; private void Form1_MouseDown(object sender, MouseEventArgs e) { ReleaseCapture(); SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); } } } ``` 2.使用自定义控件实现无标题窗体 ```csharp using System; using System.Windows.Forms; namespace NoTitleBarForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Controls.Add(new NoTitleBarControl()); // 添加自定义控件 } } // 自定义控件 public class NoTitleBarControl : Control { public NoTitleBarControl() { this.Dock = DockStyle.Fill; this.MouseDown += new MouseEventHandler(NoTitleBarControl_MouseDown); } // 实现拖动窗体 private void NoTitleBarControl_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { ReleaseCapture(); SendMessage(this.FindForm().Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); } } [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); private const int WM_NCLBUTTONDOWN = 0xA1; private const int HT_CAPTION = 0x2; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值