予期しない動作をする Visual Studio 2012 (Professional) プロジェクトを作成しました。ダイアログが 1 つしかない場合、最初に TAB または ALT を押した後を除いて、それらを使用するときにコントロールにフォーカス四角形 (点線の境界線) が表示されません。プライマリ ダイアログの前に別のダイアログを (スプラッシュ スクリーンとして) ロードしようとすると、メイン (2 番目) のダイアログにフォーカス ドット ボーダーが表示されます。これはなぜですか? また、これを防ぐにはどうすればよいですか?
私の唯一の推測では、ENTER または ESC を押すと、TAB または ALT を押すのと同じ種類の動作が発生し、ユーザーがスプラッシュ スクリーンを閉じるには ENTER または ESC を押す必要があるため、常にその効果が表示されます。コントロールからフォーカスを取り除く方法があったと思う人もいるかもしれませんが、それは簡単ではないようです。コントロールにフォーカスを簡単に設定できますが、一般的にそれを削除するだけではありません。
サンプルコードに興味のある方へ:
プロジェクトのコード全体を表示することもできますが、正直に自分でテストする方が簡単です。新しい VC++ プロジェクトを作成し、[MFC アプリケーション] を [ダイアログ ベース] に設定して、[完了] を選択します。リソース ビューで、[ダイアログ] を右クリックし、[ダイアログの挿入] をクリックします。メイン ウィンドウとは明確に異なるものにし、フォーカスできるコントロールを少なくとも 1 つ追加します。最後に、プライマリ .cpp ファイルの上部近くに、"// The one and only"... というテキストがあります。その下には、プライマリ アプリケーション オブジェクトを宣言する行があります。その行の下に新しいダイアログ クラスを作成し(「スプラッシュ スクリーン」については、下に私のものがあります*)、プライマリ アプリケーションの 内で、次のInitInstance()
ような部分のすぐ上にスプラッシュ スクリーンをロードするコードを挿入します。
CDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
スプラッシュ画面を表示するために使用したコードは次のとおりです。
CSplashDlg dlgSplash;
dlgSplash.DoModal();
*スプラッシュダイアログの私のコード:
更新: Enter キーを押す代わりに最初にダイアログをクリックできるようにコードを変更しました (実際、ある時点で pretranslatemsg() をオーバーライドし、ESC と ENTER をキャッチします。これが私の最新のコードです:
class CSplashDlg : public CDialogEx
{
public:
CSplashDlg();
enum { IDD = IDD_SPLASH };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};
CSplashDlg::CSplashDlg() : CDialogEx(CSplashDlg::IDD) {}
void CSplashDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); }
BEGIN_MESSAGE_MAP(CSplashDlg, CDialogEx)
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
void CSplashDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
EndDialog(1);
CDialogEx::OnLButtonUp(nFlags, point);
}