Простой пример для вывода примитива на поверхность GDI с Cairo на основе примера из справки ЧЯ:
Код:
MODULE PrivCairoWin32;
(* testing GDI output of Cairo library*)
IMPORT S := SYSTEM, WinApi, C := LibsCairo, Cwin := LibsCairoWin32;
CONST
iconId = 1;
VAR
instance: WinApi.HINSTANCE;
mainWnd: WinApi.HWND;
PROCEDURE DrawObject (hdc: WinApi.HDC);
CONST pi = 3.14159265;
VAR ctx: C.cairo_t; surface: C.cairo_surface_t;
BEGIN
surface := Cwin.cairo_win32_surface_create(hdc);
ctx := C.cairo_create(surface);
C.cairo_set_source_rgb (ctx, 0, 0, 1);
C.cairo_arc(ctx, 500, 300, 200.0, 0.0, 2.0 * pi);
C.cairo_stroke(ctx);
C.cairo_destroy(ctx);
C.cairo_surface_destroy(surface);
END DrawObject;
PROCEDURE WndHandler (wnd, msg, wParam, lParam: INTEGER): INTEGER;
VAR res: INTEGER; ps: WinApi.PAINTSTRUCT; dc: WinApi.HDC;
BEGIN
IF msg = WinApi.WM_DESTROY THEN
WinApi.PostQuitMessage(0)
ELSIF msg = WinApi.WM_PAINT THEN
dc := WinApi.BeginPaint(wnd, ps);
DrawObject (dc);
res := WinApi.EndPaint(wnd, ps)
ELSIF msg = WinApi.WM_CHAR THEN
res := WinApi.Beep(800, 200)
ELSE
RETURN WinApi.DefWindowProc(wnd, msg, wParam, lParam)
END;
RETURN 0
END WndHandler;
PROCEDURE OpenWindow;
VAR class: WinApi.WNDCLASS; res: INTEGER;
BEGIN
class.hCursor := WinApi.LoadCursor(0, S.VAL(WinApi.PtrSTR,
WinApi.IDC_ARROW));
class.hIcon := WinApi.LoadIcon(instance, S.VAL(WinApi.PtrSTR, iconId));
class.lpszMenuName := NIL;
class.lpszClassName := "Simple";
class.hbrBackground := WinApi.GetStockObject(WinApi.WHITE_BRUSH);
class.style := WinApi.CS_VREDRAW + WinApi.CS_HREDRAW
(* + WinApi.CS_OWNDC + WinApi.CS_PARENTDC *);
class.hInstance := instance;
class.lpfnWndProc := WndHandler;
class.cbClsExtra := 0;
class.cbWndExtra := 0;
res := WinApi.RegisterClass(class);
mainWnd := WinApi.CreateWindowEx({}, "Simple", "Cairo GDI output demo",
WinApi.WS_OVERLAPPEDWINDOW,
WinApi.CW_USEDEFAULT, WinApi.CW_USEDEFAULT,
WinApi.CW_USEDEFAULT, WinApi.CW_USEDEFAULT,
0, 0, instance, 0);
res := WinApi.ShowWindow(mainWnd, WinApi.SW_SHOWDEFAULT);
res := WinApi.UpdateWindow(mainWnd);
END OpenWindow;
PROCEDURE MainLoop;
VAR msg: WinApi.MSG; res: INTEGER;
BEGIN
WHILE WinApi.GetMessage(msg, 0, 0, 0) # 0 DO
res := WinApi.TranslateMessage(msg);
res := WinApi.DispatchMessage(msg);
END;
WinApi.ExitProcess(msg.wParam)
END MainLoop;
BEGIN
instance := WinApi.GetModuleHandle(NIL);
OpenWindow;
MainLoop
END PrivCairoWin32.
DevLinker.LinkExe cairo2gdi.exe := PrivCairoWin32 ~
Вопрос про переписывание HostPorts с использованием сторонних библиотек типа Cairo лучше отделить в отдельную тему.