原文转自 https://wenku.baidu.com/view/b5460979700abb68a982fbcf.html

在常规条件下,MFC画出来的图形、文字都是有锯齿的。如下图所示: 

怎样才能画出不带锯齿的图形呢?要用到GDI+这个MFC库。下面将以案例的方式讲述如何通过MFC画出不带锯齿的图形。

一、建立一个简单的MFC应用 
一个简单的MFC应用包含两个文件,Hello.h和Hello.cpp。建立的方法是在VS中建立一个空项目,然而添加头文件Hello.h和源文件Hello.cpp

//Hello.h
#include <afxwin.h>
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
}; class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
// Hello.cpp 
#include <afxwin.h>
#include "Hello.h" CMyApp myApp; BOOL CMyApp::InitInstance()
{
m_pMainWnd  = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
} BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP() CMainWindow::CMainWindow()
{
Create(NULL, _T("The Hello Application"));
} void CMainWindow::OnPaint()
{
CPaintDC dc(this);
dc.MoveTo(, );
dc.LineTo(, );
dc.MoveTo(, );
dc.LineTo(, );
}

下面开始编译程序。这里要注意的是,应该修改项目属性中【链接器】的设置,在【高级】选项卡中的【入口】选项中,填入WinMainCRTStartup。此外,要遭项目属性的【配置属性】选项卡中,修改【MFC的使用】项目,修改为【在共享DLL中使用MFC】。 
这样就可以编辑并运行程序了。程序运行的效果如上图所示,所画的两条曲线是带有锯齿的。 要想得到反锯齿的、渲染细腻的线条,就要对上述程序做一些修改。 
首先要修改头文件Hello.h,将GDI+的头文件引入,并在CMyApp中定义新的成员变量m_gdiplusToken,覆盖CMyApp继承而来的ExitInstance( )函数。具体如下

//Hello.h
#include <afxwin.h>
#include <Gdiplus.h> //引入头函数 
#pragma comment(lib, "Gdiplus.lib")  // 引入链接库
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
private:
ULONG_PTR m_gdiplusToken;
}; class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};

下面需要在Hello.cpp中做出相应的调整。主要调整的是 CMyApp::InitInstance( ), CMyApp::ExitInstance( ) 和 CMainWindow::OnPaint( )

// Hello.cpp
#include <afxwin.h>
#include "Hello.h" CMyApp myApp; BOOL CMyApp::InitInstance()
{
m_gdiplusToken = 0;
Gdiplus::GdiplusStartupInput gpSI;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gpSI, NULL);
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
} int CMyApp::ExitInstance()
{
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return __super::ExitInstance();
} BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP() CMainWindow::CMainWindow()
{
Create(NULL, _T("The Hello Application"));
} void CMainWindow::OnPaint()
{
CPaintDC dc(this);
Gdiplus::Graphics graphics(dc.m_hDC);
Gdiplus::Pen red(Gdiplus::Color(255, 255, 0, 0), 1);
Gdiplus::Pen blue(Gdiplus::Color(255, 0, 0, 255), 1);
graphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
graphics.DrawLine(&red, 10, 10, 200, 400);
graphics.DrawLine(&blue, 10, 15, 200, 500);
}

这样修改后的程序就能够画出反锯齿的曲线了。如下图所示

【GDI+】MFC画图- 消除锯齿(转)的更多相关文章

  1. C++MFC编程笔记day06 MFC向导、MFC画图类使用

    MFC画图    MFC画图类包含画图设备类和画图对象类    1 画图设备类      CDC类-父类是CObject,封装的是一般的画图设备,比如:显示器,            打印机等.    ...

  2. MFC画图总结-DIB图形绘制

    參考文档: http://blog.csdn.net/hnust_xiehonghao/article/details/37652927 http://blog.sina.com.cn/s/blog_ ...

  3. 孙鑫MFC学习笔记4:MFC画图

    1.画线方法 *1.捕获鼠标按下和弹起消息,获取两个点 *2.消息响应,画线 2.在CMainFrame类中的鼠标左键事件得不到响应的原因是CNameView覆盖了CMainFrame 3.注释宏 4 ...

  4. C#画图消除锯齿

    using (Graphics g = this.CreateGraphics()) { g.SmoothingMode = SmoothingMode.HighQuality; //图片柔顺模式选择 ...

  5. C#-gdi画图,双缓冲画图,Paint事件的触发---ShinePans

    在使用gdi技术画图时,有时会发现图形线条不够流畅,或者在改变窗口大小时会闪烁不断的现象.(Use DoubleBuffer to solve it!)                         ...

  6. GDI编程

    图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...

  7. VC++学习之GDI概述

    VC++学习之GDI概述 图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏 ...

  8. MFC实现红黑砖块

    MFC实现红黑砖块 题目 老题目了,给定w,h长宽的图,上面有颜色不同的瓷砖,黑和红,问从给的起点出发,只能走黑色瓷砖,能走多少块,可视化输出过程 思路 咋一看搜索水题,但是要用可视化,要用模板类,, ...

  9. GDI+ 和GDI

    GDI:Graphics Device Interface,即图形设备接口,是Windows API的一个重要组成部分.它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具 ...

随机推荐

  1. linux无名管道

    特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程.兄弟进程.子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 ...

  2. 30-RoutingMiddleware介绍以及MVC引入

    1-构建路由 public class Startup { // This method gets called by the runtime. Use this method to add serv ...

  3. 7,vim

    vim与程序员 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体 ...

  4. 单例解决存储微信Token信息保留两小时

    采用单例模式可以存储初始化数据,比如第一次对/api/test接口进行了访问,传入的信息为“123”,则在两个小时之内返回的信息依然是“123”,无论传入的参数是什么,如果有效时间过了两个小时,比如传 ...

  5. 跨域携带cookie

    $.ajax({ type: "GET", url: "https://upload.cnblogs.com/imageuploader/upload?host=www. ...

  6. [转]多多“亦”善:把大量内容放到一页PPT的5个技巧

    技巧一:利用灰色“隐蔽”内容 灰色有个好处:自动成为“备胎”,在“现任”被浏览后才会被注意到.所以使用灰色能够让页面内容看起来没那么多. 技巧二:对齐和亲密 这是排版的两个原则. 对齐是指对页面上的元 ...

  7. Spring mvc+hibernate+freemarker(实战)

    Spring mvc+hibernate+freemarker(实战) 博客分类: Spring Spring mvchibernatefreemarkerwebjava  今天我为大家做了一个 sp ...

  8. 《Cracking the Coding Interview》——第13章:C和C++——题目5

    2014-04-25 19:59 题目:C的关键字volatile有什么用? 解法:搞硬件设计的人好像更关注这个关键字.volatile本身是易变的意思,应该和persistent有反义词关系吧.说一 ...

  9. python学习笔记十七:base64及md5编码

    一.Python Base64编码 Python中进行Base64编码和解码要用base64模块,代码示例: #-*- coding: utf-8 -*- import base64 str = 'c ...

  10. csdn回到顶端

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...