// 定义 π
#define PI 3.1415926535898
// 先创建一个 DC(对应控件的 DC)
// 在 OnTimer 中实现 CDC 双缓冲绘图
void CXXXXXXXX::OnTimer(UINT_PTR nIDEvent)
{
// 获得画图所在的矩形区域
// IDC_ID 可以是一个图片控件的 ID,也可以是一个对话框的 ID
CRect Rect;
GetDlgItem(IDC_ID)->GetClientRect(Rect);
// 创建 DC
CDC memDC;
CDC* pDC = GetDlgItem(IDC_ID)->GetDC();
memDC.CreateCompatibleDC(pDC);
// 创建位图
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, Rect.Width(), Rect.Height());
memDC.SelectObject(bitmap);
//********// // 实现其他绘图,例如贴图
// StretchDIBits(memDC.m_hDC, 0, 0, WIDTH, HEIGHT, 0, 0, WIDTH,
HEIGHT,
// pImg->imageData, &bit, DIB_RGB_COLORS,SRCCOPY);
// 绘制实现
CPoint PointStart(50, 50);
CPoint PointFinish(100, 100);
DrawArrow(&memDC, PointStart, PointFinish);
// 贴图并释放 DC 和位图
pDC->BitBlt(0, 0, Rect.Width(), Rect.Height(), &memDC, 0, 0,
SRCCOPY);
ReleaseDC(&memDC);
ReleaseDC(pDC);
bitmap.DeleteObject();
}
void CXXXXXXXX::DrawArrow(CDC* pDC, WVPoint2D pS, WVPoint2D pE)
{
// 连接 pS 和 pE, pS 为起点, pE 为终点
CPen PenLine(PS_SOLID, 1, RGB(0, 255, 0));
pDC->SelectObject(PenLine);
pDC->MoveTo(pS.x, pS.y);
pDC->LineTo(pE.x, pE.y);
// 计算向量 pS→pE 的角度
double Angle = angle_from_three_point(pS.x, pS.y, pE.x, pE.y, pE.x,
pE.y);
// 起点处绘制圆点
CPen PenPoint(PS_SOLID, 1, RGB(255, 0, 0));
pDC->SelectObject(PenPoint);
CBrush Brush(RGB(255, 0, 0));
pDC->SelectObject(Brush);
pDC->Ellipse(CRect(pS.x-3, pS.y-3, pS.x+3, pS.y+3));
// 计算箭头终点正负 28 度的两个点 Q1、Q2,并连接 Q1-PE,Q2-PE
CPen PenArrow(PS_SOLID, 1, RGB(0, 0, 255));