我制作了一个行为异常的 Visual Studio 2012 (Professional) 项目。当我只有一个对话框时,当我使用它们时,控件上不会出现焦点矩形(虚线边框),除非在我第一次按 TAB 或 ALT 之后。当我尝试在主对话框(作为启动屏幕)之前加载另一个对话框时,焦点虚线边框确实出现在主(第二个)对话框上,当窗口加载时它们已经显示在第一个项目上。为什么会这样,我该如何防止这种情况发生?
我唯一的猜测是按 ENTER 或 ESC 会导致与按 TAB 或 ALT 相同的行为,我总是看到效果,因为用户必须按 ENTER 或 ESC 才能关闭启动屏幕。有人会认为有一种方法可以从控件中移除焦点,但这似乎并不容易。我可以轻松地将焦点设置为控件,但通常不只是将其删除。
对于那些对示例代码感兴趣的人:
我可以展示我整个项目的代码,但诚实地自己测试会更容易。创建一个新的 VC++ 项目 > MFC 应用程序,设置为“基于对话框”,完成。在资源视图中,右键单击对话框和“插入对话框”。使其与主窗口明显不同,并添加至少一个可以获取焦点的控件。最后,在您的主 .cpp 文件的顶部附近,您会发现文本“// The one and only”...在其下方是声明主应用程序对象的行。在该行下方创建一个新的对话框类(对于“启动屏幕”,您可以在下面看到我的*),然后在您的主应用程序中InitInstance()
,插入代码以在看起来像这样的部分上方加载启动屏幕:
CDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
我用来显示启动画面的代码是:
CSplashDlg dlgSplash;
dlgSplash.DoModal();
*我的启动对话框代码:
更新:我更改了我的代码以允许首先单击对话框而不是按回车键(事实上,我将在某些时候覆盖 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);
}