Static控件响应鼠标事件

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 underline
		if (!((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 colors
		if(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 color
		hbr = (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
	}
	return hbr;
}

再重点介绍一下响应鼠标滑动消息。先看一下代码:

void CHyperLinker::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	CRect 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);

来源网站:http://www.cguage.com/2010/08/static_control.html点击打开链接

时间: 2024-11-06 10:54:44

Static控件响应鼠标事件的相关文章

设置控件响应 鼠标事件 Qt::WA_TransparentForMouseEvents

问题描述: 1.tablewidget中的元素都是cellwidget,其中可能是widget,lable等 2.项目要求:鼠标移动到前几行,光标为禁止状态,其他为正常状态 3.遇到问题:鼠标在cellwidget上时,不响应tablewidget的鼠标移动事件,导致无法即及时更改光标样式 解决办法: 设置item属性:m_componentTableWgt->cellWidget(i, 0)->setAttribute(Qt::WA_TransparentForMouseEvents, tr

[转载]SysListView32控件响应鼠标单击消息

本文出自程序人生 >> SysListView32控件响应鼠标单击消息作者:代码疯子 SysListView32控件就是列表视图控件(MFC里面的CListCtrl就是对SysListView32进行的封装).如果想知道用户选择了哪个元素,可以这么响应消息(注意,这里是Report风格): 1 // Coded by 代码疯子 2 // http://www.programlife.net/ 3 case WM_NOTIFY: 4 switch (((LPNMHDR)lParam)->c

从零开始学_JavaScript_系列(九)——dojo(2)(AJAX、时间控件、鼠标事件、样式修改、事件移除、消息发布订阅)

(21)和(22)写的不好,跳过. (23)AJAX异步加载 插件:dojo/request 参数:request 语法(get): request.get(URL).then(成功回调函数,失败回调函数); 第一个回调函数是成功的,参数用response:(也可以用其他的) 第二个回调函数是失败的,参数用error:(也可以用其他的) 注: ①读取本地比较简单,直接填写本地的url即可: ②如果读取服务器端(比如数据库),那么需要相应的支持,例如python脚本等(我自己目前对python.和

C#(Winform)禁用TextBox控件的鼠标事件

1. 继承TextBox,然后重写父类的部分方法,核心代码如下 public class MyTextBox : TextBox { protected override void WndProc(ref Message m) { switch (m.Msg) { case 0x0201://WM_LBUTTONDOWN { return; } case 0x0202://WM_LBUTTONUP { return; } case 0x0203://WM_LBUTTONDBLCLK { retu

C# 常用控件及单击事件

1.窗体 1.常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体. (2)WindowState属性: 用来获取或设置窗体的窗口状态. 取值有三种: Normal (窗体正常显示). Minimized(窗体以最小化形式显示)和 Maximized(窗体以最大化形式显示). (3)StartPosition属性:用来获取或设置运行时窗体的起始位置.(System.Windows.Forms.SystemInformation.WindowsArea.

关于UITableView选中效果以及自定义cell上的控件响应事件

tableView默认的点击效果是:点击cell:A,出现点击效果,点另一个cell:B的时候,A的点击效果才会消失. 1.对于tableView,比较常用的效果,是点击表格行,出现效果,点击完毕,效果消失 那么就要在代码里做一些设置.代码如下: -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath

WinForm常用控件属性与事件整理

1.窗体     ◇常用属性 (1)Name 属性: 用来获取或设置窗体的名称,在应用程序中可通过 Name 属性来引用窗体 . (2) WindowState 属性: 用来获取或设置窗体的窗口状态. 取值有三种: Normal (窗体正常显示). Minimized(窗体以最小化形式显示)和 Maximized(窗体以最大化形式显示). (3)StartPosition 属性: 用来获取或设置运行时窗体的起始位置. (4)Text 属性: 该属性是一个字符串属性,用来设置或返回在窗口标题栏中显

Android 控件的触摸事件传递与处理

了解Android控件的触摸事件传递与处理对我们日常开发中自定义控件和触摸事件冲突解决有重大意义.Android控件的触摸事件传递和处理主要有以下几个方法,下面一一介绍. 一.与触摸事件有关的几个方法 boolean dispatchTouchEvent(MotionEvent ev);                                                                                               接收到触摸事件时,是否

VC ON_CONTROL_RANGE多个控件响应一个方法

步骤/方法 分三个步骤 在头文件中声明函数例如 afx_msg void onNum(UINT uID) 在.cpp文件中添加函数体 void CCalculatorDlg::OnNum(UINT uID) { UINT index=uID-IDC_NUM_0; CString num; num.Format(_T("%d"),index); AfxMessageBox(num); } 4 添加消息映射 ON_CONTROL_RANGE(BN_CLICKED,IDC_NUM_0,IDC