コマンドボタンの色を変える

このQ&Aのポイント
  • コマンドボタンの色を変える方法について詳しく解説します。
  • CButtonクラスの派生クラスを作成し、ボタンの描画色を変更する方法を紹介します。
  • Visual C++6.0 SP6およびWindows XP Proで、コマンドボタンの色を変える際に発生するエラーについての助言をお願いします。
回答を見る
  • ベストアンサー

コマンドボタンの色を変える

コマンドボタンの色を変えたくて、色々なサイトを検索し、物凄く丁寧に記載してあるサイトに出会い、その通りにテストプログラムを作成したら、思い通りに色が変わりました。 <CButtonクラスの派生クラスを作り,動的サブクラス化を実装することで,ボタンの描画色を変更していく> ソースを載せようとしましたが、全角2000字を超えてしまいました。 メインのダイアログではコマンドボタンが正常に黒色に変わったのですが、モーダルダイアログのコマンドボタンの色を変えようとしたら、  Debug Assertion Failed!  Program: ・・・  File: wincore.cpp  Line: 321 のエラーが発生します。 何かちょっとした事だとは思いますが、解決出来なくて困っています。どなたか助言をお願いします。 Visual C++6.0 SP6 Windows XP Pro よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

この場合は、m_colBtnのインスタンスがすでに作成されているのに、 m_colBtn.AutoLoadを呼び出したからですね。 m_colBtnに対して、DDX_~とかを呼び出していたりしませんか?

taka077
質問者

お礼

出来ました!!ありがとうございます。 DDX_~で呼び出していました。 参考にしたサイトへ辿り着くまでに、色々と試してる際、コントロールメンバ変数を設定していました。 フォントサイズも変えたいので、GetDlgItem()を使ってフォントサイズを変更する事が出来ました。 ちょっとボタンの装飾はあきらめようかとも思ってましたので、助かりました。 ありがとうございます。

その他の回答 (2)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

>ASSERT(FromHandlePermanent(hWndNew) == NULL); その次の行に、 // must not already be in permanent map って書いてないですか?書いてあるとおりです。 CWnd::Attachを直接呼び出していないなら、「コールスタック」を見て、 自分が作ったコードに達するまでさかのぼってみましょう。

taka077
質問者

お礼

回答、ありがとうございます。 _/_/_/ モーダレスダイアログの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()までのソースを見ますが、やはりおかしい所が分かりません。 再度、助言をお願いします。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

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

taka077
質問者

お礼

回答、ありがとうございます。 「wincore.cpp」の321行目は以下のように記述されていましたが、勉強不足の為、よく分かりません。申し訳ありませんが、さらなる助言をお願いします。 ASSERT(FromHandlePermanent(hWndNew) == NULL);

関連するQ&A

  • Debug Assertion Failed

    パソコンを今朝起ちあげたら Debug Assertion Failed Program: \controlhandler.cpp Line: 102 visual C++ documentation on assert と出ました。 以来デスクトップのタスクバーやスタートボタンのデザインが変わっていたり、 インターネットにアクセスできなくなったりと、困っています。 パソコン初心者です。 どうか助言を頂けたら幸いです。

  • ダイアログのボタンコントロールで困っています

    winプログラムを始めて間がない初心者ですが、よろしくお願いします。 ダイアログ上に、ビットマップ画像を使ってボタンを作成するために、 MFCのCButtonのオーナー描画 や CBitmapButtonを使ってボタンコントロールを作成したところ、 ボタンの反応速度が遅く、連続でクリックが出来なくて、困っています。 反応速度の早いボタンコントロールを作成するには、どうすれば良いのでしょうか?

  • CColorDialogの拡張について

    始めまして。質問させて下さい。 VC++ 2005 MFCで開発しております。 CColorDialogのサブクラスを作成しています。 ダイアログ上にあるコントロールのVisibleを変更させようと思い、 サブクラスのOnInitDialogで CButton *pBtnOK = ( CButton* )GetDlgItem( IDOK ); CButton *pBtnCancel = ( CButton* )GetDlgItem( IDCANCEL ); if( pBtnOK != NULL ){ pBtnOK->ShowWindow( SW_HIDE ); } if( pBtnCancel != NULL ){ pBtnCancel->ShowWindow( SW_HIDE ); } としています。 「色の作成」ボタンのも同様の処理をしたいのですが、 コントロールIDがわからないため実装できません。 IDをご存じの方はいますでしょうか? また、別の方法等ございましたらご教授お願い致します。

  • MFCでのボタン配置

    ダイアログではなく、直接Windowにボタンを貼り付けるために、AppWizaerdを使用して、MyAppというプロジェクトをつくり、MyAppクラスのヘッダに CButton mybutton を定義し、cppファイルのInitInstance関数内の m_pMainWnd->UpdateWindow();の下に、以下のように記述したところ、 mybutton.Create(_T("OK"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,100), m_pMainWnd, 1); ボタンは表示されるのですが、押しても凹んでくれません。どうしてなのでしょうか?? 環境はWinXP VisualStudio.Net2003です。

  • Word2003のユーザー設定ツールバーにボタンを作りたい

    Word2003でユーザー設定ツールバーに以下の2つのボタンを追加したいと思います。 ・[色の設定]ダイアログボックスの[ユーザー設定]タブを表示するボタン (図形を選択し、[図形描画]ツールバーの[塗りつぶしの色]ボタンをクリック、[その他]をクリックして表示されるダイアログボックスの[その他]タブをクリック) ・[塗りつぶしの効果]ダイアログボックスの[グラデーション]タブを表示するボタン (図形を選択し、[図形描画]ツールバーの[塗りつぶしの色]ボタンをクリック、[塗りつぶし効果]をクリックして表示されるダイアログボックス) どちらもWord2007では、クイックアクセスツールバーに簡単に登録できたのですが、Word2003ではすべてのコマンドを表示して登録しようとすると、コマンド名が英語になっていてわかりません。 仕事でよく使うダイアログボックスなので、すぐに表示したいのです。 教えていただけると大変助かります。 よろしくお願いします。

  • ピクチャーコントロールへの描画方法について

    お世話になります、fujitomoです。 現在、Visual Studio2005にてC++のダイアログベースのアプリケーションを作成しており、行き詰った箇所があったため質問させて頂きました。 アプリケーションの内容としては 現在、アプリケーションで、ダイアログベース上にピクチャーコントロールを2つ設置し、それぞれに波形を描画させています。 ピクチャーコントロールへの波形の描画にはメモリデバイスコンテキストを使い、それぞれ波形描画用のCStatic派生クラスを作成し、そのクラスを SubclassDlgItem でメインダイアダイアログのサブクラスとし、描画間隔として、それぞれの描画クラス内で SetTimer(1,10,NULL) でタイマーイベントを起こし、メモリデバイスコンテキストの描画更新をしています。 ここで質問させていただきたい事なのですが、 2つのピクチャーコントロールのうち、1つのピクチャーコントロールへのみ波形描画を実行させているときはピクチャーコントロールの端から端まで描画が約7秒かかるのに対し、 2つのピクチャーコントロールの描画を同時に実行させた場合には端から端までで約11秒もかかってしまいます。 これを何とか、1つのピクチャーコントロールへの描画時間と同じ時間まで早く出来ればなと思っているのですが、どの様に工夫すれば時間短縮をさせることが出来ますでしょうか? 2つのクラスでそれぞれ10msのタイマーを動かしているのが問題なのかと思い、メインダイアログで10msのタイマーイベントを発生させ、それぞれの描画クラスに描画更新のメッセージを送信させるようにコードを変更してみたのですが、やはり同じ結果となりました。 開発環境は Widows CE 6.0 Visual Studio 2005 です。 ご意見、ご回答をお待ちしております。よろしくお願い致します。

  • ボタンの配置を変更したい

    VC++でプログラミングしています。 MFC AppWizard(exe) でダイアログベースで造っています。 やりたいことは以下です。 ・設定ファイルに表示位置(座標)が書いてあり、ダイアログの初期化時に 設定ファイルを読んで、指定された位置にボタンを表示する。 私の案としては以下のものがあります。 <案1> 予めボタンを貼り付けて造り、EXE起動時に移動させる。 ただし、移動させる関数があるかは不明。 調べましたが、今のところ見つかっていません。 <案2> CButtonクラスのメンバを使用して、ボタンを表示する。 試しに以下のようなコードでやってみましたが、上手くいきませんでした。 使い方がわからず、試行錯誤しながらやってます。 CButton testButton; void CTestGamenDlg::OnButton1() { RECT Rect; Rect.left = 100; Rect.top = 100; Rect.right = 200; Rect.bottom = 200; testButton.Create("test", BS_PUSHBUTTON, Rect, this, 100); } 案1、2についての指摘、アドバイス、その他の案などありましたら 宜しくお願いします。 また、簡単なサンプルコードがあると助かります。

  • ユーザーフォームのコマンドボタンをマクロで操作したい

    Excel97でユーザーフォームを出しながらセルに入力できるようにしたいので、 http://www.ap.wakwak.com/~miko/Excel_Note/11-01_userform.htm#11-01-13 このサイトに書かれているように、ユーザーフォームにコマンドボタンを作成して、 ボタンのコードを  Private Sub CommandButton1_Click()   Application.GetOpenFilename  End Sub とし、「ファイルを開く」ダイアログを表示させてキャンセルするようにしたのですが、 この「コマンドボタンをクリックしてファイルを開くダイアログをキャンセルする」操作は 自動化できるのでしょうか? パソコンに慣れていない人用に作っているものですので、できるだけ使う人の操作を 少なくしたいのです。 ブックを開いた時にユーザーフォームを出すところまではできたのですが、 ユーザーフォームのコマンドボタンを自動的にクリックしてダイアログを キャンセルする方法がわかりません。 ご存知の方、どうぞよろしくご教授お願いいたします。 使用しているのは、 OS:Windows98SE ソフト:Excel97 です。

  • ボタンの表示の色、フォントを変更したい

    VC++でプログラミングしています。 MFCのダイアログベースのEXEを造っています。 ダイアログにはボタンとエディットボックスを貼り付けています。 私がやりたいのは以下のことです。 ・ボタンの色を設定したい ・ボタン、エディットボックスに表示する文字の色を設定したい ・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい プロパティでサイズ変更すると全体に反映されてしまうので、個々の コントロールについて制御したいと思っています。 ヘルプで調べて、それらしい関数を見つけるのですが使い方がわかりません。 VCを始めたばかりで、クラスの理解がまだ浅いです。。。 関数の説明は理解できても、「じゃあ、コードはどう書くの?」という状態です。 「○○ は ×× のメンバではありません」と、よく怒られてます。。。 識者の方、ご教授願います。 コードがどうなるのか知りたいので、簡単なサンプルコードがあると助かります。 また、質問ではないのですが、「この関数は○○をする」というのではなく、 「○○をするにはこの関数を使う」という様に調べられる、お勧めの書籍、 Webなどがありましたら教えてください。 今後の勉強に役立てたいと思っています。

  • 98SEからXPproにして起きたエクスプローラーでのエラー

    カテゴリをOS、XPのほうに質問しようかと思いましたがエラーにc++と出ていたのでこちらで質問させていただきます。 エクスプローラーを開いて、CドライブやDドライブの上で右クリックをすると Microsoft Visual C++ Debug Library     Debug Assertion Failed!     Program: C:WINDOWS\explorer.exe     File: dbgheap.c     Line: 1011     Expression: _CrtIsValidHeapPointer(p UserData)     For information on how your program can cause an assertion     failure,see the Visual C++ documentation on asserts.     (Press Retry to debug the application)    中止(A)  再試行(R)  無視(I) 上記のようなダイアログでエラー表示されます。(中止、再試行、無視はボタンです) 中止と再試行を押すとすぐに強制終了。再試行の場合はエラーをマイクロソフトに送信しますか?というものが表示されます。 無視の場合は2回繰り返すと以下のようなダイアログが出ます。 Microsoft Visual C++ Debug Library     Debug Error! Program: C:\WINDOWS\explorer.exe DAMAGE: before Free block (#1835662845) at 0x0589356. (Press Retry to debug the application)    中止(A)  再試行(R)  無視(I) このエラー後は再起動しない限りツールバーの「ファイル」「編集」をクリックしても同じエラーが表示されるようになってしまいます。 何か解決策がありましたらよろしくお願いします。

専門家に質問してみよう