博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
禁用WPF窗体的最大化按钮
阅读量:6712 次
发布时间:2019-06-25

本文共 1745 字,大约阅读时间需要 5 分钟。

出自:

设置ResizeMode="NoResize"可去掉最大化和最小化按钮 
但没法再拖曳改变窗体大小

WS_CLIPSIBLINGS:     0x04000000   WS_CLIPCHILDREN:     0x02000000   WS_VISIBLE:          0x10000000   WS_DISABLED:         0x08000000   WS_MINIMIZE:         0x20000000   WS_MAXIMIZE:         0x01000000   WS_CAPTION:          0x00C00000   WS_BORDER:           0x00800000   WS_DLGFRAME:         0x00400000   WS_VSCROLL:          0x00200000   WS_HSCROLL:          0x00100000   WS_SYSMENU:          0x00080000   WS_THICKFRAME:       0x00040000   WS_MINIMIZEBOX:      0x00020000   WS_MAXIMIZEBOX:      0x00010000

最近做的软件中要求禁止最大化按钮,并且要求可以改变窗体的Size。

调查后发现WPF窗体没有设置最大化按钮状态的属性。
改变WindowStyle属性可以达到禁用最大化按钮的目的,但是同时也不能更改窗体的Size了。
最后想到了使用Windows API改变按钮状态的方法。
使用GetWindowLong可以得到当前按钮的状态。使用SetWindowLong可以设置按钮的状态。
使用SetWindowPos进行界面的更新。
下面是这几个API的声明。
        [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
        public static extern int GetWindowLong(IntPtr hwnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "SetWindowLong")]

        public static extern int SetWindowLong(IntPtr hMenu, int nIndex, int dwNewLong);

        [DllImport("user32.dll")]

        private static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
进行禁用后必须进行界面的刷新,否则禁用状态不会立即显示在界面上。
        private void DisableMaxmizebox(bool isDisable)
        {
            int GWL_STYLE = -16;
            int WS_MAXIMIZEBOX = 0x00010000;
            int SWP_NOSIZE = 0x0001;
            int SWP_NOMOVE = 0x0002;
            int SWP_FRAMECHANGED = 0x0020;

            IntPtr handle = new WindowInteropHelper(this).Handle;

            int nStyle = GetWindowLong(handle, GWL_STYLE);

            if (isDisable)
            {
                nStyle &= ~(WS_MAXIMIZEBOX);
            }
            else
            {
                nStyle |= WS_MAXIMIZEBOX;
            }

            SetWindowLong(handle, GWL_STYLE, nStyle);

            SetWindowPos(handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);
        }
这个函数可以通过参数确定是否禁用。

转载地址:http://znolo.baihongyu.com/

你可能感兴趣的文章
CloudCC:如何将CRM变成企业发展战略
查看>>
某研究院dell存储 raid5 XFS磁盘阵列数据丢失恢复案例
查看>>
Java 访问 C++ 方法 JavaCPP
查看>>
关注数据中心“减负” WD助力绿色存储
查看>>
中国人工智能学会通讯——AI如何深度应用于消费金融的风控决策 1.2 在人工智能的业务实践中,长尾数据和特征能很大提升信用评分的准确性。...
查看>>
如何对有双因子认证站点进行钓鱼攻击?
查看>>
数据到底怎么用?运营报告的6个必备要素
查看>>
长见识了!5G竟然这样“改变社会”
查看>>
威胁情报 = 数据 + 人
查看>>
西门子与新创事业合作进军区块链微电网电力交易市场
查看>>
由学习《软件设计重构》所想到的代码review(一)
查看>>
业内人的“针砭时弊”:AI医疗界的3大乱象以及如何评价医学人工智能的成果?...
查看>>
美国科技股遭抛售 独立分析师为苹果鸣不平
查看>>
南通电信推广定制化云服务
查看>>
去芜存精:如何选择最优质的CRM软件研发商?
查看>>
为精简成本 诺基亚将在芬兰本土进行裁员
查看>>
实现数据科学研究结果可复制的十条规则
查看>>
智能家居行业步入死胡同 未来何去何从?
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——19.2 属性选择器
查看>>
意法半导体:加大中国市场投入 重点布局物联网/车联网
查看>>