ListBoxのDrawItemコードが勝手に消えてしまう?

[戻る]
きゅあ 2011/02/16(水) 09:23:46
【環境】
VC++2005 MFC未使用
WindowsXP SP3

ListBoxコントロールを使ったWindowsアプリケーションを開発しております。

フォームをデザイナー画面で編集すると
ヘッダーファイルのコントロールプロパティ部分のコードが自動生成されますが、
ListBoxとは関係のない、他のコントロールのサイズを修正しただけで、
DrawItemの行が消えてしまうのです。

ヘッダーファイルコード例:
------------------------------------------------------------------------------
// listBoxHogeHoge
// 
this->listBoxHogeHoge->DrawMode = 
System::Windows::Forms::DrawMode::OwnerDrawFixed;
    (中略)
this->listBoxHogeHoge->Name = L"listBoxHogeHoge";
this->listBoxHogeHoge->Size = System::Drawing::Size(350, 158);
this->listBoxHogeHoge->TabIndex = 9;
this->listBoxHogeHoge->DrawItem += gcnew DrawItemEventHandler(this, 
&FHoge::listBoxHogeHoge_DrawItem);
↑この行が消えてしまう
------------------------------------------------------------------------------

フォームを少しでも修正するたびに消えてしまうので、
そのたびに消えてしまう行を追加しているという面倒な状況です。
このDrawItemの行がないと、当然のことですがListBoxにアイテムが表示されないです。

このような現象でお悩みの方は他にもいらっしゃるでしょうか?
ご存知の方、対策を教えていただきたくお願いします。

PATIO 2011/02/16(水) 10:38:54
そもそも触ってはいけないところにコードを書いているように見えますが、
コードを書いている場所はそこが正解なのでしょうか?

通常ならFormLoadの中で書くべき内容に見えるのですが。

きゅあ 2011/02/16(水) 13:36:53
[[解決]]
PATIOさん、ありがとうございます。

まず、質問の際の記載が不十分でしたが、
C++/CLI(.NET)での開発環境です。
情報不足で申し訳ありません。

PATIOさんのレスを拝見して、
ご指摘のDrawItemイベントハンドラの記述が
本当に正しいかどうかを観点に調査しました。

その結果、
コントロールのプロパティ画面を開く→稲妻ボタンクリックでイベント一覧表示で、
問題のあったListBoxでは、
DrawItemがイベントとして割り当てられていなかったのが原因であることが分かりまし
た。

イベントして割り当てられていないので、
フォームを修正してヘッダーが書き換わるたびに、
IDEが忠実にDrawItemの部分を消していたようです。

他の開発者が新規作成した部分で、今回自分が修正を担当しております。
恐らく、どこか同じ機能のヘッダーから問題のあったヘッダーへ、
コピペでもしたのではないか??と推測しています。

ListBoxのプロパティ画面→稲妻ボタンクリックでイベント一覧を開き、
DrawItemの右側の空欄をダブルクリックすると、
this->listBoxHogeHoge->DrawItem += gcnew DrawItemEventHandler(this, 
&FHoge::listBoxHogeHoge_DrawItem);
が自動で生成されました。
これで解決できました。


>そもそも触ってはいけないところにコードを書いているように見えますが、
>コードを書いている場所はそこが正解なのでしょうか?

「触ってはいけないところ」は、
PATIOさんのおっしゃるとおりと認識しています。

しかし、フォームデザイナーで追加・編集したプロパティやイベントが
ヘッダーファイルに自動で書き込まれるため、
正解かどうかと言われれば...
「コードの記述箇所としては正解だけど、開発者は自分で書かない部分」
というのが答えでしょうか。

かなり単純なミスでしたが、
PATIOさんからのレスがきっかけで、
切り口を変えて調査した結果と思っています。

ありがとうございます。

古いスレッドには追加発言できません。