DOBON.NET DOBON.NETプログラミング掲示板過去ログ

タスクバーのようにリサイズ時に一気にリサイズする方法

環境/言語:[C# Framework1.1]
分類:[.NET]

ちょっと表現があれですが、タスクバーのふちをドラッグして
リサイズさせようとすると、全部表示されるか、一気に隠れるか
の両極端になってると思います。
それと同じようにリサイズ時に一気にサイズ変更させたいのですが、
実現方法がちょっと検討つきません。あれはAPIを使ってるんでしょうか?
それとも何かのプロパティ、またはソースでガリガリ書いてるんでしょうか?
よろしくお願いします。
■No15307に返信(DDRさんの記事)
> それと同じようにリサイズ時に一気にサイズ変更させたいのですが、

Windows の設定に依存させるべきじゃないでしょうか?
そういう設定があるだけに。

___________________________________________________________________________________
じゃんぬ - Microsoft MVP for Visual Developer C#
  C#, VB.NET 入門  http://jeanne.wankuma.com/
  じゃんぬねっと日誌 http://blogs.wankuma.com/jeanne/
> それと同じようにリサイズ時に一気にサイズ変更させたいのですが、
> 実現方法がちょっと検討つきません。

Resize イベント辺りで、マウスボタンが押されていなかったら、ウィンドウサイズを補正すればいいんじゃないでしょうか。
> それと同じようにリサイズ時に一気にサイズ変更させたいのですが、

実装はできたけど、力技になってしまった……。
# もっとスマートな方法は無いのかな。

//===========================================================
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class Form1 : Form {
  [STAThread]
  static void Main() {
    Form1 f = new Form1();
    f.Size = new System.Drawing.Size(480, 480);
    Application.Run(f);
  }

  private const int WM_SIZE = 0x5;
  private const int WM_SIZING = 0x214;
  private const int WMSZ_LEFT = 1;
  private const int WMSZ_RIGHT =2;
  private const int WMSZ_TOP = 3;
  private const int WMSZ_TOPLEFT =4;
  private const int WMSZ_TOPRIGHT =5;
  private const int WMSZ_BOTTOM =6;
  private const int WMSZ_BOTTOMLEFT =7;
  private const int WMSZ_BOTTOMRIGHT = 8;
  protected override void WndProc(ref Message m)
  {
    const int HBlock = 120;//水平120ドット間隔で
    const int VBlock = 60; //垂直60ドット間隔で

    if(m.Msg == WM_SIZING) 
    {
      //各辺の座標を取得
      int L = Marshal.ReadInt32(m.LParam, 0);
      int T = Marshal.ReadInt32(m.LParam, 4);
      int R = Marshal.ReadInt32(m.LParam, 8);
      int B = Marshal.ReadInt32(m.LParam, 12);

      int WndWidth = R - L;           //幅
      WndWidth -= WndWidth % HBlock;  //幅補正

      int WndHeight = B - T;          //高さ
      WndHeight -= WndHeight % VBlock;//幅補正

      //ドラッグされている辺に応じて、新たなサイズを指定
      switch(m.WParam.ToInt32())
      {
        case WMSZ_LEFT:
          L = R - WndWidth;
          break;
        case WMSZ_RIGHT:
          R = L + WndWidth;
          break;
        case WMSZ_TOP:
          T = B - WndHeight;
          break;
        case WMSZ_BOTTOM:
          B = T + WndHeight;
          break;
        case WMSZ_TOPLEFT:
          T = B - WndHeight;
          L = R - WndWidth;
          break;
        case WMSZ_TOPRIGHT:
          R = L + WndWidth;
          T = B - WndHeight;
          break;
        case WMSZ_BOTTOMLEFT:
          L = R - WndWidth;
          B = T + WndHeight;
          break;
        case WMSZ_BOTTOMRIGHT:
          R = L + WndWidth;
          B = T + WndHeight;
          break;
      }
      //新しいサイズで上書き
      Marshal.WriteInt32(m.LParam, 0, L);
      Marshal.WriteInt32(m.LParam, 4, T);
      Marshal.WriteInt32(m.LParam, 8, R);
      Marshal.WriteInt32(m.LParam, 12, B);
    }
    base.WndProc (ref m);
  }
}
魔界の仮面弁士さん、すごいです。
実装できました!
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板