hur.cn - 华软网

 热门搜索

edit左键响应

  作者:未知    来源:网络    更新时间:2009/9/24
vc的editbox如何响应鼠标左键的单击事件?
目标,鼠标单击editbox控件弹出一个窗口,哪位知晓,谢谢!!
---华软 网友回答---
CEdit控件是继承自CWnd。所以CWnd的所有事件,CEdit都有。
鼠标单击分为2种。你可以捕获鼠标左键按下,也可以捕获鼠标左键释放,这两个事件

C++">
CWnd::OnLButtonDown

afx_msg void OnLButtonDown( UINT nFlags, CPoint point );

参数: nFlags 指定了不同的虚拟键是否被按下。这个参数可以是下列值之一:
· MK_CONTROL 如果CTRL键被按下,则设置此位。  
· MK_LBUTTON 如果鼠标左键被按下,则设置此位。  
· MK_MBUTTON 如果鼠标中键被按下,则设置此位。  
· MK_RBUTTON 如果鼠标右键被按下,则设置此位。  
· MK_SHIFT 如果SHIFT键被按下,则设置此位。
 
 
point 指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。
 

说明:当用户按下鼠标左键时,框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现,则该实现将使用最初传递给消息的参数(而不是你提供给这个函数的参数)。

CWnd::OnLButtonUp

afx_msg void OnLButtonUp( UINT nFlags, CPoint point );

nFlags 指定了不同的虚拟键是否被按下。这个参数可以是下列值之一:
· MK_CONTROL 如果CTRL键被按下,则设置此位。  
· MK_LBUTTON 如果鼠标左键被按下,则设置此位。  
· MK_MBUTTON 如果鼠标中键被按下,则设置此位。  
· MK_RBUTTON 如果鼠标右键被按下,则设置此位。  
· MK_SHIFT 如果SHIFT键被按下,则设置此位。
 
 
point 指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。
 

说明:
当用户放开鼠标左键时,框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现,则该实现将使用最初传递给消息的参数(而不是你提供给这个函数的参数)。


 弹出窗口,就看你想怎么操作了。反正触发事件已经找到了
---华软网友回复---
二楼的方法,我发帖前已经尝试过这样的方法,代码如下:
CDialog::OnLButtonDown(nFlags, point);

CWnd * pWnd = GetDlgItem(IDC_edit1);

CRect rect;
pWnd->GetWindowRect(&rect);

this->ScreenToClient(&rect);

if(rect.PtInRect(point))
{
AfxMessageBox("In");
}
但是没有效果,不知道是不是我的方法还有不对的滴地方!请指教
或者能否改成响应SETFOCUS,但是那样会在销毁弹出窗口后,再次出发SETFOCUS陷入循环了,如何将其焦点换到CSTATIC应该也是可以达到目的,
---华软网友回复---
point是不是也要入ScreenToClient
---华软网友回复---
应该可以的吧
---华软网友回复---
等待牛人
---华软网友回复---
CDialog应该不会收到在editbox里的按键消息。

自CEdit派生一个自己的类,在该类中响应鼠标按键消息
---华软网友回复---
自己写一个类,
或者从主窗口的pretranslate中判断。
---华软网友回复---
6楼讲的好简略?难道是类的重载?有这个必要吗?

---华软网友回复---
这个我已经解决了,让CEdit响应自己的问题!
重载PreTranslateMessage()
 BOOL   CTestView::PreTranslateMessage(MSG*   pMsg)     
  {   
  //   TODO:   Add   your   specialized   code   here   and/or   call   the   base   class   
  if(pMsg->message==WM_LBUTTONDOWN)   
  if(pMsg->hwnd==::GetDlgItem(m_hWnd,IDC_EDIT))   
  {   
                                  MessageBox("OK");   
  return   TRUE;   
  }   
  return   CListView::PreTranslateMessage(pMsg);   
  }   

---华软网友回复---
C++">
BOOL CMy11Dlg::PreTranslateMessage(MSG* pMsg) 
{
    // TODO: Add your specialized code here and/or call the base class

    if(pMsg->message==WM_LBUTTONDOWN)
    {
        CRect rect;
        GetDlgItem(IDC_EDIT1)->GetWindowRect(&rect);
        if(rect.PtInRect(pMsg->pt))
        {
             MessageBox("aa");   //当位置在控件上的时候弹出消息
        }
         
     }

    return CDialog::PreTranslateMessage(pMsg);
}



---华软网友回复---
一般来说 这种需求都是用派生类来做的  简洁 高效  代码好看的多  非要在那死拼硬凑  终究不是最终的解决方案 
---华软网友回复---
引用 11 楼 ziplj 的回复:
一般来说 这种需求都是用派生类来做的  简洁 高效  代码好看的多  非要在那死拼硬凑  终究不是最终的解决方案


支持这种做法,这种方便管理。
---华软网友回复---
如果EDITBOX是可以编辑的话,可以添加消息  EN_SETFOCUS 
---华软网友回复---
void CAboutDlg::OnSetfocusEdit2() 
{
// TODO: Add your control notification handler code here
AfxMessageBox("hello");
}
---华软网友回复---
重载一个Cedit类,

这样比较好,

不要一直在主界面的代码中,添加过多的代码.
---华软网友回复---
虽然自己已经解决了,不过也得到各位的帮助,确实发现,还是重载一个CEdit类比较好!不过自己用的这个方法比较简单快捷。都没有用过重载,呵呵,vc都不入门的水平,这个方面还是要看书!!好了结贴,谢谢大家

---华软网友回复---
晕 老衲来晚了
---华软网友回复---
引用 15 楼 maple_zhj 的回复:
重载一个Cedit类,

这样比较好,

不要一直在主界面的代码中,添加过多的代码.


改如何实现啊。。求指点
---华软网友回复---
引用 11 楼 ziplj 的回复:
一般来说 这种需求都是用派生类来做的 简洁 高效 代码好看的多 非要在那死拼硬凑 终究不是最终的解决方案
如何实现啊。。求指点
---华软网友回复---
引用 16 楼 fswking 的回复:
虽然自己已经解决了,不过也得到各位的帮助,确实发现,还是重载一个CEdit类比较好!不过自己用的这个方法比较简单快捷。都没有用过重载,呵呵,vc都不入门的水平,这个方面还是要看书!!好了结贴,谢谢大家

如何实现啊。。求指点      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。