Delphi 高度非常小的窗的WM_尺寸中的错误侧信息 我创建了一个无标题窗口 我手动(或编程)调整它的大小,使其高度小于等于30像素 然后,当我抓住底部边框以垂直调整其大小时,它的行为如下 如果我拖动上边框。实际上,在调试程序时,WM_size参数包含WMSZ_TOP而不是WMSZ_BOTTOM
我的程序是用Delphi编写的,基本上问题可以通过以下FormCreate的主窗体重现:Delphi 高度非常小的窗的WM_尺寸中的错误侧信息 我创建了一个无标题窗口 我手动(或编程)调整它的大小,使其高度小于等于30像素 然后,当我抓住底部边框以垂直调整其大小时,它的行为如下 如果我拖动上边框。实际上,在调试程序时,WM_size参数包含WMSZ_TOP而不是WMSZ_BOTTOM,delphi,winapi,window,Delphi,Winapi,Window,我的程序是用Delphi编写的,基本上问题可以通过以下FormCreate的主窗体重现: procedure TForm2.FormCreate(Sender: TObject); var oldStyle : LongInt; var newStyle : LongInt; begin // Adapt windows style. oldStyle := WINDOWS.GetWindowLong ( handle,
procedure TForm2.FormCreate(Sender: TObject);
var oldStyle : LongInt;
var newStyle : LongInt;
begin
// Adapt windows style.
oldStyle := WINDOWS.GetWindowLong (
handle,
GWL_STYLE);
newStyle := oldStyle and
(not WS_CAPTION) and
(not WS_MAXIMIZEBOX);
WINDOWS.SetWindowLong(
handle,
GWL_STYLE,
newStyle);
// SetWindowPos with SWP_FRAMECHANGED needs to be called at that point
// in order for the style change to be taken immediately into account.
WINDOWS.SetWindowPos(
handle,
0,
0,
0,
0,
0,
SWP_NOZORDER or
SWP_NOMOVE or
SWP_NOSIZE or
SWP_FRAMECHANGED or
SWP_NOACTIVATE);
end;
在我看来,操作系统是个bug。在测试用例的条件下,命中测试处理是错误的,默认窗口过程在应该返回
HTBOTTOM
时返回HTTOP
。您可以为解决方案覆盖命中测试处理:
procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
inherited;
if (Message.Result = HTTOP) and
(Message.Pos.Y > Top + Height - GetSystemMetrics(SM_CYSIZEFRAME)) then
Message.Result := HTBOTTOM;
end;
干得好,谢谢。我确认这是一个操作系统错误,与delphi无关(我能够通过使用WindowsAPI创建的一个简单窗口重现该问题) 我现在的结局是:
procedure TForm2.WMNcHitTest(
var msg : TWMNCHitTest);
begin
inherited;
case msg.result of
HTTOP:
begin
if msg.pos.y > top + height div 2 then
msg.result := HTBOTTOM;
end;
HTTOPRIGHT:
begin
if msg.pos.y > top + height div 2 then
msg.result := HTBOTTOMRIGHT;
end;
HTTOPLEFT:
begin
if msg.pos.y > top + height div 2 then
msg.result := HTBOTTOMLEFT;
end;
end;
end;
请注意,最好通过
CreateParams
设置窗口样式。您好,欢迎您的建议。但是,出于某种原因,如果我按如下方式使用CreateParams,我的表单会出现一个标题:继承的CreateParams(params);使用参数do style:=样式和(非WS_标题)和(非WS_最大化盒子)@艾曼纽-不客气。我还没有测试过,但如果您需要对左右和/或角尺寸使用类似的覆盖,我不会感到惊讶。你可能需要扩展它,但你明白了。