プロが教えるわが家の防犯対策術!

コマンドボタンの色を変えたくて、色々なサイトを検索し、物凄く丁寧に記載してあるサイトに出会い、その通りにテストプログラムを作成したら、思い通りに色が変わりました。

<CButtonクラスの派生クラスを作り,動的サブクラス化を実装することで,ボタンの描画色を変更していく>

ソースを載せようとしましたが、全角2000字を超えてしまいました。

メインのダイアログではコマンドボタンが正常に黒色に変わったのですが、モーダルダイアログのコマンドボタンの色を変えようとしたら、
 Debug Assertion Failed!
 Program: ・・・
 File: wincore.cpp
 Line: 321
のエラーが発生します。
何かちょっとした事だとは思いますが、解決出来なくて困っています。どなたか助言をお願いします。

Visual C++6.0 SP6
Windows XP Pro

よろしくお願いします。

A 回答 (3件)

せっかくアサーションが出ているのですから、wincore.cppの321行目を見てみてはいかがでしょうか?

    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

「wincore.cpp」の321行目は以下のように記述されていましたが、勉強不足の為、よく分かりません。申し訳ありませんが、さらなる助言をお願いします。

ASSERT(FromHandlePermanent(hWndNew) == NULL);

お礼日時:2008/11/25 08:58

>ASSERT(FromHandlePermanent(hWndNew) == NULL);


その次の行に、
// must not already be in permanent map
って書いてないですか?書いてあるとおりです。

CWnd::Attachを直接呼び出していないなら、「コールスタック」を見て、
自分が作ったコードに達するまでさかのぼってみましょう。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

_/_/_/ モーダレスダイアログのOnInitDialog() _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
m_colBtn.AutoLoad(IDC_BTN_TAKEOUT, this);

_/_/_/ CButtonクラスの派生クラスを作り,動的サブクラス化している所 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
// ボタンをCColorButtonアタッチにする
BOOL CColorButton::AutoLoad(const UINT nID, CWnd* pParent)
{
// ダイナミックサブクラス化
if (!SubclassDlgItem(nID, pParent))
return false;

return true;
}

SubclassDlgItem()の中でSubclassWindow()を経由してAttach()を呼んでいるところまでは追っかけましたが、
直訳「永久の地図ですでにあってはいけません」の意味がよく分かりません。
分からないなりにAttach()までのソースを見ますが、やはりおかしい所が分かりません。

再度、助言をお願いします。

お礼日時:2008/11/26 12:07

この場合は、m_colBtnのインスタンスがすでに作成されているのに、


m_colBtn.AutoLoadを呼び出したからですね。

m_colBtnに対して、DDX_~とかを呼び出していたりしませんか?
    • good
    • 0
この回答へのお礼

出来ました!!ありがとうございます。

DDX_~で呼び出していました。
参考にしたサイトへ辿り着くまでに、色々と試してる際、コントロールメンバ変数を設定していました。
フォントサイズも変えたいので、GetDlgItem()を使ってフォントサイズを変更する事が出来ました。

ちょっとボタンの装飾はあきらめようかとも思ってましたので、助かりました。
ありがとうございます。

お礼日時:2008/11/26 14:20

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