数据加载中……

Dialog中回车、Esc导致窗口关闭的问题

如题,对于这种问题网上总结的有两种方式来处理:
1、重载OnOk、OnCancel函数
2、重载PreTranslateMessage(MSG* pMsg) 函数。
两种方式都能达到希望的效果。但对话框中如果存在输入控件的话,回车事件会在控件中得不到响应。比如一个CEdit控件,回车后焦点依然在该控件中。

我们可以对上面的第二种重载函数进行一番改造,使之符合我们的预期。

将回车事件转化为TAB事件,这样就可以有效的解决这个问题。

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
    
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
    
{
        CWnd 
*mwnd = GetNextDlgTabItem (GetFocus()); //取得当前焦点控件的下一个控件的句柄
        if (mwnd)
        
{
            mwnd
->SetFocus(); //设置下一件控件得到输入焦点
            return TRUE;
        }

    }

    
return CDialog::PreTranslateMessage(pMsg);
}

但这时候又会有个问题,如果焦点定位到了真正的OK按钮上,这时候回车应该是触发了按钮的click事件,但上面的方法会导致焦点继续转移。与我们实际的应用有出入。那么接下来再做一次修改升级:如果是按钮,那么我们构造一个消息发出去。
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 
{
    
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
    
{
        CWnd 
*wnd = GetFocus ();
        
if (wnd != NULL)
        
{
            
char str[256];
            CString ClassName 
= _T("Button");
            GetClassName (wnd
->m_hWnd, str, 256);
            
if (ClassName == str)
            
{
                UINT i 
= wnd->GetDlgCtrlID ();
                SendMessage (WM_COMMAND, i, (LPARAM)wnd
->m_hWnd);
                
return TRUE;
            }

        }

        CWnd 
*mwnd = GetNextDlgTabItem (wnd);
        
if (mwnd)
        
{
            mwnd
->SetFocus();
            
return TRUE;
        }

    }

    
return CDialog::PreTranslateMessage(pMsg);
}

这样就既解决了回车导致关闭的问题,也同时方便了用户回车时在按钮上的焦点切换。

posted on 2011-04-21 10:06 Stone xin 阅读(970) 评论(0)  编辑 收藏 引用 所属分类: Window程序开发


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理