禁用窗体关闭按钮

一般我们不想让窗体能够关闭, 首先想到的是在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]);
时间: 2024-10-07 06:00:07

禁用窗体关闭按钮的相关文章

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

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

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#中如何去除窗体默认的关闭按钮

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

WinForm特效:拦截窗体上各个部位的点击

windows窗体的标题栏无法直接通过一些默认的事件来控制,需要了解和WM_NCHITTEST相关的windows消息. 以下示例演示了最简单的效果片断: 他会把客户区和标题栏的效果互换,比如无法按住标题栏拖动窗体而是改为了安抓客户区拖动,并禁用了关闭按钮. 其中m.Result从-2到21都有定义,分别度应了整个窗体的各个部位,比如1代表客户区,8代表最小化按钮等等. [csharp] view plaincopy using System; using System.Windows.Form

vba窗体

Private Sub CommandButton1_Click() ' If IsDate(TextBox1.Text) = False Then ' MsgBox "请输入日期!" ' Exit Sub ' End If If 类别 = "" Or 维修部件 = "" Or 部门 = "" Or 申请人 = "" Or 资产编号 = "" Or 维修数量.Value = "

[WPF自定义控件]?Window(窗体)的UI元素及行为

原文:[WPF自定义控件]?Window(窗体)的UI元素及行为 1. 前言 本来打算写一篇<自定义Window>的文章,但写着写着发觉内容太多,所以还是把使用WindowChrome自定义Window需要用到的部分基础知识独立出来,于是就形成了这篇文章. 无论是桌面编程还是日常使用,Window(窗体)都是最常接触的UI元素之一,既然Window这么重要那么多了解一些也没有坏处. 2.标准Window 这篇文章主要讨论标准的Window,不包括奇形怪状的无边框.非矩形Window,即只讨论W

VB.net窗体设计

1 设定窗体大小: MaximizeBox:窗体最大化设置.  FormBorderStyle:设置窗体样式,如:使用鼠标调整窗体大小等. 1 2 3 4 5 6 '窗体最大化 Form.WindowState = FormWindowState.Maximized '禁用窗体最大化按钮 Form.MaximizeBox = False '禁止用户用鼠标改变窗体大小 Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle

Java使用图片自定义登录窗体

一.问题概述 Java是一门面向对象的编程语言,从出版至今,Java对其自身不断改进,Java的图形界面编程也做的越来越好,从AWT到更高级的Swing.但是,我们的需求永远是无法满足的,有时候我们需要自定义窗体,特别是一张漂亮的图片做一个窗体,那就再好不过了.那么,今天我就把用图片自定义应用窗体的方法分享给大家. 二.实现方法 1.用图片自定义应用窗体效果图: 图1 Java使用图片自定义应用窗体效果图 2.创建一个类继承Swing中JFrame,然后定义一个BufferedImage变量,用