15,979
社区成员
发帖
与我相关
我的任务
分享
#pragma once
// CGoGoStatic
class CGoGoStatic : public CStatic
{
DECLARE_DYNAMIC(CGoGoStatic)
public:
CGoGoStatic();
virtual ~CGoGoStatic();
void GoGo();
void Stop();
void EndGoGo();
protected:
DECLARE_MESSAGE_MAP()
CPoint m_ptStart;
CSize m_szText;
BOOL m_bIsGoing;
public:
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnPaint();
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};
// GoGoStatic.cpp : 实现文件
//
#include "stdafx.h"
#include ".\gogostatic.h"
#define ID_TIMER_GOGO 888888
#define ID_TIMER_MOUSELEAVED 888889
// CGoGoStatic
IMPLEMENT_DYNAMIC(CGoGoStatic, CStatic)
CGoGoStatic::CGoGoStatic()
: m_ptStart(0)
, m_szText(0)
, m_bIsGoing(FALSE)
{
}
CGoGoStatic::~CGoGoStatic()
{
}
BEGIN_MESSAGE_MAP(CGoGoStatic, CStatic)
ON_WM_TIMER()
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_MOUSEMOVE()
ON_WM_SETCURSOR()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// CGoGoStatic 消息处理程序
void CGoGoStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CString strText;
GetWindowText(strText);
CRect rtClient;
GetClientRect(&rtClient);
CRgn rgnClip;
rgnClip.CreateRectRgn(rtClient.left, rtClient.top, rtClient.right, rtClient.bottom);
dc.SelectClipRgn(&rgnClip);
int nOldBkMode = dc.SetBkMode(TRANSPARENT);
CGdiObject* pOldObj = dc.SelectStockObject(DEFAULT_GUI_FONT);
m_szText = dc.GetTextExtent(strText);
dc.TextOut(m_ptStart.x, m_ptStart.y, strText);
dc.SelectObject(pOldObj);
dc.SetBkMode(nOldBkMode);
dc.SelectClipRgn(NULL);
}
void CGoGoStatic::OnTimer(UINT nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if ( nIDEvent == ID_TIMER_GOGO )
{
m_ptStart.x -= 2;
CRect rtClient;
GetClientRect(&rtClient);
rtClient.NormalizeRect();
if ( m_ptStart.x+m_szText.cx < rtClient.left )
m_ptStart.x = rtClient.right - 2;
ShowWindow(SW_HIDE);
ShowWindow(SW_NORMAL);
}
if ( nIDEvent == ID_TIMER_MOUSELEAVED )
{
CPoint pt;
::GetCursorPos(&pt);
ScreenToClient(&pt);
CRect rtClient;
GetClientRect(&rtClient);
rtClient.NormalizeRect();
if (!rtClient.PtInRect(pt))
{
GoGo();
KillTimer(ID_TIMER_MOUSELEAVED);
}
}
CStatic::OnTimer(nIDEvent);
}
BOOL CGoGoStatic::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
CPoint pt;
::GetCursorPos(&pt);
ScreenToClient(&pt);
CRect rectText(m_ptStart.x, m_ptStart.y, m_szText.cx, m_szText.cy);
rectText.NormalizeRect();
if (rectText.PtInRect(pt))
{
AfxGetApp()->LoadStandardCursor(IDC_CROSS);
return TRUE;
}
return CStatic::OnSetCursor(pWnd, nHitTest, message);
}
void CGoGoStatic::GoGo()
{
KillTimer(ID_TIMER_GOGO);
SetTimer(ID_TIMER_GOGO, 100, NULL);
m_bIsGoing = TRUE;
}
void CGoGoStatic::Stop()
{
KillTimer(ID_TIMER_GOGO);
m_bIsGoing = FALSE;
}
void CGoGoStatic::EndGoGo()
{
KillTimer(ID_TIMER_GOGO);
m_ptStart = 0;
m_bIsGoing = FALSE;
ShowWindow(SW_HIDE);
ShowWindow(SW_NORMAL);
}
BOOL CGoGoStatic::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->hwnd == m_hWnd)
{
switch(pMsg->message)
{
case WM_MOUSEHOVER:
{
Stop();
break;
}
case WM_MOUSELEAVE:
{
GoGo();
break;
}
case WM_LBUTTONDOWN:
{
//GoGo();
break;
}
default:break;
}
}
return CStatic::PreTranslateMessage(pMsg);
}
BOOL CGoGoStatic::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: 在此添加专用代码和/或调用基类
switch(message)
{
case WM_MOUSEHOVER:
{
Stop();
break;
}
case WM_MOUSELEAVE:
{
GoGo();
break;
}
case WM_LBUTTONDOWN:
{
//GoGo();
break;
}
default:break;
}
return CStatic::OnWndMsg(message, wParam, lParam, pResult);
}
int CGoGoStatic::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CStatic::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
return 0;
}
void CGoGoStatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bIsGoing)
{
Stop();
SetTimer(ID_TIMER_MOUSELEAVED, 500, NULL);
}
CStatic::OnMouseMove(nFlags, point);
}
BOOL CGoGoStatic::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;
}