如题,小弟分不多,大家帮帮忙

解决方案 »

  1.   

    SetTimer定时MoveWindow移动Static控件,注意控件ID不要用IDC_STATIC。
      

  2.   

    SetTimer
    {
      STATIC.MoveWindow();
    }
      

  3.   

    时间匆忙,简单写了一个demo,你自己继续往下写
    基本思路就是扩展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()即开始走马灯