CListCrtlで列幅を0固定

[戻る]
あすか 2007/10/05(金) 13:57:11
早速ですが質問させていただきます。

CListCtrlで、1列だけ非表示にしたいのですが、
うまくいかなくて困っています。
現在は、初期化時に非表示にしたい列の列幅を0にしています。
しかし、ヘッダをドラッグしてサイズ変更されてしまうと、
列幅が変わり表示されてしまうので、

ON_NOTIFY(HDN_ENDTRACK, 0, &Class::OnHdnEndtrack***)
で、ヘッダの区分線をドラッグし終えたタイミングで、

ListCtrl.SetColumnWidth( 2, 0 );

を行い、列幅を0に戻そうとしていますが、
列幅が0になってくれません。
ちらつき加減から、一度、0になっているようなのですが、
カーソル位置の幅に戻ってしまっているようです。
どなたか、良い方法があれば教えてください。
よろしくお願いいたします。

あすか 2007/10/05(金) 13:58:39
すみません。
環境を書き忘れていました。

WinXP VC++2005 MFC

です。
よろしくお願いいたします。

とおりすがり 2007/10/05(金) 14:47:47
レポート表示しているんでしょうか?
非表示にしたいならカラムを挿入しなければいいと言ってみるテスト

というのもHeaderContorolの操作までカスタムするのはなかなか難しいから。
他で対処できるならそうした方が楽。
あとは詳しくは知らないですがGetHeaderCtrl()からフックを仕込んで
ヘッダの区分線へのドラッグ開始メッセージを無効にするというのは?

#自分はVC6.0レベルなのでVC2005では何かいいやり知ってる人がいたら
 そちらを参考にしてください

あすか 2007/10/05(金) 15:02:44
とおりすがりさん、早速の解答ありがとうございます。

すみません、書いておりませんでしたが、
レポート表示しています。

表示したくなくても、必要なデータがあるので、
カラムは必要だと考えています。
別リストか配列で記憶しようかとも考えたのですが、
ソート等された場合対応しているデータが
分からなくなってしまうのでは、と思ったのです。

ヘッダの区分線へのドラッグ開始メッセージを無効は、
非表示にしたいデータ以外も列幅のサイズ変更出来なくなって
しまうので、困るのです。

HeaderContorolの操作というものを変更するしか無いのでしょうか?

とおりすがり 2007/10/05(金) 15:22:50
リストコントロールへのメッセージはヘッダコントロールの
メッセージを処理後、リストへメッセージが転送されている(はず)のでそこで
操作しようとするとちらついたり無理だったりします。
なのでそういう操作変更をするためにはヘッダにフックを仕込む必要があります。

必要なデータはそのリストコントロールの別データがソート/その他
変更をしたときに付随して変えるようにすればいいのであって
カラムが必要とは思えなかったり・・・

あすか 2007/10/05(金) 15:46:36
とおりすがりさんのおっしゃることは重々承知なのですが・・・。
数多いデータから、必要なデータだけリストへセットし、
リストのデータを入力で加工・・・としたくて、
そのための必要データはカラムに入れて、
非表示にしておけば楽!と安易に考えたのです。
確かに、別データとして持っていても、
キーになるデータから変更は可能ですが、
リストから取り出せると安全な気がしませんか?
それと、出来るならやってみたいとも思ってしまって・・・。
最後の手段としては別データとして持つという、
手があるので、もう少し「ヘッダにフックを仕込む」
とやらを、調べてみたいと思います。
ありがとうございます。

subaru 2007/10/05(金) 17:49:53
表示する必要のないデータは、
SetItemData/GetItemDataメソッドを使って関連付けられます。
リストの各行にデータへのポインタを格納しておくと楽です。
ソートが発生しても安全に取り出せます。

古いスレッドには追加発言できません。