VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 612|回复: 0

[转载] 【GDI+】MFC画图- 消除锯齿

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-6-10 21:32:34 | 显示全部楼层 |阅读模式
在常规条件下,MFC画出来的图形、文字都是有锯齿的。如下图所示:
【GDI+】MFC画图- 消除锯齿

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

一、建立一个简单的MFC应用
一个简单的MFC应用包含两个文件,Hello.h和Hello.cpp。建立的方法是在VS中建立一个空项目,然而添加头文件Hello.h和源文件Hello.cpp
  1. //Hello.h
  2. #include <afxwin.h>
  3. class CMyApp : public CWinApp
  4. {
  5. public:
  6.     virtual BOOL InitInstance();
  7. };

  8. class CMainWindow : public CFrameWnd
  9. {
  10. public:
  11.     CMainWindow();
  12. protected:
  13.     afx_msg void OnPaint();
  14.     DECLARE_MESSAGE_MAP()
  15. };
复制代码

  1. // Hello.cpp
  2. #include <afxwin.h>
  3. #include "Hello.h"

  4. CMyApp myApp;

  5. BOOL CMyApp::InitInstance()
  6. {
  7.     m_pMainWnd  = new CMainWindow;
  8.     m_pMainWnd->ShowWindow(m_nCmdShow);
  9.     m_pMainWnd->UpdateWindow();
  10.     return TRUE;
  11. }

  12. BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
  13.     ON_WM_PAINT()
  14. END_MESSAGE_MAP()

  15. CMainWindow::CMainWindow()
  16. {
  17.     Create(NULL, _T("The Hello Application"));
  18. }

  19. void CMainWindow::OnPaint()
  20. {
  21.     CPaintDC dc(this);
  22.     dc.MoveTo(10, 10);
  23.     dc.LineTo(200, 400);
  24.     dc.MoveTo(10, 15);
  25.     dc.LineTo(200, 500);
  26. }
复制代码


下面开始编译程序。这里要注意的是,应该修改项目属性中【链接器】的设置,在【高级】选项卡中的【入口】选项中,填入WinMainCRTStartup。此外,要遭项目属性的【配置属性】选项卡中,修改【MFC的使用】项目,修改为【在共享DLL中使用MFC】。
这样就可以编辑并运行程序了。程序运行的效果如上图所示,所画的两条曲线是带有锯齿的。 要想得到反锯齿的、渲染细腻的线条,就要对上述程序做一些修改。
首先要修改头文件Hello.h,将GDI+的头文件引入,并在CMyApp中定义新的成员变量m_gdiplusToken,覆盖CMyApp继承而来的ExitInstance( )函数。具体如下:
  1. //Hello.h
  2. #include <afxwin.h>
  3. #include <Gdiplus.h> //引入头函数
  4. #pragma comment(lib, "Gdiplus.lib")  // 引入链接库
  5. class CMyApp : public CWinApp
  6. {
  7. public:
  8.     virtual BOOL InitInstance();
  9.     virtual int ExitInstance();
  10. private:
  11.     ULONG_PTR m_gdiplusToken;
  12. };

  13. class CMainWindow : public CFrameWnd
  14. {
  15. public:
  16.     CMainWindow();
  17. protected:
  18.     afx_msg void OnPaint();
  19.     DECLARE_MESSAGE_MAP()
  20. };
复制代码


下面需要在Hello.cpp中做出相应的调整。主要调整的是 CMyApp::InitInstance(), CMyApp::ExitInstance() 和 CMainWindow::OnPaint()
  1. // Hello.cpp
  2. #include <afxwin.h>
  3. #include "Hello.h"

  4. CMyApp myApp;

  5. BOOL CMyApp::InitInstance()
  6. {
  7.     m_gdiplusToken = 0;
  8.     Gdiplus::GdiplusStartupInput gpSI;
  9.     Gdiplus::GdiplusStartup(&m_gdiplusToken, &gpSI, NULL);
  10.     m_pMainWnd = new CMainWindow;
  11.     m_pMainWnd->ShowWindow(m_nCmdShow);
  12.     m_pMainWnd->UpdateWindow();
  13.     return TRUE;
  14. }

  15. int CMyApp::ExitInstance()
  16. {
  17.     Gdiplus::GdiplusShutdown(m_gdiplusToken);
  18.     return __super::ExitInstance();
  19. }

  20. BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
  21.     ON_WM_PAINT()
  22. END_MESSAGE_MAP()

  23. CMainWindow::CMainWindow()
  24. {
  25.     Create(NULL, _T("The Hello Application"));
  26. }

  27. void CMainWindow::OnPaint()
  28. {
  29.     CPaintDC dc(this);
  30.     Gdiplus::Graphics graphics(dc.m_hDC);
  31.     Gdiplus::Pen red(Gdiplus::Color(255, 255, 0, 0), 1);
  32.     Gdiplus::Pen blue(Gdiplus::Color(255, 0, 0, 255), 1);
  33.     graphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
  34.     graphics.DrawLine(&red, 10, 10, 200, 400);
  35.     graphics.DrawLine(&blue, 10, 15, 200, 500);
  36. }
复制代码


这样修改后的程序就能够画出反锯齿的曲线了。如下图所示:
【GDI+】MFC画图- 消除锯齿




上一篇:VS2013减小MFC对话框生成的EXE体积
下一篇:VS多核编译 =&gt; 加快程序编译速度

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-12 12:20

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表