CListCtrl のオーナー描画を実装する予定でした。アイテムの描画は、アイテムがコントロールに挿入された後だと思いました。したがって、私のメソッドは CListCtrl から派生したクラスを宣言し、その DrawItem() メソッドをオーバーライドします。問題は、アイテムを挿入した後に DrawItem が呼び出されないことです。私の方法に何か問題がありますか?
ありがとうございました!
CListCtrl のオーナー描画を実装する予定でした。アイテムの描画は、アイテムがコントロールに挿入された後だと思いました。したがって、私のメソッドは CListCtrl から派生したクラスを宣言し、その DrawItem() メソッドをオーバーライドします。問題は、アイテムを挿入した後に DrawItem が呼び出されないことです。私の方法に何か問題がありますか?
ありがとうございました!
DrawItem() オーバーライドを CListCtrl 派生クラスで呼び出すには、スタイルLVS_OWNERDRAWFIXEDを設定し、コントロールを「レポート ビュー」モードに設定する必要があります。私の知る限り、ownerdraw はレポート モードでのみ機能します。
また、変数がヘッダー ファイルで正しいタイプであること (例: CListCtrl ではなく CMyListCtrl) であることを確認し、Mark Ransom が提案したように DDX の割り当てが正しいことを確認します。
MeasureItem()とCompareItem()もオーバーライドする必要がある可能性があります。詳細については、Microsoftの記事TN014を参照してください。
これが私が自分のプロジェクトの1つから切り取って貼り付けたコードです。
int CGraphicDroplist::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
return 0;
}
void CGraphicDroplist::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
RECT r = lpDrawItemStruct->rcItem;
CDC pDC;
pDC.Attach(lpDrawItemStruct->hDC);
// Put your code to draw the item here.
pDC.Detach();
}
void CGraphicDroplist::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = 100;
}
コントロールに LBS_OWNERDRAWFIXED スタイルを設定する必要があります。これは、リソース テンプレートで行うか、ModifyStyle() 関数を使用してプログラムで行うことができます。
例:
m_myListbox.ModifyStyle(0, LBS_OWNERDRAWFIXED, 0);
問題は、ウィンドウをクラスのインスタンスに関連付けていないことにある可能性があります。これは、ダイアログの DoDataExchange メソッド内の DDX_Control で行われます。DDX_Control は CWnd::SubclassWindow を呼び出しますが、必要に応じて自分で行うこともできます。