Static控件响应鼠标事件
来源:互联网 发布:长沙理工网络教务平台 编辑:程序博客网 时间:2024/06/05 09:01
tatic控件默认是不支持响应鼠标消息的,如果把其ID从IDC_STATIC改成其他的,可见其可以响应BN_CLICKED消息,但这远远不够。但是MS也没有把路堵死,我们可以利用SetWindowLong,动态增加 其SS_NOTIFY风格,使其支持鼠标响应。
1、不重载CStatic,使静态文本控件支持鼠标消息的办法
//可以在InitDialog中添加DWORD dwStyle = m_static1.GetStyle();dwStyle |= SS_NOTIFY;SetWindowLong(m_static1.GetSafeHwnd(), GWL_STYLE, dwStyle);SetWindowLong(m_static2.GetSafeHwnd(), GWL_STYLE, dwStyle); dwStyle = m_skBmp.GetStyle();//m_skBmp指的是picture控件(关联的CStatic的变量)dwStyle |= SS_NOTIFY;SetWindowLong(m_skBmp.GetSafeHwnd(), GWL_STYLE, dwStyle);
当然,也可以不关联CStatic的成员变量,直接GetDlgItem是一样的。
对其添加消息响应,以双击为例:
分别添加
afx_msg void OnStaticDblClick();……ON_STN_DBLCLK(IDC_STATIC2, OnStaticDblClick)……最后实现void CTestDlg::OnStaticDblClick(){ //在这里添加操作MessageBox(_T("静态控件被DblClicked啦!"));} 利用这个,还可用picture控件做一个简单的按钮,比较简单,详见附件代码。
2、为实现更强大的功能,最好的办法是重载CStatic类。这里以CHyperLinker类为例,给大家讲讲实现方法
增加SS_NOTIFY属性方法类似,可以在PreSubClass中完成, 这里代码略去
实现滑过效果、点击效果(颜色变化等效果),主要是在对应消息响应函数中调用Invalidate, 在CtlColor实现重画。
在CtlColor(注意响应的是WM_CTLCOLOR_REFLECT)里面无非是对各种状态的判断,并SetTextColor等而已
HBRUSH CHyperLinker::CtlColor(CDC* pDC, UINT nCtlColor){ASSERT(nCtlColor == CTLCOLOR_STATIC); DWORD dwStyle = GetStyle();/*if (!(dwStyle & SS_NOTIFY)){// Turn on notify flag to get mouse messages and STN_CLICKED.// Otherwise, I'll never get any mouse clicks!::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle | SS_NOTIFY);}*/ HBRUSH hbr = NULL;if ((dwStyle & 0xFF) <= SS_RIGHT){// Modify the font to be underlineif (!((HFONT) m_Font)){LOGFONT lf;GetFont()->GetObject(sizeof(lf), &lf); lf.lfUnderline = m_bUnderLine;m_Font.CreateFontIndirect(&lf);}pDC->SelectObject(&m_Font); //set the text colorsif(m_bVisited==TRUE){pDC->SetTextColor(m_VisitedColor);//AfxMessageBox("Click");}else{if(m_bAboveControl==TRUE){pDC->SetTextColor(m_CoverColor);//AfxMessageBox("Above");}else{pDC->SetTextColor(this->m_InitColor);//AfxMessageBox("init");}}pDC->SetBkMode(TRANSPARENT);// return hollow brush to preserve parent background colorhbr = (HBRUSH)::GetStockObject(HOLLOW_BRUSH);}return hbr;}再重点介绍一下响应鼠标滑动消息。先看一下代码:
void CHyperLinker::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCRect rect;GetClientRect(rect);//static BOOL bIsIn=FALSE;//判断是否前一此鼠标就已经在static控件区域类if (rect.PtInRect(point)){m_bAboveControl=TRUE; /*以下被注释的几行为无效代码, C瓜哥注*///if(bIsIn==FALSE) //{SetCapture();bIsIn=TRUE;Invalidate();//}}else{m_bAboveControl=FALSE;//if (bIsIn==TRUE)//{ReleaseCapture();bIsIn=FALSE;Invalidate();//}}CStatic::OnMouseMove(nFlags, point);
0 0
- Static控件响应鼠标事件
- VC STATIC控件响应鼠标点击事件
- MapX 控件 鼠标事件响应
- 组合控件的鼠标事件响应
- mfc picture控件响应鼠标右键事件
- 让Shockwave flash控件响应鼠标移动的事件
- 解决]VC:CDataGrid控件响应鼠标双击事件
- map控件中对鼠标滚轮事件的响应
- 控制WinForm控件上的键盘,鼠标事件响应
- 控件响应鼠标操作事件中,判断IsIdle()作用
- 继承MFC控件后怎么响应鼠标单双击事件
- mfc 中静态控件static 的双击响应事件
- mfc 中静态控件static 的双击响应事件
- MFC实现STATIC TEXT控件的鼠标事件解决方案
- MFC:为STATIC控件添加鼠标移动事件(VS2010)
- OpenGL鼠标响应事件
- OpenCV--鼠标事件响应
- 鼠标事件的响应
- 编译成dll的项目使用方式
- 公倍数——蓝桥杯2011年Java决赛
- android怎么读取项目中的图片或文件目录分析
- JMS与Sping(一)
- 微软计划6月份推出Windows 10 RTM
- Static控件响应鼠标事件
- C/C++数组名与指针区别深入探索
- 重构笔记
- 自己不断尝试制作cdlinuxU盘启动的过程,绝对好用!!解决网上大多数方法不好使!!
- 使用eclipse时8080端口被占用的一个场景
- Swift基础一
- 多说最近访客通用代码使用方法
- InfoPath与SharePoint之(三) 在InfoPath中实现联动下拉菜单
- python中的深拷贝和浅拷贝理解