首页 > 代码库 > 禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)

禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)

一般我们不想让窗体能够关闭, 首先想到的是在OnCloseQuery事件里设置CanClose := False, 不过在某些情况下这个会和程序关闭窗体的业务逻辑产生冲突

所以写了下面这个函数, 可以设置窗体上的部分控制按钮禁用和启用, 仅仅是按钮显示及对鼠标键盘的响应, 按钮功能方面不影响

 

type  TSetWinButtons = set of (swb_Close, swb_Minimize, swb_Maximize);  {设置窗体关闭按钮状态}procedure SetWindowButton(AButtons: TSetWinButtons; AEnabled: Boolean;  AWindowHandles: array of THandle);var  i: Integer;  nHasMenu, nHasWinLong: Boolean;  nMValue: UINT;  nWinLong: NativeInt;begin  if Length(AWindowHandles) = 0 then    Exit;  nHasMenu := swb_Close in AButtons;  nHasWinLong := (swb_Minimize in AButtons) or (swb_Maximize in AButtons);  if nHasMenu then  begin    if AEnabled then      nMValue := MF_BYCOMMAND or MF_ENABLED    else      nMValue := MF_BYCOMMAND or MF_DISABLED or MF_GRAYED;  end;  for i := Low(AWindowHandles) to High(AWindowHandles) do  begin    if nHasMenu then      EnableMenuItem(GetSystemMenu(AWindowHandles[i], FALSE), SC_CLOSE, nMValue);    if nHasWinLong then    begin      nWinLong := GetWindowLong(AWindowHandles[i], GWL_STYLE);      if AEnabled then      begin        if swb_Minimize in AButtons then          nWinLong := nWinLong or WS_MINIMIZEBOX;        if swb_Maximize in AButtons then          nWinLong := nWinLong or WS_MAXIMIZEBOX;      end      else      begin        if swb_Minimize in AButtons then          nWinLong := nWinLong and not WS_MINIMIZEBOX;        if swb_Maximize in AButtons then          nWinLong := nWinLong and not WS_MAXIMIZEBOX;      end;      SetWindowLong(AWindowHandles[i], GWL_STYLE, nWinLong);    end;  end;end;//调用方式 SetWindowButton([swb_Close, swb_Minimize, swb_Maximize], False, [Application.Handle, Handle]);

 

http://www.cnblogs.com/hs-kill/p/4650684.html

禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)