CStatic 响应鼠标进入和离开的消息

lizhigang34 2009-07-12 05:40:39
现有个static控件,我想响应鼠标进入、离开这个控件时的消息。
如何处理呢?
...全文
687 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mnorst 2012-10-05
  • 打赏
  • 举报
回复
这个一下就说到重点了,顶!
[Quote=引用 4 楼 的回复:]
把static的SS_NOTIFY属性加上,
然后在WM_MOVE事件中加上这段代码
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
_TrackMouse……
[/Quote]
美丽海洋 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 softist 的回复:]
1- 向对话框贴一个static IDC_STATIC_1,设SS_NOTIFY=通知属性。
2- 生成一个 CStatic派生类CSttc,为IDC_STATIC_1定义CSttc类型的变量。
3- 在对话框里

BOOL g_bInner = FALSE;
void C对话框Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
  if (g_bInner)
  {
    g_bInner = FALSE;
    TRACE(_T("Leveed.\r\n"));
  }
  CDialog::OnMouseMove(nFlags, point);
}

4- 在CSttc里

extern BOOL g_bInner;
void CSttc::OnMouseMove(UINT nFlags, CPoint point)
{
  if (!g_bInner)
  {
    g_bInner = TRUE;
    TRACE(_T("Enterd.\r\n"));
  }
  CStatic::OnMouseMove(nFlags, point);
}
[/Quote]

说的很明白了
dengxuxing 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ghost90 的回复:]
MyStatic.h
C/C++ code#if !defined(AFX_MYSTATIC_H__0DA3C73A_2538_46C5_9EE7_6E41E9DA3896__INCLUDED_)#define AFX_MYSTATIC_H__0DA3C73A_2538_46C5_9EE7_6E41E9DA3896__INCLUDED_#if _MSC_VER > 1000#pragma once#endif// _MSC_VER > 1000// MyStatic.h : header file///////////////////////////////////////////////////////////////////////////////// CMyStatic windowclass CMyStatic :public CStatic
{// Constructionpublic:
CMyStatic();// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CMyStatic)//}}AFX_VIRTUAL// Implementationpublic:virtual~CMyStatic();// Generated message map functionsprotected://{{AFX_MSG(CMyStatic) afx_msgvoid OnMouseMove(UINT nFlags, CPoint point);//}}AFX_MSG afx_msgvoid OnMouseHover();
afx_msgvoid OnMouseLeave();
DECLARE_MESSAGE_MAP()
};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_MYSTATIC_H__0DA3C73A_2538_46C5_9EE7_6E41E9DA3896__INCLUDED_)
[/Quote]

不错!!
Fireway2008 2009-07-21
  • 打赏
  • 举报
回复
Ghost90 + softist + zqlong_sunday
即为最终答案。
marrco2005 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zqlong_sunday 的回复:]
把static的SS_NOTIFY属性加上,
然后在WM_MOVE事件中加上这段代码
TRACKMOUSEEVENT tme;
    tme.cbSize = sizeof(tme);
    tme.hwndTrack = m_hWnd;
    tme.dwFlags = TME_LEAVE | TME_HOVER;
    tme.dwHoverTime = 1;
    _TrackMouseEvent(&tme);

然后响应它的WM_MOUSEHOVER 和WM_MOUSELEAVE事件就行了
这个方法是建立一个static的派生类
[/Quote]
同意
捕鲸叉 2009-07-21
  • 打赏
  • 举报
回复
鼠标进入: WM_MOUSEHOVER
鼠标离开:WM_MOUSELEAVE
你妹的特盗不 2009-07-13
  • 打赏
  • 举报
回复
还有注意,在创建这个控件时要加上 SS_NOTIFY 风格,不然......
你妹的特盗不 2009-07-13
  • 打赏
  • 举报
回复
下面这段code 是我的程序中使用的,保证可以使用,而且还很灵敏
扩展写CStatic控件的兄弟应该知道,那个窗口是很小的,我们需要使用到 SetCapture();

在.h文件定义 bool m_mousein;init 为false

void XCStatic::OnMouseMove(UINT nFlags,CPoint point)
{
CStatic::OnMouseMove(nFlags,point);
//如果鼠标还在窗口内
if(m_mousein)
{

CRect rect;
GetClientRect(rect);
//鼠标位置离开了客户区,解除鼠标捕获,并改写状态量m_bOverControl
if(!rect.PtInRect(point))
{
//this->SetWindowTextW(_T("鼠标移出"));

m_mousein= FALSE;
ReleaseCapture();
//其他鼠标离开时的操作
//eg: ReDrawWindow();
return;
}
this->SetWindowTextW(_T("还在里面"));

}
//如果鼠标进入窗口,置鼠标捕获,状态参量
else
{
m_mousein= TRUE;
//其他鼠标进入时的操作
this->SetWindowTextW(_T("鼠标刚移进来"));
SetCapture();
}
}
dayong576 2009-07-13
  • 打赏
  • 举报
