リストビューのオーナードロー日記

またまたMFCです。こんなの作ってみた。でもどのみちスムーススクロールしないので、いやスムーススクロールへの道はないことがわかったので、敗北感たっぷりなのだが。以下はリストビューのオーナードローのメモ。流れとしては

  • 基本クラスを継承し、
  • DrawItemハンドラを追加し
  • DrawItemの中身を記述する

というわけなのだが、これの具体的なやり方がどうもすっきりわかりにくいのでメモ。(VC2008SP1)

  1. LVS_OWNERDRAWFIXEDをスタイルに加えるというか、リソースエディタがあるなら、OwnerDrawFixed を、Trueにする。勿論、リストビューはレポートモードにしてある。
  2. ダイアログに貼り付けたリストビューをダイアログのm_list2という名のメンバにした。
  3. クラスビューの右クリックメニューから、「クラスの追加」で、CListCtrlから派生させたCMylistCtrl を作成。
  4. CMyDialog.h の中で宣言されている、 CListCtrl m_list2 という宣言を、CMylistCtrl m_list2に書き換えた。もちろん#include "MylistCtrl.h"もしてだ。
  5. クラスビューのCMylistCtrlを右クリック、プロパティで、DrawItemメソッドを追加した。(プロパティウィンドウの雷のアイコンではなく、その右にある四角みたいなアイコンから)(ダイアログの、WM_DRAWITEMのハンドラとして作成するわけではなし。あくまで、CMylistCtrlクラスの、DrawItem( LPDRAWITEMSTRUCT )という関数が作成されなくてはならない。
  6. CMylistCtrl::DrawItem() 関数ができるので、その中で、ブレークポイントをかけると、ちゃんと処理がそこに飛んできていることが確認できた。
  7. CMylistCtrl::DrawItem( LPDRAWITEMSTRUCT /*lpDrawItemStruct*/ )を、CMylistCtrl::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ) に書き直して、
  8. これで漸く、DrawItemコーディングの世界に飛び込むことができるようになる。

それはまた気が向いたときに。

// DrawItemの実装例