⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dc.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
bool  wxDC::CanGetTextExtent() const{    wxCHECK_MSG(Ok(), false, wxT("Invalid DC"));    return true ;}void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *height,                            wxCoord *descent, wxCoord *externalLeading ,                            wxFont *theFont ) const{    wxCHECK_RET(Ok(), wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    wxFont formerFont = m_font ;    if ( theFont )    {        // work around the constness        *((wxFont*)(&m_font)) = *theFont ;    }    MacInstallFont() ;    FontInfo fi ;    ::GetFontInfo( &fi ) ;#if TARGET_CARBON    bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;    if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )        useGetThemeText = false ;#endif    if ( height )        *height = YDEV2LOGREL( fi.descent + fi.ascent ) ;    if ( descent )        *descent =YDEV2LOGREL( fi.descent );    if ( externalLeading )        *externalLeading = YDEV2LOGREL( fi.leading ) ;    int length = strtext.length() ;    int laststop = 0 ;    int i = 0 ;    int curwidth = 0 ;    if ( width )    {        *width = 0 ;#if 0 // apparently we don't have to do all that        while( i < length )        {            if( strtext[i] == 13 || strtext[i] == 10)            {                wxString linetext = strtext.Mid( laststop , i - laststop ) ;                if ( height )                    *height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ;#if TARGET_CARBON                if ( useGetThemeText )                {                    Point bounds={0,0} ;                    SInt16 baseline ;                    wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;                    ::GetThemeTextDimensions( mString,                        kThemeCurrentPortFont,                        kThemeStateActive,                        false,                        &bounds,                        &baseline );                    curwidth = bounds.h ;                }                else#endif                {                    wxCharBuffer text = linetext.mb_str(wxConvLocal) ;                    curwidth = ::TextWidth( text , 0 , strlen(text) ) ;                }                if ( curwidth > *width )                    *width = XDEV2LOGREL( curwidth ) ;                laststop = i+1 ;            }            i++ ;        }        wxString linetext = strtext.Mid( laststop , i - laststop ) ;#endif // 0        wxString linetext = strtext ;#if TARGET_CARBON        if ( useGetThemeText )        {            Point bounds={0,0} ;            SInt16 baseline ;            wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;            ::GetThemeTextDimensions( mString,                kThemeCurrentPortFont,                kThemeStateActive,                false,                &bounds,                &baseline );            curwidth = bounds.h ;        }        else#endif        {            wxCharBuffer text = linetext.mb_str(wxConvLocal) ;            curwidth = ::TextWidth( text , 0 , strlen(text) ) ;        }        if ( curwidth > *width )            *width = XDEV2LOGREL( curwidth ) ;    }    if ( theFont )    {        // work around the constness        *((wxFont*)(&m_font)) = formerFont ;        m_macFontInstalled = false ;    }}bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const{    wxCHECK_MSG(Ok(), false, wxT("Invalid DC"));    widths.Empty();    widths.Add(0, text.length());    if (text.length() == 0)        return false;    wxMacFastPortSetter helper(this) ;    MacInstallFont() ;#if TARGET_CARBON    bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;    if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )        useGetThemeText = false ;    if ( useGetThemeText )    {        // If anybody knows how to do this more efficiently yet still handle        // the fractional glyph widths that may be present when using AA        // fonts, please change it.  Currently it is measuring from the        // begining of the string for each succeding substring, which is much        // slower than this should be.        for (size_t i=0; i<text.length(); i++)        {            wxString str(text.Left(i+1));            Point bounds = {0,0};            SInt16 baseline ;            wxMacCFStringHolder mString(str, m_font.GetEncoding());            ::GetThemeTextDimensions( mString,                                      kThemeCurrentPortFont,                                      kThemeStateActive,                                      false,                                      &bounds,                                      &baseline );            widths[i] = XDEV2LOGREL(bounds.h);        }    }    else#endif    {        wxCharBuffer buff = text.mb_str(wxConvLocal);        size_t len = strlen(buff);        short* measurements = new short[len+1];        MeasureText(len, buff.data(), measurements);        // Copy to widths, starting at measurements[1]        // NOTE: this doesn't take into account any multi-byte characters        // in buff, it probabkly should...        for (size_t i=0; i<text.length(); i++)            widths[i] = XDEV2LOGREL(measurements[i+1]);        delete [] measurements;    }    return true;}wxCoord   wxDC::GetCharWidth(void) const{    wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    MacInstallFont() ;    int width = 0 ;#if TARGET_CARBON    bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;    if ( UMAGetSystemVersion() < 0x1000 || ((wxFont*)&m_font)->GetNoAntiAliasing() )        useGetThemeText = false ;#endif    char text[] = "g" ;#if TARGET_CARBON    if ( useGetThemeText )    {        Point bounds={0,0} ;        SInt16 baseline ;        CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text , 1 , CFStringGetSystemEncoding(), false ) ;        ::GetThemeTextDimensions( mString,            kThemeCurrentPortFont,            kThemeStateActive,            false,            &bounds,            &baseline );        CFRelease( mString ) ;        width = bounds.h ;    }    else#endif    {        width = ::TextWidth( text , 0 , 1 ) ;    }    return YDEV2LOGREL(width) ;}wxCoord   wxDC::GetCharHeight(void) const{    wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    MacInstallFont() ;    FontInfo fi ;    ::GetFontInfo( &fi ) ;    return YDEV2LOGREL( fi.descent + fi.ascent );}void  wxDC::Clear(void){    wxCHECK_RET(Ok(), wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    Rect rect = { -31000 , -31000 , 31000 , 31000 } ;    if (m_backgroundBrush.GetStyle() != wxTRANSPARENT)    {        ::PenNormal() ;        //MacInstallBrush() ;        MacSetupBackgroundForCurrentPort( m_backgroundBrush ) ;        ::EraseRect( &rect ) ;    }}void wxDC::MacInstallFont() const{    wxCHECK_RET(Ok(), wxT("Invalid DC"));    //    if ( m_macFontInstalled )    //        return ;    Pattern blackColor ;    MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;    if ( m_font.Ok() )    {        ::TextFont( m_font.GetMacFontNum() ) ;        ::TextSize( (short)(m_scaleY * m_font.GetMacFontSize()) ) ;        ::TextFace( m_font.GetMacFontStyle() ) ;        m_macFontInstalled = true ;        m_macBrushInstalled = false ;        m_macPenInstalled = false ;        RGBColor forecolor = MAC_WXCOLORREF( m_textForegroundColour.GetPixel());        RGBColor backcolor = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel());        ::RGBForeColor( &forecolor );        ::RGBBackColor( &backcolor );    }    else    {        FontFamilyID fontId ;        Str255 fontName ;        SInt16 fontSize ;        Style fontStyle ;        GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;        GetFNum( fontName, &fontId );        ::TextFont( fontId ) ;        ::TextSize( short(m_scaleY * fontSize) ) ;        ::TextFace( fontStyle ) ;        // todo reset after spacing changes - or store the current spacing somewhere        m_macFontInstalled = true ;        m_macBrushInstalled = false ;        m_macPenInstalled = false ;        RGBColor forecolor = MAC_WXCOLORREF( m_textForegroundColour.GetPixel());        RGBColor backcolor = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel());        ::RGBForeColor( &forecolor );        ::RGBBackColor( &backcolor );    }    short mode = patCopy ;    // todo :    switch( m_logicalFunction )    {    case wxCOPY:       // src        mode = patCopy ;        break ;    case wxINVERT:     // NOT dst        ::PenPat(GetQDGlobalsBlack(&blackColor));        mode = patXor ;        break ;    case wxXOR:        // src XOR dst        mode = patXor ;        break ;    case wxOR_REVERSE: // src OR (NOT dst)        mode = notPatOr ;        break ;    case wxSRC_INVERT: // (NOT src)        mode = notPatCopy ;        break ;    case wxAND: // src AND dst        mode = adMin ;        break ;        // unsupported TODO    case wxCLEAR:      // 0    case wxAND_REVERSE:// src AND (NOT dst)    case wxAND_INVERT: // (NOT src) AND dst    case wxNO_OP:      // dst    case wxNOR:        // (NOT src) AND (NOT dst)    case wxEQUIV:      // (NOT src) XOR dst    case wxOR_INVERT:  // (NOT src) OR dst    case wxNAND:       // (NOT src) OR (NOT dst)    case wxOR:         // src OR dst    case wxSET:        // 1        //        case wxSRC_OR:     // source _bitmap_ OR destination        //        case wxSRC_AND:     // source _bitmap_ AND destination        break ;    }    ::PenMode( mode ) ;    OSStatus status = noErr ;    Fixed atsuSize = IntToFixed( int(m_scaleY * m_font.GetMacFontSize()) ) ;    Style qdStyle = m_font.GetMacFontStyle() ;    ATSUFontID    atsuFont = m_font.GetMacATSUFontID() ;    status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUIStyle) ;    wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;    ATSUAttributeTag atsuTags[] =    {        kATSUFontTag ,            kATSUSizeTag ,            //        kATSUColorTag ,            //        kATSUBaselineClassTag ,            kATSUVerticalCharacterTag,            kATSUQDBoldfaceTag ,            kATSUQDItalicTag ,            kATSUQDUnderlineTag ,            kATSUQDCondensedTag ,            kATSUQDExtendedTag ,    } ;    ByteCount atsuSizes[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =    {        sizeof( ATSUFontID ) ,            sizeof( Fixed ) ,            //        sizeof( RGBColor ) ,            //        sizeof( BslnBaselineClass ) ,            sizeof( ATSUVerticalCharacterType),            sizeof( Boolean ) ,            sizeof( Boolean ) ,            sizeof( Boolean ) ,            sizeof( Boolean ) ,            sizeof( Boolean ) ,    } ;    Boolean kTrue = true ;    Boolean kFalse = false ;    //BslnBaselineClass kBaselineDefault = kBSLNHangingBaseline ;    ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal;    ATSUAttributeValuePtr    atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =    {        &atsuFont ,            &atsuSize ,            //        &MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) ,            //        &kBaselineDefault ,            &kHorizontal,            (qdStyle & bold) ? &kTrue : &kFalse ,            (qdStyle & italic) ? &kTrue : &kFalse ,            (qdStyle & underline) ? &kTrue : &kFalse ,            (qdStyle & condense) ? &kTrue : &kFalse ,            (qdStyle & extend) ? &kTrue : &kFalse ,    } ;    status = ::ATSUSetAttributes((ATSUStyle)m_macATSUIStyle, sizeof(atsuTags)/sizeof(ATSUAttributeTag) ,        atsuTags, atsuSizes, atsuValues);    wxASSERT_MSG( status == noErr , wxT("couldn't set create ATSU style") ) ;}Pattern gPatterns[] ={   // hatch patterns    { { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } } ,    { { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } } ,    { { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } } ,    { { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } } ,    { { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } } ,    { { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } } ,    { { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } } ,    // dash patterns    { { 0xCC , 0x99 , 0x33 , 0x66 , 0xCC , 0x99 , 0x33 , 0x66 } } , // DOT    { { 0xFE , 0xFD , 0xFB , 0xF7 , 0xEF , 0xDF , 0xBF , 0x7F } } , // LONG_DASH    { { 0xEE , 0xDD , 0xBB , 0x77 , 0xEE , 0xDD , 0xBB , 0x77 } } , // SHORT_DASH    { { 0xDE , 0xBD , 0x7B , 0xF6 , 0xED , 0xDB , 0xB7 , 0x6F } } , // DOT_DASH} ;static void wxMacGetPattern(int penStyle, Pattern *pattern){    int index = 0;  // solid pattern by default    switch(penStyle)    {        // hatches        case wxBDIAGONAL_HATCH:     index = 1; break;        case wxFDIAGONAL_HATCH:     index = 2; break;        case wxCROSS_HATCH:         index = 3; break;        case wxHORIZONTAL_HATCH:    index = 4; break;        case wxVERTICAL_HATCH:      index = 5; break;        case wxCROSSDIAG_HATCH:     index = 6; break;        // dashes        case wxDOT:                 index = 7; break;        case wxLONG_DASH:           index = 8; break;        case wx

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -