[cairo] Cairo + Win32 GDI + wxWidgets?
Hakki Dogusan
dogusanh at tr.net
Sat Jan 26 13:48:35 PST 2008
Hi,
(Code modified inline)
Sean Dunn yazmış:
> Hi all,
>
>
>
> I just started using wxWidgets with Cairo. My target platform right now
> is Win32. I'm pretty new to wxWidgets, Cairo, and GDI, and I'm madly
> trying to grok it all.
>
>
>
> I'm having trouble getting the following code to show anything, and I'm
> not sure what's wrong. It's supposed to create a Cairo surface based on
> the win32 surface, draw to it, and then bitblt it back to my window (a
> combination of gradients that cover the surface). Nothing shows up,
> though. This sample is based on the Docview wxWidgets sample, and the
> Gradient Cairo sample.
>
>
>
> I'm looking for pointers and perhaps any online resources that discuss
> using Cairo/Win32GDI/wxWidgets all at once (it doesn't seem to be a
> popular combination, most seem to be using GTK/Cairo). Also, what is the
> most efficient manner for drawing to GDI surfaces? In this case, I'm
> doing a bitblt of a buffer.. But is there a way to draw directly with
> double buffering?
>
>
>
cairo_t* CreateContext(wxDC* dc)
{
#ifdef __WXMSW__
//#if CAIRO_HAS_WIN32_SURFACE
HDC hdc = (HDC)dc->GetHDC();
cairo_t *cr = cairo_create(cairo_win32_surface_create( hdc ));
return cr;
#endif
#ifdef __WXGTK__
//#ifdef GDK_WINDOWING_X11
GdkDrawable *drawable = dc->m_window;
cairo_t *cr = gdk_cairo_create( drawable ) ;
return cr;
#endif
return NULL;
}
> void MyView::OnDraw(wxDC *dc)
> {
/*******************************************************************
> // wxFrame* m_frame
> HWND hWnd = (HWND)m_frame->GetHWND();
>
> PAINTSTRUCT ps;
> HDC hDc = BeginPaint(hWnd, &ps);
> RECT rc;
> BOOL succ = GetClientRect(hWnd, &rc);
>
> long width = rc.right - rc.left;
> long height = rc.bottom - rc.top;
> long x = rc.left;
> long y = rc.top;
>
> HDC hBuffer = CreateCompatibleDC(hDc);
> HBITMAP hBitmap = CreateCompatibleBitmap(hDc,width,height);
> HGDIOBJ hOldBitmap = SelectObject(hBuffer, hBitmap);
>
>
>
> //cairo
>
> cairo_surface_t* surf = cairo_win32_surface_create(hBuffer);
> cairo_t* ctx = cairo_create(surf);
*******************************************************************/
wxCoord x = 0, y = 0;
wxCoord width, height;
dc.GetSize(&width, &height);
cairo_t* ctx = CreateContext(dc);
if (ctx == NULL) return;
>
> cairo_pattern_t *pat;
>
> pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, (double)height);
> cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 1);
> cairo_pattern_add_color_stop_rgba (pat, 0, 1, 1, 1, 1);
> cairo_rectangle (ctx, 0, 0, (double)width, (double)height);
> cairo_set_source (ctx, pat);
> cairo_fill (ctx);
> cairo_pattern_destroy (pat);
>
> pat = cairo_pattern_create_radial (115.2, 102.4, 25.6,
> 102.4, 102.4, 128.0);
> cairo_pattern_add_color_stop_rgba (pat, 0, 1, 1, 1, 1);
> cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 1);
> cairo_set_source (ctx, pat);
> cairo_arc (ctx, 128.0, 128.0, 76.8, 0, 2 * M_PI);
> cairo_fill (ctx);
> cairo_pattern_destroy (pat);
>
/******************************************************************
> cairo_surface_finish(surf);
>
>
>
> BitBlt(hDc, 0, 0, width, height, hBuffer, x, y, SRCCOPY);
>
> SelectObject( hBuffer, hOldBitmap );
> DeleteObject( hBitmap );
> DeleteDC( hBuffer );
>
> EndPaint(hWnd, &ps);
*******************************************************************/
cairo_destroy (ctx);
> }
>
>
>
> Any help is appreciated..!
>
>
>
> Thank you,
> Sean
>
>
--
Regards,
Hakki Dogusan
More information about the cairo
mailing list