VB9, .NETFramework2.0 使用です。ListView で、列幅変更ができないようにしたくて、

ネットにあったコード↓でやってみたのですが、

Private Sub ListView_ColumnWidthChanging(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnWidthChangingEventArgs) Handles ListView.ColumnWidthChanging

e.NewWidth = Me.ListView.Columns(e.ColumnIndex).Width
e.Cancel = True

End Sub

これだけでは、列間にマウスカーソルを持っていったときに vSplit 形状になり、いまいちです。
なんとかカーソルの形状を変えない (あるいは、ColumnHeader 上では非表示にする) ようにする
方法をご存知の方がいらっしゃれば教えてください。
ListView の継承コントロールを作るしかないのかもしれませんが、もっと良い方法があれば...
よろしくお願いします。


回答の条件
  • 1人2回まで
  • 登録:2009/02/10 02:20:24
  • 終了:2009/02/12 04:17:41

ベストアンサー

id:tsukasa57 No.1

tsukasa57回答回数110ベストアンサー獲得回数202009/02/11 22:30:46

ポイント100pt

たぶん、次の記事が参考になります。言語は C# になっていますが、lph さんが行いたいことはまさしくこれだと思います。サンプルをダウンロードして試して見たところ、ColumnHeader 上でのカーソルは変化しませんでした。サンプルの内容は短く簡単なんですが、C++(というかWindows API)の知識が無いとちょっと難しいかもしれません。

http://www.codeproject.com/KB/list/myListViewNoSize.aspx

短いコードなので VB.NET に移植してもそれほど手間はかからないと思います。

# 質問の条件(VB.NET)からは外れる回答なため、コメント欄が開いていればそこへ回答を書いたんですが開いていないので...

id:lph

ありがとうございます !!

VB でも動きました。起動時に運悪く、ColumnHeader 上でマウスが砂時計とかになってしまうと、そのまま戻らないところはなんとかがんばって実装します。(もし、tsukasa57 様が楽にやれるようでしたら教えてください ^^;)

今度からは英語のサイトも探すようにします。ほんとうにたすかりました。感謝です。

2009/02/12 04:16:41
  • id:tsukasa57
    > 起動時に運悪く、ColumnHeader 上でマウスが砂時計とかになってしまうとそのまま戻らない

    気がつきませんでした。バグっぽいですね。

    サンプルコードの HeaderControl.WndProc の WM_SETCURSOR で
    if(parentListView.LockColumnSize) を
    if(!Cursor.Current.Equals(Cursors.WaitCursor) && parentListView.LockColumnSize) に
    変更すれば砂時計にはならなくなります。意図的に砂時計にする必要がなければこの修正でも良いかもしれません。
    ※サンプルコードの myListView.cs に WndProc メソッドは 2 つありますが修正するのは最初の 1つだけです。
  • id:lph
    いただいたアドバイスを参考にいろいろやってみましたが、本気で解決しようとすると、マウス側をキャプチャするか、ウィンドウクラスを自作しなければならないかもしれず、C++ の知識がない私には限界かなと思いました。いろいろと勉強になりました。ありがとうございました !!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません