禁用WPF窗体的最大化按钮

简介: 出自:http://www.cnblogs.com/dougua/archive/2007/07/03/804035.html 设置ResizeMode="NoResize"可去掉最大化和最小化按钮 但没法再拖曳改变窗体大小 ...

出自:http://www.cnblogs.com/dougua/archive/2007/07/03/804035.html


设置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);
       }

这个函数可以通过参数确定是否禁用。


相关文章
WPF控件和窗体一起放大一起缩小
WPF控件和窗体一起放大一起缩小
245 0
|
C# 容器
WPF框架下,窗体的嵌套显示
WPF框架下,窗体的嵌套显示
228 0
|
C# 前端开发
wpf中的datagrid绑定操作按钮是否显示或者隐藏
如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了。 但是在wpf里不行。。网上搜索了好久才找到解决方法,原来只是binding那个visiable属性就行了,
6901 0
|
C#
wpf窗体定位
原文:wpf窗体定位 据WPF外包小编了解,通常,不需要在屏幕上明确定位窗口。而是简单地将WindowState属性设置为Normal,并忽略其他所有细节。另一方面,很少会将WindowStartupLocation属性设置为Manual,并使用Left属性和Right属性明确设置窗口的位置。
880 0
|
C# 数据安全/隐私保护
用WPF写一个登录界面,我想在输入完密码后按回车就能够验证登陆,而不需要用鼠标单击登陆按钮
原文:用WPF写一个登录界面,我想在输入完密码后按回车就能够验证登陆,而不需要用鼠标单击登陆按钮 在wpf中,将按钮的IsDefault设置为true ​​​​
1208 0
|
C# C++ Windows
WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
原文:WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案          首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼容问题解决办法。
1325 0
|
C#
WPF自定义窗口最大化显示任务栏
原文:WPF自定义窗口最大化显示任务栏 当我们要自定义WPF窗口样式时,通常是采用设计窗口的属性 WindowStyle="None" ,然后为窗口自定义放大,缩小,关闭按钮的样式。 然而这样的话,当通过代码设置窗口(代码如下)放大时,窗口会把任务栏给遮档住。
1270 0
|
C#
WPF最大化避免覆盖任务栏
原文:WPF最大化避免覆盖任务栏 WPF当窗体WindowStyle=”None”时,最大化会覆盖掉任务栏。如何解决这个问题呢? 我在Google里面搜到一篇文章,要用到Win32 API,通过让WPF窗体WM_GETMINMAXINFO消息挂接一个钩子来处理。
1297 0
|
C#
在Winform窗体中使用WPF控件(附源码)
原文:在Winform窗体中使用WPF控件(附源码) 今天是礼拜6,下雨,没有外出,闲暇就写一篇博文讲下如何在Winform中使用WPF控件。原有是我在百度上搜索相关信息无果,遂干脆动手自己实现。 WPF控件的漂亮是Winform无法匹及的,本文主旨是在Winform工程中如何使用WPF控件。
1932 0
|
C#
WPF实现Twitter按钮效果
原文:WPF实现Twitter按钮效果 最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下. 实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.
1246 0