WM_NCHITTEST消息说明

当光标移动到窗体,或鼠标按下,释放时,发送WM_NCHITTEST消息,如何鼠标不被捕获,消息在窗体得到光标之后发出,否则,消息发送到捕获到鼠标的窗体。

WM_NCHITTEST xPos = LOWORD(lParam); // 光标的水平位置(X)yPos = HIWORD(lParam); //光标的垂直位置(Y)

Parameters(参数)

xPos

lParam的低次序数值(X的数值)。指定鼠标指针的X坐标,这个坐标是相对于屏幕左上部进行比效的。



yPos

lParam的高次序数值(Y的数值)。指定鼠标指针的Y坐标,这个坐标是相对于屏幕左上部进行比效的。



Return Values(返回值)

返回的值是由DefWindowProc函数所提供的下列数值之一,指出紧跟着光标的位置.

值 活动的位置

HTBORDER 在一个可以用鼠标自由调整大小的(有边框)的窗上边界时



HTBOTTOM 在一个可调窗体大小的下边界水平位置时(使用者可以点下鼠标垂直的调正大小)



HTBOTTOMLEFT 在一个可调窗体边界的左下角位置时(使用者可以点下鼠标对角的

调窗体大小,从左下向右上调)



HTBOTTOMRIGHT 在一个可调窗体边界的右下角位置时(使用者可以点鼠标对角的调

窗体大小,从右下向左上)



HTCAPTION 在一个标题栏中



HTCLIENT 在窗体客户区



HTCLOSE 在关闭按钮(窗体)



HTERROR 在屏幕的后面或在窗体之间的线上(相当于HTNOWHERE,除了

DefWindowProc函数产生的系统发出”嘟”的错误”)



HTGROWBOX 我的理解:在窗体里(相同于HTSIZE)(原文:In a size box (same as

HTSIZE))



HTHELP 在帮助按钮上



HTHSCROLL 在水平滚动条中



HTLEFT 在窗体的左边界上(使用者可以点击鼠标左右(水平)调窗

体的大小)



HTMENU 在一个菜单上



HTMAXBUTTON 在最大化按钮上



HTMINBUTTON 在最小化按钮上



HTNOWHERE 在屏幕的后面或在窗体之间的线上(我的理解:两个窗体,一个前,一个

后,点后面的窗体产生)



HTREDUCE 在一个最小化的按钮上(原文:In a Minimize button)



HTRIGHT 在窗体的右边界(使用者能点鼠标水平调正窗体大小)



HTSIZE 原文: In a size box (same as HTGROWBOX 同样的HTGROWBOX)



HTSYSMENU 在一个系统菜单上,或在一个child(子窗体)的一个关闭按钮上



HTTOP 在一个窗体上部的边界位置上



HTTOPLEFT 在一个窗体上部的边界的左上角



HTTOPRIGHT 在一个窗体上部的边界的右上角



HTTRANSPARENT 在同一程序的两个窗体,一个窗体被另一个窗体覆盖着(消息

会传递到下面的窗体,至到其中的一个窗体离开啦,否则就发送

HTTRANSPARENT消息)



HTVSCROLL 在垂直滚动条上



HTZOOM 在一个最大化按钮上(In a Maximize button)



Remarks(评论)

用一个MAKEPOINTS的宏将lParam转换成POINTS结构



支持信息

Windows NT/2000/XP: Included in Windows NT 3.1 and later.

Windows 95/98/Me: Included in Windows 95 and later.
 

 

使用 WM_NCHITTEST 消息判断鼠标所在窗口的部位

本例效果图:


WM_NCHITTEST 消息返回后, 消息的 Result 参数表示了鼠标所在窗口的部位.

窗体设计步骤: 新建工程后, 随便添加一个菜单; 设置窗体的 AutoScroll 属性为 True, 并添加一个 Panel 放在合适的位置, 以让窗口出现滚动条.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    MainMenu1: TMainMenu;
    mnuFile: TMenuItem;
  private
    procedure MyMsg(var msg: TWMNCHitTest); message WM_NCHITTEST;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  arr: array[-2..21] of string = (
    'HTERROR',
    'HTTRANSPARENT',
    'HTNOWHERE',
    'HTCLIENT - 客户区',
    'HTCAPTION - 标题',
    'HTSYSMENU - 系统菜单',
    'HTGROWBOX',
    'HTMENU - 菜单',
    'HTHSCROLL - 水平滚动条',
    'HTVSCROLL - 垂直滚动条',
    'HTMINBUTTON - 最小化按钮',
    'HTMAXBUTTON - 最大化按钮',
    'HTLEFT - 左边界',
    'HTRIG - 右边界',
    'HTTOP - 上边界',
    'HTTOPLEFT - 左上角',
    'HTTOPRIG - 右上角',
    'HTBOTTOM - 下边界',
    'HTBOTTOMLEFT - 左下角',
    'HTBOTTOMRIG - 右下角',
    'HTBORDER',
    'HTOBJECT',
    'HTCLOSE - 关闭按钮',
    'HTHELP');

procedure TForm1.MyMsg(var msg: TWMNCHitTest);
var
  i: Integer;
begin
  Inherited;
  i := msg.Result;
  Text := Format('%d: %s', [i, arr[i]]);
end;

end.

         

//另附 WM_NCHITTEST 消息中 Result 参数的所有可能值的列表:
HTERROR       = -2;
HTTRANSPARENT = -1;
HTNOWHERE     = 0;
HTCLIENT      = 1;
HTCAPTION     = 2;
HTSYSMENU     = 3;
HTGROWBOX     = 4;
HTSIZE        = HTGROWBOX;
HTMENU        = 5;
HTHSCROLL     = 6;
HTVSCROLL     = 7;
HTMINBUTTON   = 8;
HTMAXBUTTON   = 9;
HTLEFT        = 10;
HTRIGHT       = 11;
HTTOP         = 12;
HTTOPLEFT     = 13;
HTTOPRIGHT    = 14;
HTBOTTOM      = 15;
HTBOTTOMLEFT  = $10;
HTBOTTOMRIGHT = 17;
HTBORDER      = 18;
HTREDUCE      = HTMINBUTTON;
HTZOOM        = HTMAXBUTTON;
HTSIZEFIRST   = HTLEFT;
HTSIZELAST    = HTBOTTOMRIGHT;
HTOBJECT      = 19;
HTCLOSE       = 20;
HTHELP        = 21;

 

你可能感兴趣的:(windows,String,Class,Parameters,button,Forms)