怎么用VC实现雷达扫描的效果
如何用VC实现雷达扫描的效果?
如何用VC实现雷达扫描的效果,关键是中间的扫描线怎么画?怎样才能让它一直旋转?
效果图见附件。
------解决方案--------------------
做一个Timer,显示扫描线,或者直接显示Gif图片。
------解决方案--------------------
自己重绘,可以控制开停。
------解决方案--------------------
自绘,画图
设置定时器可控制旋转
扫描线可GDI画
块也可以
利用双缓冲防止闪
------解决方案--------------------
在ontimer函数中设置外圈的点的坐标
在ondraw函数中画原点到外圈点的直线
------解决方案--------------------
重载OnEraseBkGnd()虚函数,防止屏幕闪哈
------解决方案--------------------
VC2005 Express + WTL8.0 通过:
如何用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); } };