VC++2008 MFCでエディットコントロールの色を変更する方法

このQ&Aのポイント
  • VC++2008 MFC環境でダイアログに表示されるエディットコントロールの色を変更する方法について説明します。
  • OnCtlColor関数をオーバーライドすることで、エディットコントロールの色を変更することができます。ClassWizardを使用してOnCtlColor関数をオーバーライドする方法を紹介します。
  • クラスウィザードを使用せずにオーバーライドする場合は、コーディングレベルで指定することも可能です。具体的なコーディング方法についても解説します。
回答を見る
  • ベストアンサー

エディットコントロールの色の変更方法

環境はVC++2008 MFCです。 現在ダイアログにスタティックテキストの色を変更しようと 下記HPを参考にしていますが、 「OnCtlColor関数のオーバーライド ClassWizardを使って、OnCtlColor関数をオーバーライドさせる。 」 の方法がわかりません。 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_EDITcolor.html クラスビュー> ダイアログクラス選択> プロパティ> メッセージ を表示してみても何も表示されていませんし。 どのようにどのようにオーバーライドするのでしょうか? また、オーバーライドの方法をクラスウィザードを使用せず 後学の為、そのままコーディングレベルでご教授頂いたとしても とてもありがたいと思います。 宜しくお願いします。

  • 7u7
  • お礼率75% (63/83)

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

お示しのURLの内容は VC6.0以前を対象に書かれていると思われます VC2002以降ではClassWizardは廃止されております 代わりに プロパティウィンドウを使うようになっています ダイアログエディタで親ウィンドウ(Formやダイアログ)を選択しておいて プロパティウィンドウの『メッセージ』アイコンをクリックします # 右から2番目のアイコン 下のリストの中から WM_CTLCOLORを探します この右側のコンボボックスを開いて <追加> OnCtlColor をクリックします これで イベントハンドラのスケルトンを IDEが書いてくれます 変数の追加には クラスビューを使うか ヘッダーファイルを直接操作するかの方法になるでしょう クラスビューの場合 変数を作成するクラスを選択して 右クリック 追加 > 変数の追加 で表示されるダイアログに 必要事項を入力して OK といった具合です コードレベルでやる場合 メッセージマップを自分で書き、イベントハンドラを定義することになります メッセージマップは Cpp(コード実装ファイル)に BEGIN_MESSAGE_MAP(CSampleEdit01Dlg, CDialog)   ON_WM_PAINT() END_MESSAGE_MAP() といった記述があるはずです この BEGIN_MESSAGE_MAPとEND_MESSAGE_MAPの間にマクロを記述します 今回の場合なら BEGIN_MESSAGE_MAP(CSampleEdit01Dlg, CDialog)   ON_WM_PAINT()   ON_WM_CTLCOLOR() END_MESSAGE_MAP() となります 次に イベントハンドラの定義をします ヘッダーファイルに afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); として ハンドラ関数の定義を記述 CPPファイルに HBRUSH CSampleEdit01Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {   HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);   // TODO : ここで DC の属性を変更してください。   // この部分は追加   if ( nCtlColor == CTLCOLOR_EDIT ) {     pDC->SetBkColor( m_clrEdit );     return (HBRUSH)m_brudhEdit.GetSafeHandle();   }   // ここまで   // TODO : 既定値を使用したくない場合は別のブラシを返します。   return hbr; } といった具合でしょう # 字下げに全角スペースを使用しています # エラーなどが出る場合は置換してください

