我设法找到了这段代码片段并用Cairo编译:
#define LIBCAIRO_EXPORTS
#include <cairo/cairo.h>
#include <cairo/cairo-win32.h>
int main(int argc, char** argv)
{
cairo_surface_t *surface;
cairo_t *cr;
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 240, 80);
cr = cairo_create (surface);
cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_BOLD);
cairo_set_font_size (cr, 32.0);
cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
cairo_move_to (cr, 10.0, 50.0);
cairo_show_text (cr, "Hello, World");
cairo_destroy (cr);
cairo_surface_write_to_png (surface, "hello.png");
cairo_surface_destroy (surface);
return 0;
}
正如您所看到的,它创建了一个带有“Hello World”文本的图像并将其保存在驱动器上。 如何创建win32曲面并绘制到窗口?
我无法使用:cairo_win32_surface_create
它需要hdc
,我不知道那是什么。我试着阅读一些教程,但似乎没有人会引导您打印到新窗口。
我找到了这个链接: http://windrealm.org/cairo-gdi/
它有一个工作演示,但它使用int WINAPI WinMain
。我不想使用它。
答案 0 :(得分:5)
有几种方法可以在Windows中获取设备上下文的句柄。例如,WM_PAINT
处理程序通常会调用BeginPaint
来获取设备上下文,将内容更新到窗口然后调用EndPaint
。如果无法使用BeginPaint
和EndPaint
(例如,在WM_PAINT消息之外),您可以使用GetDC
更新窗口,然后拨打ReleaseDC
。
BeginPaint
和GetDC
返回的设备上下文允许您直接绘制到窗口。但有时您想直接绘制位图。在这种情况下,您可以调用CreateCompatibleDC
,选择要绘制的位图,绘制图形,然后调用DeleteDC
。
在您的情况下,您正在寻找的内容如下:
HDC dc = GetDC(windowHandle);
cairo_win32_surface_create(dc);
ReleaseDC(windowHandle, dc);
如果您不想在此阶段创建窗口(因为您只是保存图像),您可以使用桌面窗口获取设备上下文。
HWND windowHandle = GetDesktopWindow();
HDC dc = GetDC(windowHandle);
cairo_win32_surface_create(dc);
ReleaseDC(windowHandle, dc);
还有其他调用可用于获取或创建设备上下文。您可以找到这些及相关功能的列表here
创建和使用窗口需要更多参与,因此我将为您提供基本步骤和一些可用于解决的示例代码。创建和使用窗口......
RegisterClass
CreateWindow
或CreateWindowEx
GetMessage
,TranslateMessage
和DispatchMessage
此外,您必须实现一个函数来处理窗口消息的处理,例如WM_PAINT
。
注意:以下代码是UNTESTED但应该是正确的。
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_PAINT)
{
HDC dc;
PAINTSTRUCT ps;
dc = BeginPaint(hwnd, &ps);
// do your drawing here
EndPaint(hwnd, &ps);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szClassName[] = TEXT("DrawSurfaceClass");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
///////////////////////////////////////////////////////////
// Register a window "class"
///////////////////////////////////////////////////////////
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground =(HBRUSH)COLOR_WINDOW;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szClassName;
if(!RegisterClass(&wndclass))
{
// error
return 1;
}
///////////////////////////////////////////////////////////
// Create the window and display it (if iCmdShow says so)
///////////////////////////////////////////////////////////
hwnd = CreateWindow(
szAppName,
TEXT("Draw Surface"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
///////////////////////////////////////////////////////////
// Run the message pump so the window proc recieves events
///////////////////////////////////////////////////////////
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
答案 1 :(得分:1)
我找到了初学者打开窗口并在其中绘制一些线条的最简单方法,即下载并设置gtk +并使用ZetCode的教程。
您可能需要从此处下载GTK: http://gtk.hexchat.org/
设置Gtk +: Using GTK+ in Visual C++
开罗教程: http://zetcode.com/gfx/cairo/
请记住将所有GTK的dll文件包含在已编译的可执行文件所在的目录中。