我制作了一个Visual Studio 2012(专业)项目,该项目的行为异常。当我只有一个对话框时,使用控件时在控件上没有焦点矩形出现(虚线边框),除非我先按TAB或ALT键。当我尝试在主对话框之前加载另一个对话框(作为初始屏幕)时,焦点虚线边框的确会出现在主(第二个)对话框上,当窗口加载时,它们已显示在第一项上。为什么会这样,如何防止这种情况发生?
我唯一的猜测是,按ENTER或ESC会导致与按TAB或ALT相同的行为,并且我总是看到效果,因为用户必须按ENTER或ESC关闭启动屏幕。有人会想到有一种方法可以从控件中删除焦点,但这似乎并不容易。我可以轻松地将焦点设置到控件上,而不仅仅是将其通常移除。
对于那些对示例代码感兴趣的人:
我可以显示整个项目的代码,但是诚实地进行测试会更容易。创建一个新的VC ++项目> MFC Application,设置为“基于对话框”,完成。在资源视图中,右键单击“对话框”,然后单击“插入对话框”。使它与主窗口明显不同,并添加至少一个可以聚焦的控件。最后,在主要.cpp文件顶部附近,您将找到文本“ // The and the 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);
}
最佳答案
似乎按ESC或ENTER键在程序上类似于按TAB或ALT键,因此按任何这些键都将触发控件上的焦点边框。我的解决方案是手动关闭对话框,而不是使用默认的“ OK”和“ CANCEL”选项,由于某些原因,这些选项触发了甚至尚未创建的将来对话框中的焦点边界。
我上面粘贴的最新代码是解决方案,并且我要指出的最后一点是,同样重要的是要防止用户在对话框中始终按ENTER或ESC(即使现在允许单击它们,他们也可能这样做),因此我使用PreTranslateMessage
捕获了这些按键。在使用此方法的同时仍允许使用ESCAPE和ENTER的同时,您可能完全避免了原始问题的发生,但是它并不像在PreTranslateMessage调用中包含CSplashDlg::EndDialog(1);
那样简单(我尝试过但失败了)。
在我的CSplashDlg类定义中:
virtual BOOL PreTranslateMessage(MSG* pMsg);
我的函数如下所示:
BOOL CSplashDlg::PreTranslateMessage(MSG* pMsg) {
if ( pMsg->message == WM_KEYDOWN ) {
if ( pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN ) {
pMsg->wParam = NULL;
//return MAKELONG(0,DC_HASDEFID);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
关于c++ - 添加另一个VC++对话框会导致第二个对话框在控件周围具有焦点虚线矩形?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14979835/