CColorbutton
クラス関数を使用してボタンに色を付けようとしていますsetcolor
。ボタンのメンバー変数を宣言したときは正常に動作していますが、ハンドルを直接取得すると動作しませんGetDlgItem(IDC_BUTTON1)
。誰でもこれの解決策を教えてもらえますか?
CColorButton* pWnd = (CColorButton*)GetDlgItem(id+i); pWnd->SetColor(RGB(0,0,0),RGB(200, 153, 204));
CColorbutton
クラス関数を使用してボタンに色を付けようとしていますsetcolor
。ボタンのメンバー変数を宣言したときは正常に動作していますが、ハンドルを直接取得すると動作しませんGetDlgItem(IDC_BUTTON1)
。誰でもこれの解決策を教えてもらえますか?
CColorButton* pWnd = (CColorButton*)GetDlgItem(id+i); pWnd->SetColor(RGB(0,0,0),RGB(200, 153, 204));
まず第一に、ボタン コントロールの変数を宣言しないと実行できません!
なんで?ウィンドウ変数と DDX-Control の使用または CWNd::SubclassWindow の使用が、MFC でサブクラス化が機能する方法です。サブクラス化しないと、メッセージは CCOlorButton で使用されるコードによって処理されません。
はい、GetDlgItem を使用して CColorButton へのハード キャストを行うことができますが、これは非常に危険です。なんで?取得するウィンドウ オブジェクトは、追加のメンバー変数を持たない単なる一時的な CWnd オブジェクトです。追加のデータ メンバーを使用する CColorButton の特定のメンバー関数を呼び出すと、メモリ/ヒープ/スタックの内容が破壊される可能性があります。
MFC コントロール クラスでは、GetDlgItem が返すポインターを適切にキャストするために、メモリ内のどこかに特定のオブジェクトが常に必要です。
メンバー関数がある場合、キャストは必要ありません。(その他の理由で) CWnd ポインターをキャストする必要がある場合は、STATIC_DOWNCAST/DYNAMIC_DOWNCAST を使用して、何か問題があるときに ASSERT を取得することをお勧めします。
CColorButton 変数を宣言して適切に初期化しない場合、プログラムには CColorButton オブジェクトがありません。したがって、存在しないものを呼び出しています。あなたはこれの解決策を求めましたが、あなたはすでに解決策を知っています!