一般我们不想让窗体能够关闭, 首先想到的是在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)的更多相关文章

  1. C# WinForm开发 取消窗体关闭按钮

    //禁用窗体的关闭按钮 private const int CP_NOCLOSE_BUTTON = 0x200; protected override CreateParams CreateParam ...

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

    C# WinForm窗体控件Panel修改边框颜色以及边框宽度方法 1.新建组件这里可以自定义一个Panel控件起名为PanelEx 2.增加一个BoderColor属性和BoderSize属性 pr ...

  3. C# WinForm窗体控件GroupBox修改边框颜色控件

    C# WinForm窗体控件GroupBox修改边框颜色控件 1.新建组件这里可以自定义一个GroupBox控件起名为GroupBoxEx 2.增加一个BoderColor属性 private Col ...

  4. winform 窗体关闭按钮禁用、不显示最大化、最小化、关闭按钮 分类: WinForm 2014-12-22 16:09 82人阅读 评论(0) 收藏

    关闭按钮禁用: (1) FormClosing事件 private void Main_FormClosing(object sender, FormClosingEventArgs e) {     ...

  5. 窗体操作:GetWindowLong()

    函数原型: LONG GetWindowLong( HWND hWnd,int nIndex )   参数: hWnd:指定窗口的句柄 nIndex:需要获得的信息的类型      值         ...

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

    控件Group Box默认的边框的颜色是白色的,在很多时候显得不那么突出.但默认的属性列表里面并没有提供相应的接口.所以只能借助重绘事件. 网上很多都说使用 OnPaint 事件,但是我在事件列表中没 ...

  7. KingbaseES R6 集群禁用 root ssh 后需要修改集群为es_server 案例

    案例说明: 在生产环境下,由于安全需要,主机间不允许建立root用户的ssh信任连接,这样导致KingbaseES R6 repmgr集群,通过sys_monitor.sh脚本启动集群时,节点之间不能 ...

  8. SystemMenu类的用法

    先声明对象以及相应常数: //SystemMenu对象 private SystemMenu m_systemMenu = null; // ID 常数定义 (可变,只要不与系统冲突即可) priva ...

  9. WPF窗体禁用最大化按钮

    禁用WPF窗体的最大化按钮可以使用Windows API改变按钮状态的方法实现.使用GetWindowLong可以得到当前按钮的状态.使用SetWindowLong可以设置按钮的状态.使用SetWin ...

随机推荐

  1. [AngularJS + Webpack] Requiring CSS & Preprocessors

    Making your CSS modular is a difficult thing to do, but using Webpack makes this so much easier. By ...

  2. android生成验证码bitmap

    不多说了,直接上代码,项目中用到的,未做优化,还有很多参数未设置. [java] view plaincopy 1.import java.util.Random; 2. 3.import andro ...

  3. 读取一个文件,将其Base64编码,每76个字符加一个换行(转)

    echo chunk_split(base64_encode(file_get_contents('base64.txt'))); 例子 1 本例分隔每个字符,并添加 ".": & ...

  4. limit-进程句柄限制

    在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题,比如还有Squid做代理,当文件打开数到900多时速能就非常快的下降,有可 ...

  5. Qt 学习之路 :使用 QJson 处理 JSON

    XML 曾经是各种应用的配置和传输的首选方式.但是现在 XML 遇到了一个强劲的对手:JSON.我们可以在 这里 看到有关 JSON 的语法.总体来说,JSON 的数据比 XML 更紧凑,在传输效率上 ...

  6. 在Ubuntu 12.10 上安装部署Openstack

    OpenStack系统有几个关键的项目,它们能够独立地安装但是能够在你的云计算中共同工作.这些项目包括:OpenStack Compute,OpenStack Object Storage,OpenS ...

  7. javascript中涉及到汉字的比较

    在使用js中的"=="进行字符串的比较时,发现在英文情况下是ok的,但在中文比较时则不行了. 在网上搜索,提供了一个解决方法,使用 stringObject.localeCompa ...

  8. iOS-UIResponse之事件响应链及其事件传递

    UIResponse之事件响应链及其事件传递 我们的App与用户进行交互,基本上是依赖于各种各样的事件.一个视图是一个事件响应者,可以处理点击等事件,而这些事件就是在UIResponder类中定义的. ...

  9. Java基础知识强化99:Java 常见异常及趣味解释

    常见 Java 异常解释:(译者注:非技术角度分析.阅读有风险,理解需谨慎:) 1. java.langjava.lang软件包是java语言的核心部分,它提供了java中的基础类. java.lan ...

  10. HTML5之填写个人信息