Using Cairo together with MFC

Using Cairo together with MFC

转载自:http://www.danielsprogramming.com/?cat=35

 

Download Cairo development binaries from http://www.gtk.org/download-windows.html.

Copy the cairo.lib file from /lib and the headers from /include to your MFC Visual C++ project.

Change the MS Visual Studio C++ properties for the project:

Visual Studio C++ input cairo.lib

Example of class using cairo in MFC:

Header file for my base class IGraphics: IGraphics.h

#ifndef IGRAPHICS_H
#define IGRAPHICS_H

namespace MyNameSpace
{
  class IGraphics
  {
  public:
    IGraphics() {}
    virtual ~IGraphics() {}
    virtual void init() = 0;
    virtual void cleanup() = 0;
    virtual void moveTo(double x, double y) = 0;
    virtual void setLineWidth(double lineWidth) = 0;
    virtual void setRGBA(double R, double G, double B, double A) = 0;
    virtual void curveTo(double x1, double y1, double x2, double y2, double x3, double y3) = 0;
    virtual void lineTo(double x, double y) = 0;
    virtual void stroke() = 0;
  };
}

#endif

Header file: CairoGraphicsWin32.h

#ifndef CAIROGRAPHICSWIN32_H
#define CAIROGRAPHICSWIN32_H

#include "stdafx.h"
#include "IGraphics.h"
#include "cairo/cairo-win32.h"

namespace MyNameSpace
{
  class CairoGraphicsWin32 : public IGraphics
  {
  public:
    CairoGraphicsWin32() : IGraphics() {}
    virtual ~CairoGraphicsWin32() {}
    void init();
    void cleanup();
    void moveTo(double x, double y);
    void setLineWidth(double lineWidth);
    void setRGBA(double R, double G, double B, double A);
    void curveTo(double x1, double y1, double x2, double y2, double x3, double y3);
    void lineTo(double x, double y);
    void stroke();

  private:
    HDC m_hdc;
    cairo_surface_t *m_surface;
    cairo_t *m_cr;
  };
}

#endif

Cpp file: CairoGraphicsWin32.cpp

#include "CairoGraphicsWin32.h"

namespace MyNameSpace
{
  void CairoGraphicsWin32::init()
  {
    m_hdc = ((CDialog*)AfxGetMainWnd())->GetDC()->GetSafeHdc(); // Get the device context handle from this graphics object and create a Win32 cairo surface from it.
    m_surface = cairo_win32_surface_create(m_hdc);

    m_cr = cairo_create(m_surface);  // For drawing we need a cairo context.
  }

  void CairoGraphicsWin32::moveTo(double x, double y)
  {
    cairo_move_to(m_cr, x, y);
  }

  void CairoGraphicsWin32::setLineWidth(double lineWidth)
  {
    cairo_set_line_width(m_cr, lineWidth);
  }

  void CairoGraphicsWin32::setRGBA(double R, double G, double B, double A)
  {
    cairo_set_source_rgba(m_cr, R, G, B, A);
  }

  void CairoGraphicsWin32::curveTo(double x1, double y1, double x2, double y2, double x3, double y3)
  {
    cairo_curve_to (m_cr, x1, y1, x2, y2, x3, y3);
  }

  void CairoGraphicsWin32::lineTo(double x, double y)
  {
    cairo_line_to(m_cr, x, y);
  }

  void CairoGraphicsWin32::stroke()
  {
    cairo_stroke(m_cr);
  }

  void CairoGraphicsWin32::cleanup()
  {
    cairo_destroy(m_cr);
    cairo_surface_destroy(m_surface);
  }
}
 

The base class IGraphics makes it easy to add more drawing classes that knows about a particular API.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值