し上を行く ListView を表示したい,の巻
2003/11/16 新規

Windows のエクスプローラにある表示機能(WindowsXP だと少し挙動が違うけど)をそのまま提供しているのが ListView クラス。 「大きいアイコン」やら「一覧」「詳細」表示ができる ListView は非常に便利です。

そんな便利な ListView にも、ひとつ不満があります。それはコレ。

端っこ が余ってる ListView

そう。 カラム数が少なかったり横幅が長いとき、右側に余白部分ができてしまいます。 この表示がナントナク、だけど けっこうイヤな感じです。
もしコレが気にならない人は、今回の小技はこれにて終了です。

 

右側の余白をなくすには、最後尾(右)のカラムを自動リサイズに設定することで実現できます。 具体的にはウィンドウ・メッセージを受け取る WndProc() メソッドで、WM_PAINT メッセージを受け取ったときに処理するようにします。
例1

protected override void WndProc(ref Message message)
{
    const int WM_PAINT=0x000f;

    switch(message.Msg)
    {
    case WM_PAINT:
        if(View==View.Details&&Columns.Count>0)
        {
            Columns[Columns.Count-1].Width=-2;
        }
        break;
    }

    base.WndProc(ref message);
}

ListView のサブ・クラスを作り、そのソースの中に上記のコードを加えます。 たったこれだけですが、これだけで右側の余白がなくなります。

端っこ が余らない ListView

ただし、注意しなければならないコトが1点あります。
ListView.AllowColumnReorder の既定値は false ですが、これを true に設定して列ヘッダの並べ替えを可能にすると挙動がおかしくなります。 見た目がイマイチになるので、この小技を使うときには AllowColumnReorder プロパティを false にしておいたほうが良いでしょう。

 

おまけとして、主なウィンドウ・メッセージのコード一覧とその説明を簡単にリスト・アップしました。

WM_ACTIVATE = 0x0006
ウィンドウのアクティブ化、非アクティブ化
WM_CHAR = 0x0102
キーボードからの文字の入力
WM_CLEAR = 0x0303
エディット・コントロールのテキストの削除
WM_COMMAND = 0x0111
メニュー・アイテムの選択、コントロールからの通知
WM_CONTEXTMENU = 0x007B
コンテキスト・メニューを表示するために受け取る通知
WM_COPY = 0x0301
エディット・コントロールのテキストのコピー
WM_CUT = 0x0300
エディット・コントロールのテキストの切り取り
WM_DROPFILES = 0x0233
ファイルがドロップされたときに受け取る通知
WM_GETFONT = 0x0031
コントロールのフォントを取得
WM_GETICON = 0x007F
ウィンドウのアイコンを取得
WM_GETTEXT = 0x000D
ウィンドウ・タイトルやコントロールのテキストを取得
WM_GETTEXTLENGTH = 0x000E
ウィンドウ・タイトルやコントロールのテキストのサイズを取得
WM_KEYDOWN = 0x0100
非システム・キーが押された
WM_KEYUP = 0x0101
押されていた非システム・キーが離された
WM_LBUTTONDBLCLK = 0x0203
マウス左ボタンをダブル・クリック
WM_LBUTTONDOWN = 0x0201
マウス左ボタンが押された
WM_LBUTTONUP = 0x0202
押されていたマウス左ボタンが離された
WM_MBUTTONDBLCLK = 0x0209
マウス中央ボタンをダブル・クリック
WM_MBUTTONDOWN = 0x0207
マウス中央ボタンが押された
WM_MBUTTONUP = 0x0208
押されていたマウス中央ボタンが離された
WM_MENUSELECT = 0x011F
メニュー・アイテムが選択された
WM_MOVE = 0x0003
ウィンドウの移動
WM_NOTIFY = 0x004E
コモン・コントロールからの通知
WM_NULL = 0x0000
効果をもたないメッセージ
WM_PAINT = 0x000F
ウィンドウが描画を要求されたときに受け取る通知
WM_PASTE = 0x0302
エディット・コントロールのテキストの貼り付け
WM_RBUTTONDBLCLK = 0x0204
マウス右ボタンをダブル・クリック
WM_RBUTTONDOWN = 0x0205
マウス右ボタンが押された
WM_RBUTTONUP = 0x0206
押されていたマウス右ボタンが離された
WM_SETFONT = 0x0030
コントロールのフォントを設定
WM_SETTEXT = 0x000C
ウィンドウ・タイトルやコントロールのテキストを設定
WM_SIZE = 0x0005
ウィンドウ・サイズ変更
WM_SYSCOMMAND = 0x0112
システム・メニュー・アイテム選択
WM_UNDO = 0x0304
エディット・コントロールの直前の操作を元に戻す
WM_USER = 0x0400
アプリケーション定義メッセージの先頭


戻る