回复
WM_MOUSEOVER
Ghost90 2009-07-13
  • 打赏
  • 举报
回复
MyStatic.h

#if !defined(AFX_MYSTATIC_H__0DA3C73A_2538_46C5_9EE7_6E41E9DA3896__INCLUDED_)
#define AFX_MYSTATIC_H__0DA3C73A_2538_46C5_9EE7_6E41E9DA3896__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyStatic.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CMyStatic window

class CMyStatic : public CStatic
{
// Construction
public:
CMyStatic();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyStatic)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CMyStatic();

// Generated message map functions
protected:
//{{AFX_MSG(CMyStatic)
afx_msg void OnMouseMove(UINT nFlags, CPoint point);

//}}AFX_MSG
afx_msg void OnMouseHover();
afx_msg void OnMouseLeave();
DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYSTATIC_H__0DA3C73A_2538_46C5_9EE7_6E41E9DA3896__INCLUDED_)

Ghost90 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zqlong_sunday 的回复:]
把static的SS_NOTIFY属性加上,
然后在WM_MOVE事件中加上这段代码
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
_TrackMouseEvent(&tme);

然后响应它的WM_MOUSEHOVER 和WM_MOUSELEAVE事件就行了
这个方法是建立一个static的派生类
[/Quote]

根据4楼代码实现

MyStatic.cpp


// MyStatic.cpp : implementation file
//

#include "stdafx.h"
#include "dlgprint.h"
#include "MyStatic.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyStatic

CMyStatic::CMyStatic()
{
}

CMyStatic::~CMyStatic()
{
}


BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
//{{AFX_MSG_MAP(CMyStatic)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyStatic message handlers

void CMyStatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//SetWindowText("鼠标进入");
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
_TrackMouseEvent(&tme);

CStatic::OnMouseMove(nFlags, point);
}

void CMyStatic::OnMouseHover()
{
SetWindowText("鼠标进入");
}
void CMyStatic::OnMouseLeave()
{
SetWindowText("鼠标离开");
}

softist 2009-07-13
  • 打赏
  • 举报
回复
1- 向对话框贴一个static IDC_STATIC_1,设SS_NOTIFY=通知属性。
2- 生成一个 CStatic派生类CSttc,为IDC_STATIC_1定义CSttc类型的变量。
3- 在对话框里

BOOL g_bInner = FALSE;
void C对话框Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
if (g_bInner)
{
g_bInner = FALSE;
TRACE(_T("Leveed.\r\n"));
}
CDialog::OnMouseMove(nFlags, point);
}

4- 在CSttc里

extern BOOL g_bInner;
void CSttc::OnMouseMove(UINT nFlags, CPoint point)
{
if (!g_bInner)
{
g_bInner = TRUE;
TRACE(_T("Enterd.\r\n"));
}
CStatic::OnMouseMove(nFlags, point);
}
mmx2008 2009-07-12
  • 打赏
  • 举报
回复

mark
biweilun 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zqlong_sunday 的回复:]
把static的SS_NOTIFY属性加上,
然后在WM_MOVE事件中加上这段代码
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
_TrackMouseEvent(&tme);

然后响应它的WM_MOUSEHOVER 和WM_MOUSELEAVE事件就行了
这个方法是建立一个static的派生类
[/Quote]
说得很到位
tuzi0203 2009-07-12
  • 打赏
  • 举报
回复
顶,接分,就用2楼他们说的就行啦
  • 打赏
  • 举报
回复
TrackMouseEvent
zqlong_sunday 2009-07-12
  • 打赏
  • 举报
回复
把static的SS_NOTIFY属性加上,
然后在WM_MOVE事件中加上这段代码
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
_TrackMouseEvent(&tme);

然后响应它的WM_MOUSEHOVER 和WM_MOUSELEAVE事件就行了
这个方法是建立一个static的派生类
pady_pady 2009-07-12
  • 打赏
  • 举报
回复
WM_MOUSEHOVER 离开发生时是WM_MOUSELEAVE
biweilun 2009-07-12
  • 打赏
  • 举报
回复
WM_MOUSEOVER消息
Liv2005 2009-07-12
  • 打赏
  • 举报
回复
WM_MOUSEMOVE
这个event~然后你可以自己思考下~=_,=

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