none
Windowサイズ比率の指定 RRS feed

  • 質問

  • はじめまして。
     Vistaに入っているMedia CenterのようにWindowサイズの比率を固定したまま、Windowサイズを変更するような処理を行いたいと思っています。
     試しにWindowサイズが100x100に変化するようなコードを、Windowのパーシャルクラスに書いたのですが、実行すると、サイズ変更直後は100x100に変化するのですが、すぐに元のサイズに戻ってしまいます。
     何か良い方法はないでしょうか?

    ---- コード ------------------------------------------
    public SampleWindow()
    {
    this.InitializeComponent();
    this.SizeChanged += new SizeChangedEventHandler(this.OnSizeChangedEventHandler);
    }

    private void OnSizeChangedEventHandler(Object sender, SizeChangedEventArgs args)
    {
    // 比率変化なし
    if (args.HeightChanged == args.WidthChanged) { return; }

    // 比率変化あり
    Console.WriteLine("★" + base.Width + "/" + base.Height);
    base.Height = 100;
    base.Width = 100;
    Console.WriteLine(Width + "/" + Height);
    }

    ---- 実行結果 ---------------------------------------
    ★637/480 <--- Windowサイズ変更時
    123/100
    2007年3月26日 4:44

回答

  • .Netから外れてしまうかもしれませんがWM_SIZINGを使用した方法で・・・。



    public partial class Window1 : Window
    {
        public Window1()
        {
            SourceInitialized += OnSourceInitialized;
            InitializeComponent();
        }
        void  OnSourceInitialized(object sender, EventArgs e)
        {
            HwndSource hwndSource =
                    (HwndSource)HwndSource.FromVisual(this);
            hwndSource.AddHook(WndHookProc);
        }
        public const int WM_SIZING = 0x214;
        private static IntPtr WndHookProc(
            IntPtr hwnd, int msg, IntPtr wParam,
            IntPtr lParam, ref bool handled)
        {
            if (msg == WM_SIZING) {
                RECT rect = (RECT)Marshal.PtrToStructure(
                                          lParam, typeof(RECT) );
                rect.bottom = rect.top + rect.Width;
                Marshal.StructureToPtr( rect, lParam, true );
            }
            return IntPtr.Zero;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
            public int Width
            {
                get { return right-left; }
            }
            public int Height
            {
                get { return bottom-top; }
            }
        }
    }

     

    こんなんでどうでしょう?
    もっと良い方法があるような気もしますけど。

    2007年3月26日 7:21

すべての返信

  • .Netから外れてしまうかもしれませんがWM_SIZINGを使用した方法で・・・。



    public partial class Window1 : Window
    {
        public Window1()
        {
            SourceInitialized += OnSourceInitialized;
            InitializeComponent();
        }
        void  OnSourceInitialized(object sender, EventArgs e)
        {
            HwndSource hwndSource =
                    (HwndSource)HwndSource.FromVisual(this);
            hwndSource.AddHook(WndHookProc);
        }
        public const int WM_SIZING = 0x214;
        private static IntPtr WndHookProc(
            IntPtr hwnd, int msg, IntPtr wParam,
            IntPtr lParam, ref bool handled)
        {
            if (msg == WM_SIZING) {
                RECT rect = (RECT)Marshal.PtrToStructure(
                                          lParam, typeof(RECT) );
                rect.bottom = rect.top + rect.Width;
                Marshal.StructureToPtr( rect, lParam, true );
            }
            return IntPtr.Zero;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
            public int Width
            {
                get { return right-left; }
            }
            public int Height
            {
                get { return bottom-top; }
            }
        }
    }

     

    こんなんでどうでしょう?
    もっと良い方法があるような気もしますけど。

    2007年3月26日 7:21
  • FC-Shiro様 レスありがとうございます。

     ご提示頂いたソースで目的の動きを実現できました!ありがとうございます。
    FC-Shiro様も言われているとおり、この動作をWPFの範疇で実現できる方法があると良いのですが・・・。
    2007年3月29日 3:40