如题,小弟分不多,大家帮帮忙
解决方案 »
- 如何在DOM加载完后调用CDHtmlDialog::GetDHtmlDocument?
- MFC中,一个二维数组int a[3][3],怎样将其输入到MessageBox中,格式如下 :
- 关于Invalidate和UpdateWindow的一个问题!
- 继承了一个CWND的类,并且在其中动态创建一个控件,为什么会没有反应
- 谁知道 上海新网程信息技术有限公司 怎么样??
- (急!在线等!)dll里使用MSMQ
- 请问大侠们,如何通过CMarkup在一个XML文档中定位节点和修改节点属性?
- 在VC 6.0中为什么加速键不能用?
- 怎么样显示265色的或64*64的光标,online!
- 希望大家捧场:uaiia.d2g.com 里面有才做好的网络通话程序 !
- 关于GetProfileString函数的问题
- UDT穿透
{
STATIC.MoveWindow();
}
基本思路就是扩展CStatic自绘,
在CStatic初始化的时候,将文字在MemDC上绘出一个BITMAP位图,然后开个定时器,根据走马灯的位置偏移写到CStatic的DC上去。
class CMarquee : public CStatic
{
DECLARE_DYNAMIC(CMarquee)public:
CMarquee();
virtual ~CMarquee();
protected:
HBITMAP m_hBmp;
SIZE m_size;
HDC m_hMemDC;
int m_position;
protected:
DECLARE_MESSAGE_MAP()
public:
void start();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
afx_msg void OnTimer(UINT_PTR nIDEvent);
};
// Marquee.cpp : 实现文件
//#include "stdafx.h"
#include "t_marquee.h"
#include "Marquee.h"
// CMarqueeIMPLEMENT_DYNAMIC(CMarquee, CStatic)CMarquee::CMarquee()
{
m_hMemDC = 0;
m_hBmp = 0;
m_position = 0;
}CMarquee::~CMarquee()
{
if(m_hBmp)
{
::DeleteObject(m_hBmp);
m_hBmp = 0;
}
if(m_hMemDC)
{
::DeleteDC(m_hMemDC);
m_hMemDC = 0;
}
}
BEGIN_MESSAGE_MAP(CMarquee, CStatic)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_TIMER()
END_MESSAGE_MAP()// CMarquee 消息处理程序BOOL CMarquee::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 return CStatic::OnEraseBkgnd(pDC);
}void CMarquee::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CStatic::OnPaint()
CRect rc;
GetClientRect(rc);
::FillRect(dc.m_hDC,rc,::GetSysColorBrush(COLOR_3DFACE));
if(m_hMemDC)
{
int width = this->m_size.cx;
if(this->m_position+width>rc.Width())
width = rc.Width()-this->m_position;
::BitBlt(dc.m_hDC,m_position,0,width,m_size.cy,m_hMemDC,0,0,SRCCOPY);
int idle = this->m_size.cx-width;
if(idle>0)
{//如果已经到了区域末端,需裁剪尾部,显示到最前端,这样就有走马灯的效果了
::BitBlt(dc.m_hDC,0,0,idle,m_size.cy,m_hMemDC,this->m_size-idle,0,SRCCOPY);
}
}
}void CMarquee::start()
{
CRect rc;
GetClientRect(rc); HDC hDC = ::GetDC(this->GetSafeHwnd());
CString txt;
this->GetWindowText(txt);
m_hMemDC = ::CreateCompatibleDC(NULL);
::SetBkMode(m_hMemDC,TRANSPARENT);
::GetTextExtentPoint(m_hMemDC,txt,txt.GetLength(),&m_size);
m_hBmp = ::CreateCompatibleBitmap(hDC,m_size.cx,m_size.cy);
::SelectObject(m_hMemDC,m_hBmp);
::FillRect(m_hMemDC,CRect(0,0,m_size.cx,m_size.cy),::GetSysColorBrush(COLOR_3DFACE));
::TextOut(m_hMemDC,0,0,txt,txt.GetLength());
this->Invalidate();
this->SetTimer(1,200,0);
}void CMarquee::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_position+=5;
CRect rc;
this->GetClientRect(rc);
if(m_position>=rc.Width())
m_position = 0;
this->Invalidate();
CStatic::OnTimer(nIDEvent);
}
但是走马效果有一点问题,估计是位图裁剪没裁剪好,你可以继续往下改,反正大概思路不会错的
外部调用CMarquee::start()即开始走马灯