2

CListCtrl のオーナー描画を実装する予定でした。アイテムの描画は、アイテムがコントロールに挿入された後だと思いました。したがって、私のメソッドは CListCtrl から派生したクラスを宣言し、その DrawItem() メソッドをオーバーライドします。問題は、アイテムを挿入した後に DrawItem が呼び出されないことです。私の方法に何か問題がありますか?

ありがとうございました!

4

4 に答える 4

1

DrawItem() オーバーライドを CListCtrl 派生クラスで呼び出すには、スタイルLVS_OWNERDRAWFIXEDを設定し、コントロールを「レポート ビュー」モードに設定する必要があります。私の知る限り、ownerdraw はレポート モードでのみ機能します。

また、変数がヘッダー ファイルで正しいタイプであること (例: CListCtrl ではなく CMyListCtrl) であることを確認し、Mark Ransom が提案したように DDX の割り当てが正しいことを確認します。

于 2008-10-24T10:40:23.393 に答える
0

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;
}
于 2008-10-24T03:44:13.860 に答える
0

コントロールに LBS_OWNERDRAWFIXED スタイルを設定する必要があります。これは、リソース テンプレートで行うか、ModifyStyle() 関数を使用してプログラムで行うことができます。

例:

m_myListbox.ModifyStyle(0, LBS_OWNERDRAWFIXED, 0);
于 2008-10-24T01:32:27.527 に答える
0

問題は、ウィンドウをクラスのインスタンスに関連付けていないことにある可能性があります。これは、ダイアログの DoDataExchange メソッド内の DDX_Control で行われます。DDX_Control は CWnd::SubclassWindow を呼び出しますが、必要に応じて自分で行うこともできます。

于 2008-10-24T01:37:01.727 に答える