我制作了一个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/

10-11 22:57
查看更多