MFC中CDC画线总结

MFC画线需要起点坐标和终点坐标,利用通过MoveTo函数和的LineTo函数来连接起点和终点形成线.MFC提供了一个绘图的封装类CDC,CDC类的派生类如下图所示,所以MFC的画线就有5种:CDC,CDlinetDC,CMeatFileDC(未验证),CPaintDC,CWindowDC本文对上述四种方法进行演示。

 画图就是得到当前画图窗口的设备描述表,一般使用的GetDC()函数获得;然后将其与CDC设备描述表相关联。

m_ptOrigin画线起点,点画线终点。

1.CDC 

    CDC * pDC = GetDC();
    了pdc->通过MoveTo(m_ptOrigin);
    了pdc->的LineTo(点);
    ReleaseDC(PDC);

2. CClientDC是CDC的派生类,在构造函数时调用DetDC,在分构时调用ReleaseDC,所以在使用时不需要显示的调用GetDC函数.CClientDC
    dc(this);
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(点);

3.一个CPaintDC对象只在响应一个WM_PAINT消息的时候被使用,通常是在你的OnPaint消息处理成员函数中。

void CDrawView :: OnPaint()
{
    CPaintDC dc(this); //绘制
    dc.MoveTo(10,10)的设备上下文;
    dc.LineTo(500500);
}

也可以定义将绘制(DC)函数,并把绘制函数写在Opaint函数里,在绘制利用写绘图函数。

4.CWindowDC是CDC的派生类,在构造函数时调用DetDC,在分构时调用ReleaseDC,所以在使用时不需要显式的调用GetDC函数。

    CWindowDC dc(GetDesktopWindow());
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(点);

5.可以利用SDK函数来画图。

    HDC hdc;
    hdc = :: GetDC(m_hWnd); // SDK函数
    MoveToEx(HDC,m_ptOrigin.x,m_ptOrigin.y,NULL);
    的LineTo(HDC,point.x,point.y);
    :: ReleaseDC(m_hWnd,HDC);

CDC 是MFC的DC的一个类,HDC是DC的句柄 API中的一个类似指针的数据类型.CDC等设备上下文类,含有都类一个的成员变量:m_hDc,用来保存与该类相关的句柄。其道理与CWnd的类提供m_Wnd成员变量保存与窗口相关的句柄。通过SDK函数的GetDC(m_hWnd)得到当前设备句柄。 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC,使用贝塞尔曲线画椭圆需要以下步骤: 1. 计算椭圆上的点坐标,可以使用椭圆的参数方程求解。 2. 将椭圆上的点坐标转化为贝塞尔曲线的控制点坐标。具体地,每个控制点的坐标可以通过将相邻的椭圆上的点取平均值得到。 3. 使用MFC的CPen和CBrush对象设置画笔和填充方式。 4. 使用MFC的CGraphicsPath对象绘制贝塞尔曲线。 下面是一个简单的示例代码: ``` void DrawBezierEllipse(CDC* pDC, CRect rect) { double a = rect.Width() / 2.0; double b = rect.Height() / 2.0; double cx = rect.left + a; double cy = rect.top + b; // 计算椭圆上的点坐标 std::vector<CPoint> points; for (double t = 0; t <= 2 * M_PI; t += 0.1) { int x = (int)(cx + a * cos(t)); int y = (int)(cy + b * sin(t)); points.push_back(CPoint(x, y)); } // 将椭圆上的点坐标转化为贝塞尔曲线的控制点坐标 std::vector<CPoint> bezierPoints; int count = points.size(); for (int i = 0; i < count; i++) { CPoint p1 = points[i]; CPoint p2 = points[(i + 1) % count]; CPoint p3 = points[(i + 2) % count]; CPoint p4 = points[(i + 3) % count]; int x1 = (int)((p1.x + p2.x) / 2.0); int y1 = (int)((p1.y + p2.y) / 2.0); int x2 = (int)((p2.x + p3.x) / 2.0); int y2 = (int)((p2.y + p3.y) / 2.0); int x3 = (int)((p3.x + p4.x) / 2.0); int y3 = (int)((p3.y + p4.y) / 2.0); bezierPoints.push_back(CPoint(x1, y1)); bezierPoints.push_back(CPoint(x2, y2)); bezierPoints.push_back(CPoint(x3, y3)); } // 使用CPen和CBrush对象设置画笔和填充方式 CPen pen(PS_SOLID, 1, RGB(0, 0, 255)); CBrush brush(RGB(255, 255, 0)); pDC->SelectObject(&pen); pDC->SelectObject(&brush); // 使用CGraphicsPath对象绘制贝塞尔曲线 CGraphicsPath path; path.StartFigure(); path.AddBezier(bezierPoints.data(), bezierPoints.size()); path.CloseFigure(); pDC->BeginPath(); path.Outline(*pDC); pDC->EndPath(); pDC->FillPath(); pDC->StrokePath(); } ``` 这段代码可以在MFC应用程序的OnDraw函数调用,传入绘制椭圆的矩形区域作为参数即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值