我有一个无标题的窗口,可拖动,可任意调整大小,大家都知道任意拖动是procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(Handle, wm_SysCommand, $F012, 0); // 拖动窗体移动
end;下面是任意调整大小的代码,没有用那种改变风格的代码procedure TForm1.WMNchist(var Msg: TMessage);
const
cOffset = 10;
var
vPoint: TPoint;
MouseX, MouseY: integer;begin
inherited; //inherited就是调用祖先类的函数,如果不带参数就是默认调用同名函数
MouseX := LOWORD(Msg.LParam);//鼠标X
MouseY := HIWORD(Msg.LParam);//鼠标Y
vPoint := ScreenToClient(Point(MouseX, MouseY));//屏幕转客户坐标
if PtInRect(Rect(0, 0, cOffset, cOffset), vPoint) then
Msg.Result := HTTOPLEFT //在左上角
else if PtInRect(Rect(Width - cOffset, Height - cOffset, Width, Height), vPoint) then
Msg.Result := HTBOTTOMRIGHT //在边界右下脚
else if PtInRect(Rect(Width - cOffset, 0, Width, cOffset), vPoint) then
Msg.Result := HTTOPRIGHT//在右上角
else if PtInRect(Rect(0, Height - cOffset, cOffset, Height), vPoint) then
Msg.Result := HTBOTTOMLEFT // //在边界左下脚
else if PtInRect(Rect(cOffset, 0, Width - cOffset, cOffset), vPoint) then
Msg.Result := HTTOP //在上边界
else if PtInRect(Rect(0, cOffset, cOffset, Height - cOffset), vPoint) then
Msg.Result := HTLEFT//在左边界
else if PtInRect(Rect(Width - cOffset, cOffset, Width, Height - cOffset), vPoint) then
Msg.Result := HTRIGHT //在右边界
else if PtInRect(Rect(cOffset, Height - cOffset, Width - cOffset, Height), vPoint) then
Msg.Result := HTBOTTOM;//在一个窗口下面的水平边界上end;/////////////////////////////////////////////////////////////////////////////////////////////////////////////
{WM_NCHITTEST消息说明
该消息用来描述,当关标移动或当按下或当释放了鼠标按扭的时候,
就会发送一个WM_NCHITTEST消息给一个窗口若鼠标未被捕获,
则这条消息发送给光标所在的窗口。
否则,这条消息公布给捕获鼠标的窗口。参数
xPos = LOWORD(Lparam);//LParam低位字的值。
指出光标的X坐标。该坐标值是相对于屏幕左上角的坐标。 yPos = HIWORD(LParam);//LParam高位字的值。指出光标的y坐标。返回值 DefWindowProc函数的返回值是下列值之一,以指示光标热点的位置
:
HTBORDER 光标热点在一个窗口的边界上,该窗口不具有可变大小的边界
HBOTTOM 在一个窗口下面的水平边界上
HBOTTOMLEFT 在一个窗口的边界的左下角
HBOTTOMRIGHT 在边界右下脚
HTCAPTION 在标题栏中
HTCLIENT 在客户区
HTERROR 在屏幕北京或窗口之间的分界线上(与HTNOWHERE类似,
所不同的是DefWindowProc函数产生一个系统响铃以指示出错)
HTGROWBOX 在尺寸框中(与HTSIZE相同)
HTHSCROLL 在水平滚动栏
HTLEFT 在左边界
HTMENU 在菜单中
HTNOWHERE 在屏幕或窗口之间的分界线上
HTREDUCE 在一个最小化的按扭上
HTRIGHT 在窗口右边界
HTSIZE 在尺寸框中
HTSYSMENU 在一个System菜单或在一个子窗口的Close按扭中
HTTOP 在上边界
HTTOPLEFT 在左上角
HTTOPRIGHT 在右上角
HTTRANSPARENT 在当前被其他窗口覆盖的窗口中
HTVSCROLL 在垂直滚动栏中
HTZOOM 在最大化按扭上}
/////////////////////////////////////////////////////////////////////////////////////////////////////以上是在事先建好的窗口上一切正常的,我现在要求是要动态创建的窗口,有这两个功能,经过试验
动态窗口.FormMouseDown=Form1.FormMouseDown,就可以移动窗口了,那么问题来了:
WMNchist 这个事件是自定义事件,本身窗体自带的事件是不存的,那么上面代码中的方法自然不可用,现在抓瞎了,不知道如何让这个动态窗口去执行上面的这个消息拦截事件
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(Handle, wm_SysCommand, $F012, 0); // 拖动窗体移动
end;下面是任意调整大小的代码,没有用那种改变风格的代码procedure TForm1.WMNchist(var Msg: TMessage);
const
cOffset = 10;
var
vPoint: TPoint;
MouseX, MouseY: integer;begin
inherited; //inherited就是调用祖先类的函数,如果不带参数就是默认调用同名函数
MouseX := LOWORD(Msg.LParam);//鼠标X
MouseY := HIWORD(Msg.LParam);//鼠标Y
vPoint := ScreenToClient(Point(MouseX, MouseY));//屏幕转客户坐标
if PtInRect(Rect(0, 0, cOffset, cOffset), vPoint) then
Msg.Result := HTTOPLEFT //在左上角
else if PtInRect(Rect(Width - cOffset, Height - cOffset, Width, Height), vPoint) then
Msg.Result := HTBOTTOMRIGHT //在边界右下脚
else if PtInRect(Rect(Width - cOffset, 0, Width, cOffset), vPoint) then
Msg.Result := HTTOPRIGHT//在右上角
else if PtInRect(Rect(0, Height - cOffset, cOffset, Height), vPoint) then
Msg.Result := HTBOTTOMLEFT // //在边界左下脚
else if PtInRect(Rect(cOffset, 0, Width - cOffset, cOffset), vPoint) then
Msg.Result := HTTOP //在上边界
else if PtInRect(Rect(0, cOffset, cOffset, Height - cOffset), vPoint) then
Msg.Result := HTLEFT//在左边界
else if PtInRect(Rect(Width - cOffset, cOffset, Width, Height - cOffset), vPoint) then
Msg.Result := HTRIGHT //在右边界
else if PtInRect(Rect(cOffset, Height - cOffset, Width - cOffset, Height), vPoint) then
Msg.Result := HTBOTTOM;//在一个窗口下面的水平边界上end;/////////////////////////////////////////////////////////////////////////////////////////////////////////////
{WM_NCHITTEST消息说明
该消息用来描述,当关标移动或当按下或当释放了鼠标按扭的时候,
就会发送一个WM_NCHITTEST消息给一个窗口若鼠标未被捕获,
则这条消息发送给光标所在的窗口。
否则,这条消息公布给捕获鼠标的窗口。参数
xPos = LOWORD(Lparam);//LParam低位字的值。
指出光标的X坐标。该坐标值是相对于屏幕左上角的坐标。 yPos = HIWORD(LParam);//LParam高位字的值。指出光标的y坐标。返回值 DefWindowProc函数的返回值是下列值之一,以指示光标热点的位置
:
HTBORDER 光标热点在一个窗口的边界上,该窗口不具有可变大小的边界
HBOTTOM 在一个窗口下面的水平边界上
HBOTTOMLEFT 在一个窗口的边界的左下角
HBOTTOMRIGHT 在边界右下脚
HTCAPTION 在标题栏中
HTCLIENT 在客户区
HTERROR 在屏幕北京或窗口之间的分界线上(与HTNOWHERE类似,
所不同的是DefWindowProc函数产生一个系统响铃以指示出错)
HTGROWBOX 在尺寸框中(与HTSIZE相同)
HTHSCROLL 在水平滚动栏
HTLEFT 在左边界
HTMENU 在菜单中
HTNOWHERE 在屏幕或窗口之间的分界线上
HTREDUCE 在一个最小化的按扭上
HTRIGHT 在窗口右边界
HTSIZE 在尺寸框中
HTSYSMENU 在一个System菜单或在一个子窗口的Close按扭中
HTTOP 在上边界
HTTOPLEFT 在左上角
HTTOPRIGHT 在右上角
HTTRANSPARENT 在当前被其他窗口覆盖的窗口中
HTVSCROLL 在垂直滚动栏中
HTZOOM 在最大化按扭上}
/////////////////////////////////////////////////////////////////////////////////////////////////////以上是在事先建好的窗口上一切正常的,我现在要求是要动态创建的窗口,有这两个功能,经过试验
动态窗口.FormMouseDown=Form1.FormMouseDown,就可以移动窗口了,那么问题来了:
WMNchist 这个事件是自定义事件,本身窗体自带的事件是不存的,那么上面代码中的方法自然不可用,现在抓瞎了,不知道如何让这个动态窗口去执行上面的这个消息拦截事件
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货