アプリ版:「スタンプのみでお礼する」機能のリリースについて

ダイアログボックスの上にリストボックスを貼り付け、そのリストボックスを各行ごとに色を変て表示させることにトライしています。
なんとかかんとか調べて、

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);

とやったら文字化け(?)の様な、ちゃんと表示してくれなくなってしまいました。何がいけないのでしょうか?

A 回答 (1件)

char wbuf[256];


で取得されたメモリ領域が、4.で書いた関数を出た時点で
解放されてしまい、リストボックスが描画する時点
(OnDrawItem関数)では文字列が無くなってしまっている
ことが原因でしょう。
(見ることのできたソースからはオーナードローは無関係
に思えます)

ですので、リストボックスの項目を削除するまでの間は
mallocなどで保持しておく必要がある筈です。

この回答への補足

先日はご回答ありがとうございました。
教えていただいた方法でうまくリストボックスの
表示は行える様になったのですが、今日になって
このリストボックスのスクロールがちゃんと動いて
いないことに気がつきました。
リストボックスのリソースで垂直スクロールバーを
TRUEに設定しているだけなのですが、オーナー描画
した場合はスクロール処理も自分で記述しなければ
いけないのでしょうか?
そうかと思い、親ダイアログにOnVScrollハンドラ
を用意してもイベントが上がってきませんでした。
ご教授宜しくお願いします。

補足日時:2004/10/16 09:29
    • good
    • 0
この回答へのお礼

そうでした!煮詰まっていてまったくその事に
思いが及びませんでした。
明日にならないと試せないのですが
すぐにお礼が言いたくてお返事さしあげました。
ありがとうございました。

お礼日時:2004/10/06 22:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています