ダイアログボックスの上にリストボックスを貼り付け、そのリストボックスを各行ごとに色を変て表示させることにトライしています。
なんとかかんとか調べて、
1.リストボックスのリソースで「Owner Draw=固定」に設定変更した。
2.そのリストボックスを持つクラスのウィンドウメッセージ
WM_DRAWITEM
WM_MEASUREITEM
にハンドラを追加した。
3.以下の様にハンドラを記述した。
void COwnerTestDlg::OnMeasureItem(int nIDCtl,
LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = 10/*1行の高さを設定*/;
CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
void COwnerTestDlg::OnDrawItem(int nIDCtl,
LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(0,0,0)/*背景の色*/);
pDC->SetBkColor(RGB(0,0,0)/*文字の後ろの色*/);
pDC->SetTextColor(RGB(255,255,255)/*文字の色*/);
pDC->TextOut(lpDrawItemStruct->rcItem.left,
lpDrawItemStruct->rcItem.top,
(char*)lpDrawItemStruct->itemData/*行に書かれた文字列*/);
}
4.CListBox* wp = (CListBox*)GetDlgItem(IDC_LIST1);
wp->InsertString(-1,"ADDED");
とやり、うまく表示されました。
ここまでは良かったのですが、
次に、4.のところを
char wbuf[256];
strcpy(wbuf,"ADDED");
wp->InsertString(-1,wbuf);
とやったら文字化け(?)の様な、ちゃんと表示してくれなくなってしまいました。何がいけないのでしょうか?
No.1ベストアンサー
- 回答日時:
char wbuf[256];
で取得されたメモリ領域が、4.で書いた関数を出た時点で
解放されてしまい、リストボックスが描画する時点
(OnDrawItem関数)では文字列が無くなってしまっている
ことが原因でしょう。
(見ることのできたソースからはオーナードローは無関係
に思えます)
ですので、リストボックスの項目を削除するまでの間は
mallocなどで保持しておく必要がある筈です。
この回答への補足
先日はご回答ありがとうございました。
教えていただいた方法でうまくリストボックスの
表示は行える様になったのですが、今日になって
このリストボックスのスクロールがちゃんと動いて
いないことに気がつきました。
リストボックスのリソースで垂直スクロールバーを
TRUEに設定しているだけなのですが、オーナー描画
した場合はスクロール処理も自分で記述しなければ
いけないのでしょうか?
そうかと思い、親ダイアログにOnVScrollハンドラ
を用意してもイベントが上がってきませんでした。
ご教授宜しくお願いします。
そうでした!煮詰まっていてまったくその事に
思いが及びませんでした。
明日にならないと試せないのですが
すぐにお礼が言いたくてお返事さしあげました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/06/15 14:11
- Excel(エクセル) エクセルの条件付き書式で*を使いたい 4 2022/05/13 16:49
- Excel(エクセル) エクセルの数式について教えてください。 7 2023/06/18 10:16
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Excel(エクセル) Excelのリストにある文字を含むセルを、複数の色で色付けしたいです 2 2022/08/11 17:39
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- PowerPoint(パワーポイント) PowerPointの箇条書きの既定のリストを変更する方法について 1 2022/12/15 18:41
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
ボタンのオーナードローについて
C言語・C++・C#
-
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
-
4
複数列リストコントロールについて
C言語・C++・C#
-
5
ClistBoxでオーナードローがよくわかりません。
C言語・C++・C#
-
6
リストビューで選択行の背景を変える
C言語・C++・C#
-
7
VC++ MFC CListCtrlで、ボタンのあるリストの作り方
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
str系関数を使わずに二つの文字...
-
配列をnビットシフトする
-
Win32APIでのエディットボック...
-
型変換
-
全角文字を含んだ文字の並びを...
-
c言語です。
-
下記のプログラムがコンパイラ...
-
c言語の問題の説明、各所ごとに
-
strlen関数と同じ働きをする関...
-
C言語で、入力された、文字列を...
-
double型の値をchar配列に変換...
-
C言語の入力した文字を反転させ...
-
enumの記述について。
-
c言語でソーベルフィルタが作り...
-
宣言による処理の重さ
-
文字列の中から必要なデータを...
-
CStringをwchar_tに変換したい
-
間接操作のレベルとは
-
'const char *' 型は 'char *' ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
c++ 文字列を入力して、一文字...
-
CStringをwchar_tに変換したい
-
switch文で文字を比較すること...
-
干支のプログラム
-
絶対パスからのファイル名の切...
-
3桁区切(コンマ)記号をつけ...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
【C言語】文字型と整数型の違い
おすすめ情報