vc 对话框实现文字从左向右(或从右向左)循环滚动显示

ly506ren 2010-09-04 11:28:21
我现在想在对话框中做一个跑马灯的程序,要求把放在一个static中的文字在整个屏幕从左至右或从右至左水平循环滚动,要求不能太闪,我看论坛中说用双缓冲做,但是具体细节我还不太会,谁告诉我怎么做?最好是有源代码参考下。谢谢!
...全文
246 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hiiishe 2010-09-04
  • 打赏
  • 举报
回复


#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;
}
dengzikun 2010-09-04
  • 打赏
  • 举报
回复
先用定时器移动static窗口看看效果,不行再考虑复杂的方法。
hankcs 2010-09-04
  • 打赏
  • 举报
回复
上面的代码很精彩,学习了

15,979

社区成员

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

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