diff --git a/samples/printing/printing.cpp b/samples/printing/printing.cpp index 682dac26c3..0050833cdc 100644 --- a/samples/printing/printing.cpp +++ b/samples/printing/printing.cpp @@ -38,6 +38,7 @@ #if wxUSE_GRAPHICS_CONTEXT #include "wx/graphics.h" + #include "wx/scopedptr.h" #endif #ifdef __WXMAC__ @@ -219,7 +220,7 @@ void MyApp::Draw(wxDC&dc) dc.DrawBitmap( m_bitmap, 10, 10 ); #if wxUSE_GRAPHICS_CONTEXT - wxGraphicsContext *gc = wxGraphicsContext::CreateFromUnknownDC(dc); + wxScopedPtr gc(wxGraphicsContext::CreateFromUnknownDC(dc)); if (gc) { @@ -243,12 +244,10 @@ void MyApp::Draw(wxDC&dc) gc->DrawText(text, 25.0, 60.0); // draw rectangle around the text - double w, h, d, el; - gc->GetTextExtent(text, &w, &h, &d, &el); + double w, h; + gc->GetTextExtent(text, &w, &h); gc->SetPen( *wxBLACK_PEN ); gc->DrawRectangle(25.0, 60.0, w, h); - - delete gc; } #endif diff --git a/src/msw/graphics.cpp b/src/msw/graphics.cpp index ebecbeb72a..4d201c7a9f 100644 --- a/src/msw/graphics.cpp +++ b/src/msw/graphics.cpp @@ -2111,33 +2111,40 @@ void wxGDIPlusContext::GetTextExtent( const wxString &str, wxDouble *width, wxDo wxCHECK_RET( !m_font.IsNull(), wxT("wxGDIPlusContext::GetTextExtent - no valid font set") ); wxWCharBuffer s = str.wc_str( *wxConvUI ); - FontFamily ffamily ; Font* f = ((wxGDIPlusFontData*)m_font.GetRefData())->GetGDIPlusFont(); - f->GetFamily(&ffamily) ; + // Get the font metrics if we actually need them. + if ( descent || externalLeading || (height && str.empty()) ) + { + FontFamily ffamily ; + f->GetFamily(&ffamily) ; - REAL factorY = m_fontScaleRatio; + REAL factorY = m_fontScaleRatio; - // Notice that we must use the real font style or the results would be - // incorrect for italic/bold fonts. - const INT style = f->GetStyle(); - const REAL size = f->GetSize(); - const REAL emHeight = ffamily.GetEmHeight(style); - REAL rDescent = ffamily.GetCellDescent(style) * size / emHeight; - REAL rAscent = ffamily.GetCellAscent(style) * size / emHeight; - REAL rHeight = ffamily.GetLineSpacing(style) * size / emHeight; + // Notice that we must use the real font style or the results would be + // incorrect for italic/bold fonts. + const INT style = f->GetStyle(); + const REAL size = f->GetSize(); + const REAL emHeight = ffamily.GetEmHeight(style); + REAL rDescent = ffamily.GetCellDescent(style) * size / emHeight; + REAL rAscent = ffamily.GetCellAscent(style) * size / emHeight; + REAL rHeight = ffamily.GetLineSpacing(style) * size / emHeight; + + if ( height && str.empty() ) + *height = rHeight * factorY; + if ( descent ) + *descent = rDescent * factorY; + if ( externalLeading ) + *externalLeading = (rHeight - rAscent - rDescent) * factorY; + } - if ( height ) - *height = rHeight * factorY; - if ( descent ) - *descent = rDescent * factorY; - if ( externalLeading ) - *externalLeading = (rHeight - rAscent - rDescent) * factorY; // measuring empty strings is not guaranteed, so do it by hand if ( str.IsEmpty()) { if ( width ) *width = 0 ; + + // Height already assigned above if necessary. } else {