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

質問
-
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.1、Visual Studio 2013 Pro.です。
以上、よろしくお願いします。
- 編集済み fghck854 2015年2月28日 20:40 誤字修正
回答
-
結果的にそれでかまいません。
ただ、この疑問に遭遇すると言うことは、C++ でプログラムを作っていく上で知識が足りていない部分があるのかもしれません。
基底クラスとは何か、基底クラスを変えると言うことはどういうことかをこの機会に学んでみてください。
また、「(タイトルバーの)色が戻らない」という表現をされていますが、開発者の間では「アクティブになっていない」「フォーカスが戻らない」などの表現をとります。ご参考までに。- 編集済み AzuleanMVP, Moderator 2015年3月1日 8:39
- 回答としてマーク fghck854 2015年3月1日 8:57
すべての返信
-
手元でも再現を確認しました。
海外の下記スレッドによると、メインのダイアログの基底クラスを CDialogEx から CDialog にすることで回避できるということがわかりました。
私も手元で試したところ、現象を回避できるようです。http://www.experts-exchange.com/Programming/Microsoft_Development/Q_28232466.html
-
Azulean 様
早速のご回答ありがとうございます。
「基底クラスを CDialogEx から CDialogにする」とは具体的にどうするのか、はじめてで良くわからなかったのですが、とりあえず、fileDiaTest2Dlg.cppのコードで「CDialogEx」をすべて「CDialog」に置き換えたら、ダイアログボックスの色が正常に表示されるようになりました。
基底クラスをCDialogにするのはこの操作でよいのでしょうか。
これで良ければ解決ということになりますが、もし他に何かソースコードの変更とかが必要であれば、お手数ですがご教示いただきたく、よろしくお願いします。
-
結果的にそれでかまいません。
ただ、この疑問に遭遇すると言うことは、C++ でプログラムを作っていく上で知識が足りていない部分があるのかもしれません。
基底クラスとは何か、基底クラスを変えると言うことはどういうことかをこの機会に学んでみてください。
また、「(タイトルバーの)色が戻らない」という表現をされていますが、開発者の間では「アクティブになっていない」「フォーカスが戻らない」などの表現をとります。ご参考までに。- 編集済み AzuleanMVP, Moderator 2015年3月1日 8:39
- 回答としてマーク fghck854 2015年3月1日 8:57