原文转自 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. iOS-cell的封装和重用

    一.通过xib描述cell---(cell的高度一致,cell里面控件布局基本一样): 1.(M) 创建模型: -------------------------------------------- ...

  2. Ball CodeForces - 12D

    传送门 N ladies attend the ball in the King's palace. Every lady can be described with three values: be ...

  3. 笔记-scrapy-去重

    笔记-scrapy-去重 1.      scrapy 去重 scrapy 版本:1.5.0 第一步是要找到去重的代码,scrapy在请求入列前去重,具体源码在scheduler.py: def en ...

  4. JAVA EE配TOMCAT

    纯粹就是吧百度教程上的过程走了一遍发现不行综合各种教程配出来了,四张图代表了四个阶段,以后再要配的话直接来这里看.

  5. python sys模块和序列化模块

    sys模块是与python解释器交互的一个接口: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit( ...

  6. SpringMVC---web.xml配置详解

    web.xml中需要配置的内容 1.配置监听器<listener> 它有两个监听器: 1). <!--配置文件加载监听器--> <listener> <lis ...

  7. 解决Android Studio报错:DefaultAndroidProject : Unsupported major.minor version 52.0

    解决办法是你需要将工程根目录build.gradle中的 classpath 'com.android.tools.build:gradle:2.2.0' 更改成 classpath 'com.and ...

  8. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)

    本文导航 -1. 注册并启用红帽订阅 -2. 使用静态 IP 地址配置网络 -3. 设置服务器的主机名称 -4. 更新或升级最小化安装的 CentOS -5. 安装命令行 Web 浏览器 -6. 安装 ...

  9. Java 注解(Annoation)学习笔记

    1 Junit中的@Test为例: 1.1 用注解(@Test)前 private boolean isTestMethod(Method m) { return m.getParameterType ...

  10. 玩转Openstack之Nova中的协同并发(一)

    玩转Openstack之Nova中的协同并发(一) 前不久参加了个Opnstack的Meetup,其中有一个来自EasyStack的大大就Nova中的协同并发做了一番讲解,有所感触,本想当天就总结一下 ...