none
MFCでダイアログボックスのタイトルバーの色がもとに戻りません RRS feed

  • 質問

  • H27年3月1日

    MFCでダイアログボックスのタイトルバーの色がもとに戻りません

    Visual C++ MFCでダイアログベースのプログラムから、ファイルを開くダイアログを表示すると、ファイルを開くダイアログを閉じても、もとのメインのダイアログボックスのタイトルバーを含むウィンドウ枠の色が灰色になったまま、もとの青色に戻りません

    当方は、MFCについては初心者です。よろしくお願いします。

    1.      当方で行ったこと

    1.1 新規プロジェクトの作成

    テンプレートはMFCアプリケーション、ダイアログ形式で作成しました。

    1.2 ダイアログリソースの作成

    フォームに「開く」ボタン1個のみを配置しました。

    1.3 プログラム

    「開く」ボタンでファイルを開くダイアログを表示するようにしました。入門書に載っていたプログラムを持ってきて、自分なりにテスト用に簡略化しました。

    詳細は3項のプログラムリストの通りです。

    2.      プログラムの動作

    (1)「開く」ボタンを押すと「ファイルを開くダイアログ」が表示されて、メインのダイアログのタイトルバーの色は青から灰色に変わります。

    (2)「ファイルを開くダイアログ」で開くファイルを選択して「開く」ボタンを押すと、メインのダイアログが再度表示されますが、タイトルバーを含むウィンドウ枠の色が、灰色になったままもとの青色に戻りません。

    (3)タイトルバーの文字は、プログラムしたとおり、選択したファイル名が表示されます。

    (4)「ファイルを開くダイアログ」の代わりにメッセージボックスを表示すると、メッセージボックスを終了したとき、メインのダイアログの色が青にもどります。

    3項のプログラムで最後の行の注釈//をはずすと、メッセージボックスが表示され、「OK」を押すと、メインのダイアログの色がもとに戻ります。

    3.      プログラムリスト

    void CfileDiaTest2Dlg::OnBnClickedButton1()

    {

            // TODO: ここにコントロール通知ハンドラー コードを追加します。

            CString filename;

            CFileDialog myDLG(TRUE, L"txt", L"*.txt", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

                                                    L"テキスト(*.txt)|*.txt||");

            if (myDLG.DoModal() == IDOK){

                    filename = myDLG.GetPathName();

                    SetWindowText(filename);

                    //AfxMessageBox(L"ダイアログテスト");

            }

    }

    4.      開発環境

    Windows 8.1Visual Studio 2013 Pro.です。

    以上、よろしくお願いします。



    • 編集済み fghck854 2015年2月28日 20:40 誤字修正
    2015年2月28日 20:13

回答

  • 結果的にそれでかまいません。

    ただ、この疑問に遭遇すると言うことは、C++ でプログラムを作っていく上で知識が足りていない部分があるのかもしれません。
    基底クラスとは何か、基底クラスを変えると言うことはどういうことかをこの機会に学んでみてください。


    また、「(タイトルバーの)色が戻らない」という表現をされていますが、開発者の間では「アクティブになっていない」「フォーカスが戻らない」などの表現をとります。ご参考までに。
    2015年3月1日 8:38
    モデレータ

すべての返信

  • 手元でも再現を確認しました。
    海外の下記スレッドによると、メインのダイアログの基底クラスを CDialogEx から CDialog にすることで回避できるということがわかりました。
    私も手元で試したところ、現象を回避できるようです。

    http://www.experts-exchange.com/Programming/Microsoft_Development/Q_28232466.html

    因果関係などは不明ですが、参考までに共有しておきます。

    2015年3月1日 6:51
    モデレータ
  • Azulean

    早速のご回答ありがとうございます。

    基底クラスを CDialogEx から CDialogにする」とは具体的にどうするのか、はじめてで良くわからなかったのですが、とりあえず、fileDiaTest2Dlg.cppのコードで「CDialogEx」をすべて「CDialog」に置き換えたら、ダイアログボックスの色が正常に表示されるようになりました。

    基底クラスをCDialogにするのはこの操作でよいのでしょうか。

    これで良ければ解決ということになりますが、もし他に何かソースコードの変更とかが必要であれば、お手数ですがご教示いただきたく、よろしくお願いします。

    2015年3月1日 8:21
  • 結果的にそれでかまいません。

    ただ、この疑問に遭遇すると言うことは、C++ でプログラムを作っていく上で知識が足りていない部分があるのかもしれません。
    基底クラスとは何か、基底クラスを変えると言うことはどういうことかをこの機会に学んでみてください。


    また、「(タイトルバーの)色が戻らない」という表現をされていますが、開発者の間では「アクティブになっていない」「フォーカスが戻らない」などの表現をとります。ご参考までに。
    2015年3月1日 8:38
    モデレータ
  • Azulean

    この度は、海外の英文サイトまで調べていただき、また勉強不足な私に、丁寧に説明いただき、大変ありがとうございました。

    クラスの継承などについて、ある程度わかっていたつもりなのですが、これまでMFCのプログラムで、クラスを継承したり、基底クラスを変更したりする機会がなかったため、理解が不足していた次第です。

    ご指摘のように、これを機会に少し勉強したいと思います。今回は本当にありがとうございました。

    2015年3月1日 8:58