関連するQ&A

  • タスクトレイから出したメニューの実行について

    ここを参考に作りました。 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TaskTray.html <仕様> メインフォームはタスクバーにアプリが表示されないようにするため、非表示にした。 メインフォームの代わりにモードレスダイアログを主ウィンドウとした。 ダイアログクラスの中に、タスクトレイにアイコンを表示してメニューを出すコードを記述した。 このような場合において、 メニューの中のID_Myxxxの実装をクラスウィザードを使って行うとき、 ダイアログクラス内に書くと問題ありませんが、 クラスウィザードを使ってクラス名でCMainFrameを選んでもオブジェクトIDにID_Myxxxが表示されるので、CMainFrameクラスに書いてみましたが実行されません。 どうしてこうなるのですか? ************************** 非常に分かりにくくて済みません。 簡単に書くと、 ダイアログクラスでメニューを表示した場合、 メニューの実装をダイアログクラスに書くと問題ないですが、CMainFrameクラスに書くと実行されません。 どうしてなのでしょうか?

  • ユーザーインターフェイスの一番単純なスレッドを教えてください。

     こんにちわ。 いきなりですが、VC++でユーザーインターフェイススレッドを使って、 ボタンが1つあればいいだけの別スレッドダイアログを作らなくちゃならないの です。 CWndThreadクラスを使う。。。とかCWndThreadクラスの関数を オーバーライドしなくちゃならないらしいとか、MSDNのヘルプを見てそこまでは わかったのですが、実際、何をどう作っていいのか、途方にくれています。 サンプルを入手して、ソースを追っかけてみているのですが、MSDNのサンプルは 余計な機能とかがいっぱい入っていて、「本当に必要なコードはこれ!!」 というのがよくわかりません。 どなたか、すっごーく単純なスレッド作成、スレッド側の最低限コーディング を教えてください!!というか、助けてください!!!!

  • 【MFC】キャンセルボタン処理が実装できない

    VC++2005(MFC)にて下記サイトを参考にMDIアプリケーションを作成しています。 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MDI1.html 手順として、プロジェクトを新規作成し、MFC AppWizard(exe)で 新規プロジェクト名をMDITest1に設定し、アプリケーションの種類はMDI、 ビュークラスCMDITest1Viewの基本クラスはCFormViewとします。 リソースビューより、自動生成されたフォームの上に、 Buttonを配置し、イベントハンドラOnBnClickedButton1()内にて、 IDCANCEL()処理にて、ボタン押下時のウィンドウを閉じる処理を 実装したいのですが、コンパイルエラーが発生します。 基本クラスがCDialogクラスの場合は実装できるような気がするのですが。。 フォームビューだと、キャンセル処理は実装不可能なのでしょうか? また、不可能だとしたらウィンドウを閉じる処理はどのように実装すればよいのでしょうか? 解決策をご存知の方おられましたら、お手数ですがご教授宜しくお願い致します。

  • エディットボックスの背景の色変更方法

    C++初心者です。 どうしても、答えが出てこないことがあり質問致します。 環境 VC++Express2008 Win32API ダイアログベース ダイアログにResEditにエディットボックスを配置して あとは文字や背景の色替えをコーディングしてます。 文字は表示できるのですがその背景を色替えができません。 いろいろ、ネットで調べるも、ほとんどMFCのサンプルばかりで 意味がわかりません。 テストプログラムは以下です。 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { hInst = hInstance; //ダイアログボックス表示 DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc); return 0; } BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; HWND pWnd; PAINTSTRUCT ps; switch (msg) { case WM_INITDIALOG: break; case WM_PAINT: pWnd = GetDlgItem(hWnd, IDC_EDIT10); hdc = BeginPaint(pWnd,&ps); SetBkColor(hdc, RGB(0,255,0)); //←うまくいかない!! SetWindowText(pWnd, _T("aaa")); EndPaint(pWnd, &ps);       break;         以下省略 これで、テキスト"aaa"は表示されますが、背景は変わりません。 SetBkColorの使い方がまずいと思うのですが 僕のイメージ的にSetWindowTextと同じようにウィンドウハンドル指定で 背景を変える方法ってないのかなって素人ながら思うのですが、、わかりません。 あと、質問が変わってしまうのですが、ダイアログウィンドウに100個くらいのエディットボックスを 作成して、それらの背景色を替えて状態表示(点滅もあり)を行うようなものを作りたいのですが ナンセンスなのでしょうか? Rectangleで座標指定で100個の箱を作成する方がCPU負荷などもないのかなーって思います。 では、質問の内容がよくわからない点などあるかもしれませんが よろしくお願いいたします。     

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

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

  • 【VC++】クラスの追加方法について

    VC++の操作方法についての質問です。 現在、VC++2005を用いて、MFCダイアログベースアプリケーションを作成しています。 クラスの追加方法についての質問ですが、 「クラスビュー」⇒「プロジェクト」で右クリック⇒「追加」⇒「クラス」でウィザードに従って追加すると、 ウィザード内で基本クラスをコンボボックスより選択しなければならず、 この方法で追加すると、選択した基本クラスを継承する形でクラスが自動生成され、クラスビューにマップと基本型が追加されます。 現在作成に当たって参照しているサンプルプログラムでは、新たにクラスが定義されているようですが、 マップと基本型は生成されておらず、基本クラスも定義されていないのです。 どのように操作すれば、サンプルのように基本クラスを定義せず、 マップと基本型も追加されずに、クラスを追加できるのでしょうか? また補足ですが、クラスを追加した後は、別の自分で定義した親クラスを継承させるようにコードを変更したいと思っております。 お分かりの方おられましたら、お手数ですがご教授お願い致します。

  • VC++ (ADO) で Access の Yes/No 型の Select 文

    http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_ADO.html を参考にして VC++ 2005 .NET (ADO 接続)にて Access を操作しています。 Select 文にて Access の Yes/No 型を判定したいのですが、WHERE 句を どのように書けばよいのかわかりません。 WHERE field_name = Yes (または 'Yes', 1 など) で書いてみているのですがうまくいきません。 どのように記述すればよいのかご存知の方がいらっしゃいましたらご教示 願えないでしょうか。 よろしくお願いいたします。

  • アプリ終了時にタスクトレイからアイコンを消すには?

    以下を参考にタスクトレイにアイコンを追加するようにしました。 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TaskTray.html しかしながら、プログラムを終了させてもタスクトレイにアイコンが残っており、マウスポインタをアイコンに近づけるとようやくアイコンが消えます。 一般的なアプリのようにプログラム終了時に即アイコンが消えるようにするにはどうすれば良いのですか? <環境> WIN98 VC++6.0 MFC 

  • VC++のエディットボックスの非表示

    VC++で、ダイアログを作りました。 エディットボックスを置いているのですが、 このエディットボックスは始めは非表示(入力を受け付けない)にするため、 このエディットボックスのプロパティにある "Disable"をtrueにして"Visible"もtrueにしました。 そこまではよかったのですが、 「入力」ボタンを押すと、エディットボックスが白く表示され、入力を受け付けるというようにしたいのですが、 エディットボックスのプロパティを変更する関数というのはあるのでしょうか? いろいろ検索などをしているのですが、方法がわかりません。よろしくお願いします。

  • オーバーライドしたvalidateメソッドの結果をダイアログに表示する

    オーバーライドしたvalidateメソッドの結果をダイアログに表示する方法 質問させてください。 strutsのvalidateメソッドをオーバーライドして入力フォームの値をチェックするようにしました。 このvalidateメソッドの結果をダイアログに表示するにはどのようにすれば良いでしょうか? validation.xmlとオーバーライド前のvalidateメソッドを使用する場合は、JavaScriptを使用すれば可能のようですが、オーバーライドした関数には対応していないようです。(参考http://www.itmedia.co.jp/enterprise/0311/28/epn02_15.html) どなたかお知恵をお貸しください。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう