0

CColorbuttonクラス関数を使用してボタンに色を付けようとしていますsetcolor。ボタンのメンバー変数を宣言したときは正常に動作していますが、ハンドルを直接取得すると動作しませんGetDlgItem(IDC_BUTTON1)。誰でもこれの解決策を教えてもらえますか?

CColorButton* pWnd = (CColorButton*)GetDlgItem(id+i); pWnd->SetColor(RGB(0,0,0),RGB(200, 153, 204));

4

2 に答える 2

1

まず第一に、ボタン コントロールの変数を宣言しないと実行できません!

なんで?ウィンドウ変数と DDX-Control の使用または CWNd::SubclassWindow の使用が、MFC でサブクラス化が機能する方法です。サブクラス化しないと、メッセージは CCOlorButton で使用されるコードによって処理されません。

はい、GetDlgItem を使用して CColorButton へのハード キャストを行うことができますが、これは非常に危険です。なんで?取得するウィンドウ オブジェクトは、追加のメンバー変数を持たない単なる一時的な CWnd オブジェクトです。追加のデータ メンバーを使用する CColorButton の特定のメンバー関数を呼び出すと、メモリ/ヒープ/スタックの内容が破壊される可能性があります。

MFC コントロール クラスでは、GetDlgItem が返すポインターを適切にキャストするために、メモリ内のどこかに特定のオブジェクトが常に必要です。

メンバー関数がある場合、キャストは必要ありません。(その他の理由で) CWnd ポインターをキャストする必要がある場合は、STATIC_DOWNCAST/DYNAMIC_DOWNCAST を使用して、何か問題があるときに ASSERT を取得することをお勧めします。

于 2013-11-11T13:20:58.643 に答える
0

CColorButton 変数を宣言して適切に初期化しない場合、プログラムには CColorButton オブジェクトがありません。したがって、存在しないものを呼び出しています。あなたはこれの解決策を求めましたが、あなたはすでに解決策を知っています!

于 2013-11-11T14:22:30.133 に答える