VC回车键窗口消失问题处理及使用方法

VC刚设计出来的对话框在build并debug的时候会出现个问题就是不管操作什么一按回车就会关闭对话框,这是VC默认的调用onok()这个函数,而默认的这个函数就是关闭功能,解决这种一按回车和ESC键就关闭工程的正确处理方法是:触发PreTranslateMessage消息,截获ENTER和ESC对对话框的消息。可,具体代码如下:


代码如下:

复制代码
代码
BOOL CXXX::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg->message == WM_KEYDOWN)
    {
        switch(pMsg->wParam)
        {
        case VK_RETURN://屏蔽回车键
            return TRUE;
        case VK_ESCAPE://屏蔽ESC键
            return TRUE;
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
} 
复制代码

 

 

OK了,这下好了。突然我在对话框上加了一个编辑框和一个列表框,我想先在编辑框中输入内容,然后按一下回车键,就把编辑框的内容插入到列表框中。

突然一想还真无从下手,再一想还是在PreTranslateMessage里面做,上面的我是直接return TRUE;的。我在这个return TRUE;上面做就行了。

代码如下:

 

复制代码
代码
BOOL CXXX::PreTranslateMessage(MSG* pMsg) 
{ 
    HWND h1 = ::GetDlgItem(m_hWnd,IDC_EDIT1);
    if(pMsg->message == WM_KEYDOWN)
    {         
        switch(pMsg->wParam)
        {
           case VK_RETURN:
               UpdateData();
               if (pMsg->hwnd == h1) 
               {                                      

                     m_list.AddString(m_edit1);
               }    
                 return TRUE;
           case VK_ESCAPE:
                  return TRUE;
             break;
          }
    }  
    return CDialog::PreTranslateMessage(pMsg);
}

复制代码

 

 


要是两个编辑框呢。在编辑框1中回车,把编辑框1的内容加到列表框,在编辑框2中回车,把编辑框2的内容加到列表框,于是这样。

代码如下:

 

复制代码
代码
BOOL CXXX::PreTranslateMessage(MSG* pMsg) 
{ 
    HWND h1 = ::GetDlgItem(m_hWnd,IDC_EDIT1);
    HWND h2 = ::GetDlgItem(m_hWnd,IDC_EDIT2);
    if(pMsg->message == WM_KEYDOWN)
    {         
         switch(pMsg->wParam)
        {
                case VK_RETURN:
                      UpdateData();
                     if (pMsg->hwnd == h1) 
                     {                                     

                          m_list.AddString(m_edit1);
                      } 
                    if (pMsg->hwnd == h2) 
                    {                                        

                         m_list.AddString(m_edit2);
                     }    
                    return TRUE;
                case VK_ESCAPE:
                     return TRUE;
                 break;
           }
    }  
    return CDialog::PreTranslateMessage(pMsg);
}

复制代码

 

 


为了下面的使用,先来讲讲VC的窗口类和窗口句柄的转换。
窗口类就是CWnd,窗口句柄就是HWND。CWnd和HWND之间互相转换代码如下:
   

CWnd *pWnd;
    HWND  hWnd;
    hWnd = pWnd->GetSafeHwnd();        //CWnd->HWND
    pWnd = CWnd::FromHandle(hWnd); //HWND->CWnd

 

 

则这样上面的两个编辑框的代码,改一下第二个编辑框先得到CWnd,转一下然后和HWnd比较。
改了的代码如下:

复制代码
代码
BOOL CXXX::PreTranslateMessage(MSG* pMsg) 
{ 
    HWND h1 = ::GetDlgItem(m_hWnd,IDC_EDIT1);
    CWnd *h2=GetDlgItem(IDC_EDIT2);
    if(pMsg->message == WM_KEYDOWN)
    {         
        switch(pMsg->wParam)
        {
        case VK_RETURN:
              UpdateData();
              if (pMsg->hwnd == h1) 
              {                                         

                         m_list.AddString(m_edit1);
              } 
              if (pMsg->hwnd == h2->GetSafeHwnd()) 
              {                                     

                      m_list.AddString(m_edit2);
              }    
             return TRUE;
        case VK_ESCAPE:
              return TRUE;
          break;
        }
    }  
    return CDialog::PreTranslateMessage(pMsg);
}

复制代码

 

 

完成了,功能一模一样。
好开心!
举一反三,下面别的控件你也可以这样做了。如:列表框
等等。

突然一天,我发现这种做法失效了。失效在组合框上了。
原本的希望却变成了失望。痛苦啊。
程序如下:

复制代码
代码
BOOL CXXX::PreTranslateMessage(MSG* pMsg) 
{ 
    HWND h3 = ::GetDlgItem(m_hWnd,IDC_COMBO1);
    if(pMsg->message == WM_KEYDOWN)
    {         
           switch(pMsg->wParam)
          {
           case VK_RETURN:
                  UpdateData();
                   if (pMsg->hwnd == h3) 
                  {                                                       

                             m_list.AddString(m_combo1);
                  }    
                 return TRUE;
           case VK_ESCAPE:
                 return TRUE;
           break;
         }
    }  
    return CDialog::PreTranslateMessage(pMsg);
}

复制代码

 

 

于是用SPY++一看,组合框却有两个句柄,一个是ComboBox,还有一个是Edit的句柄。想想也是呀:组合框的可视部分就是由一个Edit组合成的,而pMsg->hwnd得到的句柄就是这个Edit所指的句柄(因为回车就是在这个Edit里面敲的),而HWND h3 =::GetDlgItem(m_hWnd,IDC_COMBO1);得到的这个句柄却是ComboBox的句柄,pMsg->hwnd 和 h3这两个当然不等了。
呵呵,找到了原因就好办了。

这下记起来有个这个函数了吧:CWnd* GetParent() const;
其实ComboBox就是Edit的父窗口(组合框和编辑框都可以看成是窗口)。
哦,既然pMsg->hwnd是Edit的句柄,ComboBox又是Edit的父窗口,那用个GetParent();就得到父窗口的句柄了,就可以和得到的句柄比较了。
大功告成,于是代码就出来了。

代码如下(举了两个组合框):

 

复制代码
代码
BOOL CEntercomboDlg::PreTranslateMessage(MSG* pMsg) 
{
       CWnd *h1=GetDlgItem(IDC_COMBO1);
       CWnd *h2=GetDlgItem(IDC_COMBO2);
 
       CWnd* hh = CWnd::FromHandle(pMsg->hwnd);
       CWnd* hhp = NULL;
       if(pMsg->message == WM_KEYDOWN)
        {         
        switch(pMsg->wParam)
         {
        case VK_RETURN:
             UpdateData();
             hhp = hh->GetParent();  
             if (hhp == h1) {
                      m_list.AddString(m_combo1);
             }
             if (hhp == h2) {
                      m_list.AddString(m_combo2);
              }   
             return TRUE;
        case VK_ESCAPE:
             return TRUE;
         break;
         } 
 }  
 return CDialog::PreTranslateMessage(pMsg);
}

复制代码

 

这只是回车键在VC的应用之一。


转自:http://www.cnblogs.com/joinclear/archive/2010/11/18/1881251.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值