第八章 图形编程 笔记

1. 一个简单的图形程序

给CExample3View类添加一个成员变量 CPoint m_jumpOffPoint来记录鼠标按下的位置。在构造函数中初始化为0.

接下来编写OnLButtonDown()和OnLButtonUp()函数 如下

void CExample3View::OnLButtonDown(UINT nFlags, CPoint point) 
{
    m_jumpOffPoint = point;     //记录鼠标按下的位置
    
    CView::OnLButtonDown(nFlags, point);
}
复制代码
void CExample3View::OnLButtonUp(UINT nFlags, CPoint point) 
{
    HDC hdc;
    hdc = ::GetDC(m_hWnd);       //获取设备环境句柄
    MoveToEx(hdc, m_jumpOffPoint.x, m_jumpOffPoint.y, NULL);  //移动到线条的起点
    LineTo(hdc, point.x, point.y);          //画线,从线条的起点到鼠标放开的位置
    ::ReleaseDC(m_hWnd, hdc);    //释放设备环境句柄
    
    CView::OnLButtonUp(nFlags, point);
}
复制代码

2. 设备环境相关类

       2.1 CDC类

复制代码
void CExample3View::OnLButtonUp(UINT nFlags, CPoint point) 
{
    CDC *pDC = GetDC();   HDC是一个句柄,而CDC是MFC提供的绘图类
    pDC->MoveTo(m_jumpOffPoint);
    pDC->LineTo(point);
    ReleaseDC(pDC);
    
    CView::OnLButtonUp(nFlags, point);
}
复制代码

上述代码和SDK全局函数实现的效果一样。

 

       2.2 CPaintDC类

       CPaintDC以及后面的CClientDC, CWindowDC都是派生自DCD。封装了一些操作,使用完后不需要调用ReleaseDC()。

       CPaintDC对象一般是用在WM_PAINT消息响应函数中,但只有当窗口的客户区部分或全部“无效”而需要“刷新”时需要发送WM_PAINT消息。

 

       2.3 CClientDC类

       CClientDC类对象只能在窗口的客户区进行图形绘制。

       CClientDC对象构造时采用的是GetDC()函数来获取环境句柄,而不是BeginPaint()函数。

       BeginPaint()函数获取的设备环境是客户区中的无效矩形区,随后的绘图操作只能在该无效矩形区中进行。并且可以自动将无效矩形区变为有效。GetDC()函数获取的设备环境是整个客户区,随后的绘图操作可以在客户区的任意部分进行。但是不能将任何无效矩形区变为有效。

void CExample3View::OnLButtonUp(UINT nFlags, CPoint point) 
{
    CClientDC dc(this);
    dc.MoveTo(m_jumpOffPoint);
    dc.LineTo(point);
    
    CView::OnLButtonUp(nFlags, point);
}

2.4 CWindowDC类

       CWindowDC可以获得整个窗口的设备句柄,包括客户区和非客户区,也就是说,可以在一个窗体的任何位置进行绘图。

posted @   唐小喵  阅读(265)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示