www.pudn.com > GdiplusTest16.zip > GdiPlusFont.h


/**************************************************************************\ 
* 
* Copyright (c) 1998-2001, Microsoft Corp.  All Rights Reserved. 
* 
* Module Name: 
* 
*   GdiplusFont.h 
* 
* Abstract: 
* 
*   GDI+ Font class 
* 
\**************************************************************************/ 
 
#ifndef _GDIPLUSFONT_H 
#define _GDIPLUSFONT_H 
 
inline 
Font::Font(IN HDC hdc) 
{ 
    GpFont *font = NULL; 
    lastResult = DllExports::GdipCreateFontFromDC(hdc, &font); 
 
    SetNativeFont(font); 
} 
 
inline 
Font::Font(IN HDC hdc, 
           IN const HFONT hfont) 
{ 
    GpFont *font = NULL; 
 
    if (hfont) 
    { 
        LOGFONTA lf; 
 
        if(GetObjectA(hfont, sizeof(LOGFONTA), &lf)) 
            lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, &lf, &font); 
        else 
            lastResult = DllExports::GdipCreateFontFromDC(hdc, &font); 
    } 
    else 
    { 
        lastResult = DllExports::GdipCreateFontFromDC(hdc, &font); 
    } 
 
    SetNativeFont(font); 
} 
 
inline 
Font::Font(IN HDC hdc, 
           IN const LOGFONTW* logfont) 
{ 
    GpFont *font = NULL; 
    if (logfont) 
    { 
        lastResult = DllExports::GdipCreateFontFromLogfontW(hdc, logfont, &font); 
    } 
    else 
    { 
        lastResult = DllExports::GdipCreateFontFromDC(hdc, &font); 
    } 
 
    SetNativeFont(font); 
} 
 
inline 
Font::Font(IN HDC hdc, 
           IN const LOGFONTA* logfont) 
{ 
    GpFont *font = NULL; 
 
    if (logfont) 
    { 
        lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, logfont, &font); 
    } 
    else 
    { 
        lastResult = DllExports::GdipCreateFontFromDC(hdc, &font); 
    } 
 
    SetNativeFont(font); 
} 
 
inline 
Font::Font( 
     IN const FontFamily * family, 
     IN REAL         emSize, 
     IN INT          style, 
     IN Unit         unit 
) 
{ 
    GpFont *font = NULL; 
 
    lastResult = DllExports::GdipCreateFont(family ? family->nativeFamily : NULL, 
                    emSize, 
                    style, 
                    unit, 
                    &font); 
 
    SetNativeFont(font); 
} 
 
inline 
Font::Font( 
     IN const WCHAR *          familyName, 
     IN REAL                   emSize, 
     IN INT                    style, 
     IN Unit                   unit, 
     IN const FontCollection * fontCollection 
) 
{ 
    nativeFont = NULL; 
 
    FontFamily family(familyName, fontCollection); 
    GpFontFamily *nativeFamily = family.nativeFamily; 
 
    lastResult = family.GetLastStatus(); 
 
    if (lastResult != Ok) 
    { 
        nativeFamily = FontFamily::GenericSansSerif()->nativeFamily; 
        lastResult = FontFamily::GenericSansSerif()->lastResult; 
        if (lastResult != Ok) 
            return; 
    } 
 
    lastResult = DllExports::GdipCreateFont(nativeFamily, 
                            emSize, 
                            style, 
                            unit, 
                            &nativeFont); 
 
    if (lastResult != Ok) 
    { 
        nativeFamily = FontFamily::GenericSansSerif()->nativeFamily; 
        lastResult = FontFamily::GenericSansSerif()->lastResult; 
        if (lastResult != Ok) 
            return; 
 
        lastResult = DllExports::GdipCreateFont( 
            nativeFamily, 
            emSize, 
            style, 
            unit, 
            &nativeFont); 
    } 
} 
 
inline Status 
Font::GetLogFontA(IN const Graphics *g, 
                  OUT LOGFONTA *logfontA) const 
{ 
    return SetStatus(DllExports::GdipGetLogFontA(nativeFont, g ? g->nativeGraphics : NULL, logfontA)); 
 
} 
 
inline Status 
Font::GetLogFontW(IN const Graphics *g, 
                  OUT LOGFONTW *logfontW) const 
{ 
    return SetStatus(DllExports::GdipGetLogFontW(nativeFont, g ? g->nativeGraphics : NULL, logfontW)); 
} 
 
 
inline Font* 
Font::Clone() const 
{ 
    GpFont *cloneFont = NULL; 
 
    SetStatus(DllExports::GdipCloneFont(nativeFont, &cloneFont)); 
 
    return new Font(cloneFont, lastResult); 
} 
 
inline 
Font::~Font() 
{ 
    DllExports::GdipDeleteFont(nativeFont); 
} 
 
// Operations 
 
inline BOOL 
Font::IsAvailable() const 
{ 
    return (nativeFont ? TRUE : FALSE); 
} 
 
inline Status 
Font::GetFamily(OUT FontFamily *family) const 
{ 
    if (family == NULL) 
    { 
        return SetStatus(InvalidParameter); 
    } 
 
    Status status = DllExports::GdipGetFamily(nativeFont, &(family->nativeFamily)); 
    family->SetStatus(status); 
 
    return SetStatus(status); 
} 
 
inline INT 
Font::GetStyle() const 
{ 
    INT style; 
 
    SetStatus(DllExports::GdipGetFontStyle(nativeFont, &style)); 
 
    return style; 
} 
 
inline REAL 
Font::GetSize() const 
{ 
    REAL size; 
    SetStatus(DllExports::GdipGetFontSize(nativeFont, &size)); 
    return size; 
} 
 
inline Unit 
Font::GetUnit() const 
{ 
    Unit unit; 
    SetStatus(DllExports::GdipGetFontUnit(nativeFont, &unit)); 
    return unit; 
} 
 
inline REAL 
Font::GetHeight(IN const Graphics *graphics) const 
{ 
    REAL height; 
    SetStatus(DllExports::GdipGetFontHeight( 
        nativeFont, 
        graphics ? graphics->nativeGraphics : NULL, 
        &height 
    )); 
    return height; 
} 
 
 
inline REAL 
Font::GetHeight(IN REAL dpi) const 
{ 
    REAL height; 
    SetStatus(DllExports::GdipGetFontHeightGivenDPI(nativeFont, dpi, &height)); 
    return height; 
} 
 
inline 
Font::Font(IN GpFont* font, 
           IN Status status) 
{ 
    lastResult = status; 
    SetNativeFont(font); 
} 
 
inline VOID 
Font::SetNativeFont(GpFont *Font) 
{ 
    nativeFont = Font; 
} 
 
inline Status 
Font::GetLastStatus(void) const 
{ 
    return lastResult; 
} 
 
inline Status 
Font::SetStatus(IN Status status) const 
{ 
    if (status != Ok) 
        return (lastResult = status); 
    else 
        return status; 
} 
 
#endif