看起来像操作系统的一个错误.在您的测试用例的条件下,命中测试处理错误,默认窗口过程返回HTTOP
时应返回HTBOTTOM
.您可以覆盖命中测试处理以获得变通方法:
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无关(我能够使用WINDOWS API创建一个简单的窗口重现问题).
我现在最终得到:
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;