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:
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.