< 開くダイアログ | Binding の StringFormat プロパティのカルチャって ? >

January 23, 2009

続:最大化ボタン・最小化ボタン・システムメニューのないウインドウ

最大化ボタン・最小化ボタン・システムメニューのないウインドウの実装を考え中。

これもありか?

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace WindowStyleProject { public abstract class StyledWindow : Window { const int GWL_STYLE = -16;
/// <summary> /// ウインドウスタイルを上書きする /// 継承先でオーバーライドする /// </summary> /// <param name="windowStyle">現在のウインドウスタイル</param> /// <returns>新たに設定するウインドウスタイル</returns> protected virtual WindowStyleEnum OverrideWindowStyle (WindowStyleEnum windowStyle) { return windowStyle; // デフォルトは変更なし }
/// <summary> /// ウインドウスタイルを設定する /// </summary> /// <param name="e"></param> protected override void OnSourceInitialized (EventArgs e) { base.OnSourceInitialized (e);
// 現在のウインドウスタイルを取得 IntPtr handle = (new WindowInteropHelper (this)).Handle; var originalWindowStyle = (WindowStyleEnum) GetWindowLong (handle, GWL_STYLE);
// 継承先で更新された値を取得 var newWindowStyle = this.OverrideWindowStyle (originalWindowStyle);
// 上書き if (originalWindowStyle != newWindowStyle) SetWindowLong (handle, GWL_STYLE, (uint) newWindowStyle); }
[DllImport ("user32.dll")] static extern uint GetWindowLong (IntPtr hWnd, int nIndex);
[DllImport ("user32.dll")] static extern uint SetWindowLong (IntPtr hWnd, int nIndex, uint dwNewLong);
}
public enum WindowStyleEnum : uint { // // Window Styles // WS_OVERLAPPED = 0x00000000, WS_POPUP = 0x80000000, WS_CHILD = 0x40000000, WS_MINIMIZE = 0x20000000, WS_VISIBLE = 0x10000000, WS_DISABLED = 0x08000000, WS_CLIPSIBLINGS = 0x04000000, WS_CLIPCHILDREN = 0x02000000, WS_MAXIMIZE = 0x01000000, WS_CAPTION = 0x00C00000, // WS_BORDER | WS_DLGFRAME WS_BORDER = 0x00800000, WS_DLGFRAME = 0x00400000, WS_VSCROLL = 0x00200000, WS_HSCROLL = 0x00100000, WS_SYSMENU = 0x00080000, WS_THICKFRAME = 0x00040000, WS_GROUP = 0x00020000, WS_TABSTOP = 0x00010000,
WS_MINIMIZEBOX = 0x00020000, WS_MAXIMIZEBOX = 0x00010000,
WS_TILED = WS_OVERLAPPED, WS_ICONIC = WS_MINIMIZE, WS_SIZEBOX = WS_THICKFRAME, WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW,
// // Common Window Styles // WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX),
WS_POPUPWINDOW = (WS_POPUP | WS_BORDER | WS_SYSMENU),
WS_CHILDWINDOW = (WS_CHILD), }
}

使い方は、StyledWindow を継承して、OverrideWindowStyle をオーバーライドする。

// Window1.xaml
namespace WindowStyleProject
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : StyledWindow
    {
        public Window1 ()
        {
            InitializeComponent ();
        }

protected override WindowStyleEnum OverrideWindowStyle (WindowStyleEnum windowStyle) { return windowStyle & (~WindowStyleEnum.WS_SYSMENU); } } }

あーでも、XAML のほうも書き換えなきゃな。これがうざい。

<local:StyledWindow x:Class="WindowStyleProject.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WindowStyleProject"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <!-- 中略 -->
    </Grid>
</local:StyledWindow>

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2301

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?