Windowの最小化、最大化ボタン
ウィンドウの最小化ボタン、最大化ボタンを消して欲しいと要望があったので、後輩に頼んだら難しいという回答が。そんなのプロパティの設定だけだと思ってみてみたら、プロパティが無い。WPFのWindowってMinimizeBoxとかMaximizeBoxが無かったのね。これくらい用意してくれよ・・・と、ぶつぶつ言いながら、やっつけコード。
using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop; [Flags] public enum WindowStyleFlag : uint { WS_SYSMENU = 0x00080000, WS_MINIMIZEBOX = 0x00020000, WS_MAXIMIZEBOX = 0x00010000, } public class WindowEx : Window { const int GWL_STYLE = -16; [DllImport ("user32")] private static extern uint GetWindowLong (IntPtr hWnd,int index); [DllImport ("user32")] private static extern uint SetWindowLong (IntPtr hWnd,int index, WindowStyleFlag dwLong); public static readonly DependencyProperty MinimizeBoxProperty = DependencyProperty.Register ("MinimizeBox",typeof (bool),typeof (WindowEx),new PropertyMetadata (true)); public static readonly DependencyProperty MaximizeBoxProperty = DependencyProperty.Register ("MaximizeBox",typeof (bool),typeof (WindowEx),new PropertyMetadata (true)); public static readonly DependencyProperty ControlBoxProperty = DependencyProperty.Register ("ControlBox",typeof (bool),typeof (WindowEx),new PropertyMetadata (true)); /// <summary> /// 最小化ボタン。 /// </summary> public bool MinimizeBox { get { return (bool)GetValue (MinimizeBoxProperty); } set { SetValue (MinimizeBoxProperty,value); } } /// <summary> /// 最大化ボタン。 /// </summary> public bool MaximizeBox { get { return (bool)GetValue (MaximizeBoxProperty); } set { SetValue (MaximizeBoxProperty,value); } } /// <summary> /// システムメニュー。 /// </summary> public bool ControlBox { get { return (bool)GetValue (ControlBoxProperty); } set { SetValue (ControlBoxProperty,value); } } protected WindowStyleFlag GetWindowStyle (WindowStyleFlag windowStyle) { WindowStyleFlag style = windowStyle; if (MinimizeBox) style |= WindowStyleFlag.WS_MINIMIZEBOX; else style &= ~WindowStyleFlag.WS_MINIMIZEBOX; if (MaximizeBox) style |= WindowStyleFlag.WS_MAXIMIZEBOX; else style &= ~WindowStyleFlag.WS_MAXIMIZEBOX; if (ControlBox) style |= WindowStyleFlag.WS_SYSMENU; else style &= ~WindowStyleFlag.WS_SYSMENU; return style; } protected override void OnSourceInitialized (EventArgs e) { base.OnSourceInitialized (e); IntPtr handle = (new WindowInteropHelper (this)).Handle; WindowStyleFlag original = (WindowStyleFlag)GetWindowLong (handle,GWL_STYLE); WindowStyleFlag current = GetWindowStyle (original); if (original != current) SetWindowLong (handle,GWL_STYLE,current); } }
WPFはまだまだ痒いところに手が届いていないので、業務アプリに使うのは時期尚早だったなぁ・・・。