现在的位置: 首页 > 综合 > 正文

WPF:窗体不显示或禁用最大化、最小化、关闭按钮、图标以及对话框显示

2012年09月02日 ⁄ 综合 ⁄ 共 1617字 ⁄ 字号 评论关闭

 

更新:

感谢网友Engineer的评论,这一切可以在WPF中实现:

ResizeMode=NoResize将不会显示最大化最小化,只有关闭按钮

ResizeMode=CanMinimize最大化按钮被禁用,但是还是会显示,不能按,最小化,关闭按钮正常显示;

ResizeMode和WindowStyle配合使用时就可以实现你要的效果了。

 

推荐读者使用上述方法,而不是使用额外的Win32 API调用。

 

由于WPF没有提供上述要求的直接支持,所以我们只能(WPF可以解决,参考上面更新)用非托管本地API来解决,那么首先就是获取WPF窗体(Window对象)的句柄(Handle),这个可以通过System.Windows.Interop.WindowInteropHelper的Handle属性获取,可以写一个扩展方法如下:

static class WindowExtension

{

    public static IntPtr GetHandle(this Window window)

    {

        var helper = new System.Windows.Interop.WindowInteropHelper(window);

        return helper.Handle;

    }

}

 

取得了窗体的句柄之后,接下来就是调用本地API了。

首先是最小化按钮,最大化按钮的禁用。这个在Windows Forms里有直接支持,对应Form.MinimumBox和MaximizeBox属性。但WPF中,只能通过SetWindowLongPtr来改变它的内部属性。

 

关于GetWindowLongPtr和SetWindowLongPtr的平台调用,可以参考我写的另一篇文章:.NET(C#) 平台调用:不依赖平台的GetWindowLongPtr和SetWindowLongPtr API

 

源代码使用了Win32窗体API封装工程,把常用Win32窗体的API函数封装起来。这样的话,利用其中的封装方法然后直接通过设置或者取消WS_MINIMIZEBOX和WS_MAXIMIZEBOX来激活或者禁用最小化和最大化按钮。

 

其次就是整个系统控制按钮,这个包括图标、最大化、最小化和关闭按钮。这个对应Windows Forms中Form.ControlBox属性。在Win32中则是通过取消WS_SYSMENU标志来实现(同样是用SetWindowLongPtr函数)。

 

最后关于隐藏左上角的图标,可以参考这篇文章:http://blogs.msdn.com/b/wpfsdk/archive/2007/08/02/a-wpf-window-without-an-window-icon-the-thing-you-click-to-get-the-system-menu.aspx

原理则是设置窗体的扩展样式(SetWindowLongPtr中的GWL_EXSTYLE)为WS_EX_DLGMODALFRAME。然后调用SetWindowPos函数进行刷新。而且整个过程应该在WPF Window的SourceInitialized事件中进行。程序根据上面文章的内容,稍做些修改。

 

 

差不多就是这些要点,推荐读者下载并浏览源代码。

 

 

演示程序截图:

image

 

点击“显示标准对话框”后一个没有图标,没有最大化和最小化按钮可以缩放的标准对话框会显示:

image

 

还可以显示另一种更实用对话框(不可以点击最小化按钮):

image

 

 

源代码下载

下载地址

注意:此为微软SkyDrive存档,请用浏览器直接下载,用某些下载工具可能无法下载

源代码环境:Microsoft Visual C# 2010 Express

抱歉!评论已关闭.