Delphi 怎么重新创建非客户区
Delphi 如何重新创建非客户区
Delphi创建了一个窗体,样式为bsNone,也就是没有客户区,但是我想创建一些非客户区,使用以下代码,无效,请问如何解决。
procedure WMNCCalcSize(var Message:TWMNCCalcSize);message WM_NCCALCSIZE;
。。。。。。。。。。。。。。。
procedure TPopWin.WMNCCalcSize(var Message: TWMNCCalcSize);
var
lpncsp:PNCCalcSizeParams;
begin
if Message.CalcValidRects and (BorderStyle=bsNone) then
begin
lpncsp :=Message.CalcSize_Params;
if lpncsp=nil then exit;
lpncsp^.rgrc[0].Left := lpncsp^.rgrc[0].Left+20;
lpncsp^.rgrc[0].Top :=lpncsp^.rgrc[0].Top+20;
lpncsp^.rgrc[0].Right :=lpncsp^.rgrc[0].Right-20;
lpncsp^.rgrc[0].Bottom :=lpncsp^.rgrc[0].Bottom-20;
Move(lpncsp^.rgrc[0],lpncsp^.rgrc[1],sizeof(TRect));
//调试发现rdrc[0]和rdrc[1]一样,都是客户区,我要创建宽、高为20的非客户区
Message.Result :=DefWindowProc(Handle,WM_NCCALCSIZE,//无效
WPARAM(Message.CalcValidRects),LPARAM(Message.CalcSize_Params));
Message.Result :=WVR_VALIDRECTS;//无效
//使用CallWindowProc更惨,报"stack overlow"错误
// CallWindowProc(Pointer(GetWindowLong(Handle,GWL_WNDPROC)),Handle,WM_NCCALCSIZE,
// WPARAM(Message.CalcValidRects),LPARAM(Message.CalcSize_Params));
end
else
inherited;
end;
------解决方案--------------------
用你的代码稍微加改进,在D7,XE5(Win32,Win64)上都能成功呀
Delphi创建了一个窗体,样式为bsNone,也就是没有客户区,但是我想创建一些非客户区,使用以下代码,无效,请问如何解决。
procedure WMNCCalcSize(var Message:TWMNCCalcSize);message WM_NCCALCSIZE;
。。。。。。。。。。。。。。。
procedure TPopWin.WMNCCalcSize(var Message: TWMNCCalcSize);
var
lpncsp:PNCCalcSizeParams;
begin
if Message.CalcValidRects and (BorderStyle=bsNone) then
begin
lpncsp :=Message.CalcSize_Params;
if lpncsp=nil then exit;
lpncsp^.rgrc[0].Left := lpncsp^.rgrc[0].Left+20;
lpncsp^.rgrc[0].Top :=lpncsp^.rgrc[0].Top+20;
lpncsp^.rgrc[0].Right :=lpncsp^.rgrc[0].Right-20;
lpncsp^.rgrc[0].Bottom :=lpncsp^.rgrc[0].Bottom-20;
Move(lpncsp^.rgrc[0],lpncsp^.rgrc[1],sizeof(TRect));
//调试发现rdrc[0]和rdrc[1]一样,都是客户区,我要创建宽、高为20的非客户区
Message.Result :=DefWindowProc(Handle,WM_NCCALCSIZE,//无效
WPARAM(Message.CalcValidRects),LPARAM(Message.CalcSize_Params));
Message.Result :=WVR_VALIDRECTS;//无效
//使用CallWindowProc更惨,报"stack overlow"错误
// CallWindowProc(Pointer(GetWindowLong(Handle,GWL_WNDPROC)),Handle,WM_NCCALCSIZE,
// WPARAM(Message.CalcValidRects),LPARAM(Message.CalcSize_Params));
end
else
inherited;
end;
------解决方案--------------------
用你的代码稍微加改进,在D7,XE5(Win32,Win64)上都能成功呀
public
procedure WMNCCalcSize(var Message:TWMNCCalcSize);message WM_NCCALCSIZE;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMNCCalcSize(var Message: TWMNCCalcSize);
var
lpncsp:PNCCalcSizeParams;
begin
if Message.CalcValidRects and (BorderStyle=bsNone) then begin
lpncsp := Message.CalcSize_Params;
if lpncsp=nil then exit;
Inc(lpncsp^.rgrc[0].Left , 20);
Inc(lpncsp^.rgrc[0].Top , 20);
Dec(lpncsp^.rgrc[0].Right , 20);
Dec(lpncsp^.rgrc[0].Bottom , 20);
end;
inherited;
end;