質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.38%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Q&A

解決済

1回答

376閲覧

仮想リストコントロールで特定行の背景色を変えたい

HOOOO

総合スコア6

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

0グッド

0クリップ

投稿2024/03/21 02:37

編集2024/03/26 06:00

実現したいこと

  • 仮想リストコントロールで特定行の背景色を変えたいです。

前提

Visual Studio 2019、MFCアプリケーションを作成しています。
通常のリストコントロールで行っていた物を仮想リストコントロールに変更しようとしています。
通常のリストコントロールでは特定行の背景色を変更することができていましたが、仮想リストコントロールへ変更してから背景色の変更ができません。

1.リストコントロールのプロパティから所有者データをTRUEへ変更(オーナードローをTUREへ)
2.「NM_CUSTOMDRAW」を呼び出し、以下のソートを実装

VC++

1void CXXXXXX::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult) 2{ 3 NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); 4 5 if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) 6 { 7 *pResult = CDRF_NOTIFYITEMDRAW; 8 } 9 else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) 10 { 11 if (条件を指定) 12 { 13 pLVCD->clrTextBk = m_colActive; 14 } 15 16 *pResult = CDRF_DODEFAULT; 17 } 18 19 *pResult = 0; 20}

この実装しているコードで、通常リストコントロールは背景色の変更ができました。
しかし、仮想リストコントロールへ変更後の動作では、最初の「if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)」へ入った後に、下の「else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)」へ入らなくなっています。
これは、オーナードローへ変更したことで、「NM_CUSTOMDRAW」が使えなくなっているということでしょうか?
「NM_CUSTOMDRAW」が使用できない場合に、特定の行の背景色を変更する方法はあるのでしょうか?

通常リストコントロールと仮想リストコントロールでの背景色の指定方法の違いについて、教えて頂きたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki-o

2024/03/22 11:00

もし後付けが可能なら、前の質問と同じように[VC++][MFC]のタグを付けてください。
guest

回答1

0

ベストアンサー

NM_CUSTOMDRAWのハンドラーに関して、通常リストコントロールと仮想リストコントロールで違いは、ありません。
7行目と8行目の間に、「return;」を追加してください。これが無いと、*pResult = 0;で上書きされるので、次に飛んできたときにelse ifに入りません。
(なので、通常リストコントロールで上手くいってるのは謎です...)

あと、念のためですが、「if (条件を指定)」の条件で表示のデータを参照してる場合は、入れ物のデータに変更してください。
単なる行インデックス指定なら、そのままでよいです。

投稿2024/03/21 13:59

hiroki-o

総合スコア980

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HOOOO

2024/03/22 00:55

いつもご回答ありがとうございます。 ご指摘の通り、7行目と8行目の間に、「return;」を追加したら次の動作でelse ifの方に入ることができました。(再度通常リストコントロールでも確認しましたが、通常リストコントロールの方では上手く動作していました...謎です...) 「if (条件を指定)」の方は、単なる行インデックス指定のためそのままで実装できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.38%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問