禁用窗体关闭按钮(使用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

时间: 2024-10-11 04:42:02

禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)的相关文章

禁用窗体关闭按钮

一般我们不想让窗体能够关闭, 首先想到的是在OnCloseQuery事件里设置CanClose := False, 不过在某些情况下这个会和程序关闭窗体的业务逻辑产生冲突 所以写了下面这个函数, 可以设置窗体上的部分控制按钮禁用和启用, 仅仅是按钮显示及对鼠标键盘的响应, 按钮功能方面不影响 type TSetWinButtons = set of (swb_Close, swb_Minimize, swb_Maximize); {设置窗体关闭按钮状态} procedure SetWindowB

C# WinForm窗体控件Panel修改边框颜色以及边框宽度方法

C# WinForm窗体控件Panel修改边框颜色以及边框宽度方法 1.新建组件这里可以自定义一个Panel控件起名为PanelEx 2.增加一个BoderColor属性和BoderSize属性 1 private Color _BorderColor = Color.Black; 2 3 [Browsable(true), Description("边框颜色"), Category("自定义分组")] 4 public Color BorderColor 5 {

C#禁用窗体的关闭按钮

private const int CP_NOCLOSE_BUTTON = 0x200; protected override CreateParams CreateParams { get { CreateParams myCp = base.CreateParams; myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON; return myCp; } }

禁用Winform关闭按钮

       禁用关闭按钮需使用窗体的WndProc处理方法,这个方法是用来截获单击关闭窗体信息的.这个要通过重写WndProc的虚方法来实现. 重写WndProc protected override void WndProc(ref Message m) {        const int WM_SYSCOMMAND=0x0112;//定义将要截获的消息类型        const int SC_CLOSE=0xF060;//定义关闭按钮对应的消息值        if((m.Msg==

C#窗体控件GroupBox修改边框色

控件Group Box默认的边框的颜色是白色的,在很多时候显得不那么突出.但默认的属性列表里面并没有提供相应的接口.所以只能借助重绘事件. 网上很多都说使用 OnPaint 事件,但是我在事件列表中没找到,应该是隐藏得太深了(需要用 override 关键字来重写).我这里直接使用了 Paint 事件,也可以达到其效果. 感谢:http://blog.csdn.net/haoduo123456789001/article/details/51083223 public partial class

delphi窗体按钮灰化禁用

1.使最小化按钮变灰:setwindowlong(handle,gwl_style,getwindowlong(handle,gwl_style)   and   not   ws_minimizebox  ); 2.使最大化按钮变灰:setwindowlong(handle,gwl_style,getwindowlong(handle,gwl_style)   and   not   ws_maximizebox); 3. 关闭按钮变灰色 EnableMenuItem(GetSystemMen

C#中如何去除窗体默认的关闭按钮

很多时候,在winform的设计下,会遇到新建窗体时不需要用到默认的关闭按钮的情况,而是用另外设置关闭 button或其他控件来控制窗体的关闭. 之前我遇到这个问题时,问了很多朋友,都没找到方法,VS的窗体属性里也没那一项,在MSDN里也没有相关的资料. 但后来偶然发现,原来办法是很简单的,只需要在初始化窗体的时候不显示那关闭按钮就可以了. 具体方法是,加上一句 “ this.ControlBox = false;”. 如下: public Form1()        {           

手动修改继承窗体

转自http://blog.csdn.net/atian2009/article/details/7478234 1.手工修改窗体继承时,怎样让其父类的所有控件显示(在设计时)? File -> New -> Form,新建一个form,在form的单元文件中修改 TForm1 = class(TForm) 为: TForm1 = class(TFatherForm) //TFatherForm为被继承的窗体 不要忘记  uses TFatherForm的单元文件, 再在Form窗体上弹出右键

去掉关闭按钮同时禁用alt+f4进行关闭

public int ctype = 0; private const int GWL_STYLE = -16; private const int WS_SYSMENU = 0x80000; [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] private static extern int GetWindowLong(IntPtr hWnd, int nIndex); [Sys