怎么用VC实现雷达扫描的效果

如何用VC实现雷达扫描的效果?
如何用VC实现雷达扫描的效果,关键是中间的扫描线怎么画?怎样才能让它一直旋转?
效果图见附件。

------解决方案--------------------
做一个Timer,显示扫描线,或者直接显示Gif图片。
------解决方案--------------------
自己重绘,可以控制开停。
------解决方案--------------------
自绘,画图
设置定时器可控制旋转
扫描线可GDI画
块也可以
利用双缓冲防止闪
------解决方案--------------------
在ontimer函数中设置外圈的点的坐标

在ondraw函数中画原点到外圈点的直线
------解决方案--------------------
重载OnEraseBkGnd()虚函数,防止屏幕闪哈
------解决方案--------------------
VC2005 Express + WTL8.0 通过:
C/C++ code
// TransformDCView.h : interface of the CTransformDCView class
//
/////////////////////////////////////////////////////////////////////////////

#pragma once
#define _USE_MATH_DEFINES
#include <math.h>

class CTransformDCView : public CWindowImpl<CTransformDCView>
{
    double m_dAng;
public:
    DECLARE_WND_CLASS(NULL)

    BOOL PreTranslateMessage(MSG* pMsg)
    {
        pMsg;
        return FALSE;
    }

    BEGIN_MSG_MAP(CTransformDCView)
        MESSAGE_HANDLER(WM_PAINT, OnPaint)
        MESSAGE_HANDLER(WM_CREATE, OnCreate);
        MESSAGE_HANDLER(WM_TIMER, OnTimer); 
    END_MSG_MAP()

// Handler prototypes (uncomment arguments if needed):
//    LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//    LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//    LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)

    LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        m_dAng = 0.0;   // 角度
        SetTimer(1,20);
        return TRUE;
    }

    LRESULT OnTimer(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        m_dAng-=M_PI/30.0;       // 旋转
        if(m_dAng<-M_PI) m_dAng+=2*M_PI;   
        Invalidate(FALSE);
        return 0;
    }

    LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        CPaintDC dc(m_hWnd);

        //TODO: Add your drawing code here
        RECT rc;
        GetClientRect(&rc);
        {
            CMemoryDC mdc(dc,rc);    // 双缓冲
            mdc.SaveDC();
            DrawRadar(mdc,m_dAng);
            mdc.RestoreDC(-1);
        }
        return 0;
    }

    void DrawRadar(HDC hDC, double dAng)   
    {
        const int R = 150;   // 半径150
        
        CDCHandle dc(hDC);

        RECT rcRect={0,0,2*R,2*R};
        dc.FillSolidRect(&rcRect,0xffffff);

        CPen pen;
        pen.CreatePen(PS_SOLID,1,RGB(0,200,0));
        HPEN OldPen = dc.SelectPen(pen);
        
        // 画圆
        RECT rcCircle = rcRect;
        for(int i=0; i<4; i++)
        {
            dc.Ellipse(&rcCircle);
            ::InflateRect(&rcCircle,-R/3,-R/3);
        }

        // 四根直线
        dc.MoveTo(rcRect.left,(rcRect.top+rcRect.bottom)/2);
        dc.LineTo(rcRect.right,(rcRect.top+rcRect.bottom)/2);

        dc.MoveTo((rcRect.left+rcRect.right)/2,rcRect.top);
        dc.LineTo((rcRect.left+rcRect.right)/2,rcRect.bottom);

        int iCorner = int((1.0 - sqrt(2.0)/2.0)*R);
        RECT rcCorner = rcRect;
        ::InflateRect(&rcCorner,-iCorner,-iCorner);
        dc.MoveTo(rcCorner.left,rcCorner.top);
        dc.LineTo(rcCorner.right,rcCorner.bottom);
        dc.MoveTo(rcCorner.right,rcCorner.top);
        dc.LineTo(rcCorner.left,rcCorner.bottom);

        // 建立内存DC,用于画一个雷达波束,建议用位图资源
        CDC MemDC;
        MemDC.CreateCompatibleDC(hDC);
        CBitmap bmpMemDC;
        bmpMemDC.CreateCompatibleBitmap(hDC, 2*R, 2*R);
        MemDC.SelectBitmap(bmpMemDC);

        MemDC.FillSolidRect(&rcRect,0xffffff);

        // 画饼图,如果想好看点可以用资源
        CPen penMemDC;
        CBrush brMemDC;
        penMemDC.CreatePen(PS_SOLID,1,RGB(160,200,160));
        brMemDC.CreateSolidBrush(RGB(160,200,160));
        MemDC.SelectBrush(brMemDC);
        MemDC.SelectPen(penMemDC);
        MemDC.Pie(-R,-R,R,R,0,R,R,0);     // 再次建议用位图资源代替

        // 偏移
        XFORM xForm;
        ::SetGraphicsMode(dc, GM_ADVANCED);

        xForm.eM11 = (FLOAT)cos(dAng);
        xForm.eM12 = (FLOAT)sin(dAng);
        xForm.eM21 = (FLOAT)-xForm.eM12;
        xForm.eM22 = (FLOAT)xForm.eM11;
        xForm.eDx  = (FLOAT)R;
        xForm.eDy  = (FLOAT)R;
        ::SetWorldTransform(dc, &xForm);

        // 合并
        ::BitBlt(dc,rcRect.left,rcRect.top,rcRect.right-rcRect.left,rcRect.bottom-rcRect.top,
            MemDC,0,0,SRCAND);

        dc.SelectPen(OldPen);
    }

};