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

📄 dccg.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    CGContextRestoreGState( cgContext );    CGContextSaveGState( cgContext );    m_graphicContext->SetPen( m_pen ) ;    m_graphicContext->SetBrush( m_brush ) ;    m_clipping = false;}void wxDC::DoGetSizeMM( int* width, int* height ) const{    int w = 0, h = 0;    GetSize( &w, &h );    if (width)        *width = long( double(w) / (m_scaleX * m_mm_to_pix_x) );    if (height)        *height = long( double(h) / (m_scaleY * m_mm_to_pix_y) );}void wxDC::SetTextForeground( const wxColour &col ){    wxCHECK_RET( Ok(), wxT("wxDC(cg)::SetTextForeground - invalid DC") );    if ( col != m_textForegroundColour )    {        m_textForegroundColour = col;        m_graphicContext->SetTextColor( col );        // in the current implementation the font contains the text color        m_graphicContext->SetFont(m_font);    }}void wxDC::SetTextBackground( const wxColour &col ){    wxCHECK_RET( Ok(), wxT("wxDC(cg)::SetTextBackground - invalid DC") );    m_textBackgroundColour = col;}void wxDC::SetMapMode( int mode ){    switch (mode)    {    case wxMM_TWIPS:        SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y );        break;    case wxMM_POINTS:        SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y );        break;    case wxMM_METRIC:        SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );        break;    case wxMM_LOMETRIC:        SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 );        break;    case wxMM_TEXT:    default:        SetLogicalScale( 1.0, 1.0 );        break;    }    if (mode != wxMM_TEXT)    {        m_needComputeScaleX =        m_needComputeScaleY = true;    }}void wxDC::SetUserScale( double x, double y ){    // allow negative ? -> no    m_userScaleX = x;    m_userScaleY = y;    ComputeScaleAndOrigin();}void wxDC::SetLogicalScale( double x, double y ){    // allow negative ?    m_logicalScaleX = x;    m_logicalScaleY = y;    ComputeScaleAndOrigin();}void wxDC::SetLogicalOrigin( wxCoord x, wxCoord y ){    m_logicalOriginX = x * m_signX;   // is this still correct ?    m_logicalOriginY = y * m_signY;    ComputeScaleAndOrigin();}void wxDC::SetDeviceOrigin( wxCoord x, wxCoord y ){    m_externalDeviceOriginX = x;    m_externalDeviceOriginY = y;    ComputeScaleAndOrigin();}void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ){    m_signX = (xLeftRight ?  1 : -1);    m_signY = (yBottomUp ? -1 :  1);    ComputeScaleAndOrigin();}wxSize wxDC::GetPPI() const{    return wxSize(72, 72);}int wxDC::GetDepth() const{    return 32;}void wxDC::ComputeScaleAndOrigin(){    // CMB: copy scale to see if it changes    double origScaleX = m_scaleX;    double origScaleY = m_scaleY;    m_scaleX = m_logicalScaleX * m_userScaleX;    m_scaleY = m_logicalScaleY * m_userScaleY;    m_deviceOriginX = m_externalDeviceOriginX;    m_deviceOriginY = m_externalDeviceOriginY;    // CMB: if scale has changed call SetPen to recalulate the line width    if (m_scaleX != origScaleX || m_scaleY != origScaleY)    {        // this is a bit artificial, but we need to force wxDC to think        // the pen has changed        wxPen pen( GetPen() );        m_pen = wxNullPen;        SetPen( pen );    }}void wxDC::SetPalette( const wxPalette& palette ){}void wxDC::SetBackgroundMode( int mode ){    m_backgroundMode = mode ;}void wxDC::SetFont( const wxFont &font ){    m_font = font;    if ( m_graphicContext )        m_graphicContext->SetFont( font ) ;}void wxDC::SetPen( const wxPen &pen ){    if ( m_pen == pen )        return ;    m_pen = pen;    if ( m_graphicContext )    {        if ( m_pen.GetStyle() == wxSOLID || m_pen.GetStyle() == wxTRANSPARENT )        {            m_graphicContext->SetPen( m_pen ) ;        }        else        {            // we have to compensate for moved device origins etc. otherwise patterned pens are standing still            // eg when using a wxScrollWindow and scrolling around            int origX = XLOG2DEVMAC( 0 ) ;            int origY = YLOG2DEVMAC( 0 ) ;            m_graphicContext->Translate( origX , origY ) ;            m_graphicContext->SetPen( m_pen ) ;            m_graphicContext->Translate( -origX , -origY ) ;        }    }}void wxDC::SetBrush( const wxBrush &brush ){    if (m_brush == brush)        return;    m_brush = brush;    if ( m_graphicContext )    {        if ( brush.GetStyle() == wxSOLID || brush.GetStyle() == wxTRANSPARENT )        {            m_graphicContext->SetBrush( m_brush ) ;        }        else        {            // we have to compensate for moved device origins etc. otherwise patterned brushes are standing still            // eg when using a wxScrollWindow and scrolling around            int origX = XLOG2DEVMAC(0) ;            int origY = YLOG2DEVMAC(0) ;            m_graphicContext->Translate( origX , origY ) ;            m_graphicContext->SetBrush( m_brush ) ;            m_graphicContext->Translate( -origX , -origY ) ;        }    }}void wxDC::SetBackground( const wxBrush &brush ){    if (m_backgroundBrush == brush)        return;    m_backgroundBrush = brush;    if (!m_backgroundBrush.Ok())        return;}void wxDC::SetLogicalFunction( int function ){    if (m_logicalFunction == function)        return;    m_logicalFunction = function ;#if wxMAC_USE_CORE_GRAPHICS_BLEND_MODES    CGContextRef cgContext = ((wxMacCGContext*)(m_graphicContext))->GetNativeContext() ;    if ( m_logicalFunction == wxCOPY )        CGContextSetBlendMode( cgContext, kCGBlendModeNormal ) ;    else if ( m_logicalFunction == wxINVERT )        CGContextSetBlendMode( cgContext, kCGBlendModeExclusion ) ;    else        CGContextSetBlendMode( cgContext, kCGBlendModeNormal ) ;#endif}extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y,                          const wxColour & col, int style);bool wxDC::DoFloodFill(wxCoord x, wxCoord y,                       const wxColour& col, int style){    return wxDoFloodFill(this, x, y, col, style);}bool wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const{    wxCHECK_MSG( Ok(), false, wxT("wxDC(cg)::DoGetPixel - invalid DC") );    RGBColor colour;#ifndef __LP64__    wxMacPortSaver helper((CGrafPtr)m_macPort) ;    // NB: GetCPixel is a deprecated QD call, and a slow one at that    GetCPixel(        XLOG2DEVMAC(x) + m_macLocalOriginInPort.x - m_macLocalOrigin.x,        YLOG2DEVMAC(y) + m_macLocalOriginInPort.y - m_macLocalOrigin.y, &colour );#endif    // convert from Mac colour to wx    col->Set( colour.red >> 8, colour.green >> 8, colour.blue >> 8 );    return true ;}void wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 ){    wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawLine - invalid DC") );#if !wxMAC_USE_CORE_GRAPHICS_BLEND_MODES    if ( m_logicalFunction != wxCOPY )        return ;#endif    wxCoord xx1 = XLOG2DEVMAC(x1) ;    wxCoord yy1 = YLOG2DEVMAC(y1) ;    wxCoord xx2 = XLOG2DEVMAC(x2) ;    wxCoord yy2 = YLOG2DEVMAC(y2) ;    wxGraphicPath* path = m_graphicContext->CreatePath() ;    path->MoveToPoint( xx1, yy1 ) ;    path->AddLineToPoint( xx2 , yy2 ) ;    path->CloseSubpath() ;    m_graphicContext->StrokePath( path ) ;    delete path ;    CalcBoundingBox(x1, y1);    CalcBoundingBox(x2, y2);}void wxDC::DoCrossHair( wxCoord x, wxCoord y ){    wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoCrossHair - invalid DC") );    if ( m_logicalFunction != wxCOPY )        return ;    int w = 0, h = 0;    GetSize( &w, &h );    wxCoord xx = XLOG2DEVMAC(x);    wxCoord yy = YLOG2DEVMAC(y);    wxGraphicPath* path = m_graphicContext->CreatePath() ;    path->MoveToPoint( XLOG2DEVMAC(0), yy ) ;    path->AddLineToPoint( XLOG2DEVMAC(w), yy ) ;    path->CloseSubpath() ;    path->MoveToPoint( xx, YLOG2DEVMAC(0) ) ;    path->AddLineToPoint( xx, YLOG2DEVMAC(h) ) ;    path->CloseSubpath() ;    m_graphicContext->StrokePath( path ) ;    delete path ;    CalcBoundingBox(x, y);    CalcBoundingBox(x + w, y + h);}void wxDC::DoDrawArc( wxCoord x1, wxCoord y1,                      wxCoord x2, wxCoord y2,                      wxCoord xc, wxCoord yc ){    wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawArc - invalid DC") );    if ( m_logicalFunction != wxCOPY )        return ;    wxCoord xx1 = XLOG2DEVMAC(x1);    wxCoord yy1 = YLOG2DEVMAC(y1);    wxCoord xx2 = XLOG2DEVMAC(x2);    wxCoord yy2 = YLOG2DEVMAC(y2);    wxCoord xxc = XLOG2DEVMAC(xc);    wxCoord yyc = YLOG2DEVMAC(yc);    double dx = xx1 - xxc;    double dy = yy1 - yyc;    double radius = sqrt((double)(dx * dx + dy * dy));    wxCoord rad = (wxCoord)radius;    double sa, ea;    if (xx1 == xx2 && yy1 == yy2)    {        sa = 0.0;        ea = 360.0;    }    else if (radius == 0.0)    {        sa = ea = 0.0;    }    else    {        sa = (xx1 - xxc == 0) ?            (yy1 - yyc < 0) ? 90.0 : -90.0 :        -atan2(double(yy1 - yyc), double(xx1 - xxc)) * RAD2DEG;        ea = (xx2 - xxc == 0) ?            (yy2 - yyc < 0) ? 90.0 : -90.0 :        -atan2(double(yy2 - yyc), double(xx2 - xxc)) * RAD2DEG;    }    bool fill = m_brush.GetStyle() != wxTRANSPARENT ;    wxGraphicPath* path = m_graphicContext->CreatePath() ;    m_graphicContext->PushState() ;    m_graphicContext->Translate( xxc, yyc ) ;    m_graphicContext->Scale( 1, -1 ) ;    if ( fill )        path->MoveToPoint( 0, 0 ) ;    path->AddArc( 0, 0, rad , DegToRad(sa) , DegToRad(ea), false ) ;    if ( fill )        path->AddLineToPoint( 0, 0 ) ;    m_graphicContext->DrawPath( path ) ;    m_graphicContext->PopState() ;    delete path ;}void wxDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h,                              double sa, double ea ){    wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawEllipticArc - invalid DC") );    if ( m_logicalFunction != wxCOPY )        return ;    wxCoord xx = XLOG2DEVMAC(x);    wxCoord yy = YLOG2DEVMAC(y);    wxCoord ww = m_signX * XLOG2DEVREL(w);    wxCoord hh = m_signY * YLOG2DEVREL(h);    // handle -ve width and/or height    if (ww < 0)    {        ww = -ww;        xx = xx - ww;    }    if (hh < 0)    {        hh = -hh;        yy = yy - hh;    }    bool fill = m_brush.GetStyle() != wxTRANSPARENT ;    wxGraphicPath* path = m_graphicContext->CreatePath() ;    m_graphicContext->PushState() ;    m_graphicContext->Translate( xx + ww / 2, yy + hh / 2 ) ;    m_graphicContext->Scale( 1 * ww / 2 , -1 * hh / 2 ) ;    if ( fill )        path->MoveToPoint( 0, 0 ) ;    path->AddArc( 0, 0, 1 , DegToRad(sa) , DegToRad(ea), false ) ;    if ( fill )        path->AddLineToPoint( 0, 0 ) ;    m_graphicContext->DrawPath( path ) ;    m_graphicContext->PopState() ;    delete path ;}void wxDC::DoDrawPoint( wxCoord x, wxCoord y ){    wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawPoint - invalid DC") );    DoDrawLine( x , y , x + 1 , y + 1 ) ;}void wxDC::DoDrawLines(int n, wxPoint points[],                        wxCoord xoffset, wxCoord yoffset){    wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawLines - invalid DC") );#if !wxMAC_USE_CORE_GRAPHICS_BLEND_MODES    if ( m_logicalFunction != wxCOPY )        return ;#endif    wxCoord x1, x2 , y1 , y2 ;    x1 = XLOG2DEVMAC(points[0].x + xoffset);    y1 = YLOG2DEVMAC(points[0].y + yoffset);    wxGraphicPath* path = m_graphicContext->CreatePath() ;    path->MoveToPoint( x1 , y1 ) ;    for (int i = 1; i < n; i++)    {        x2 = XLOG2DEVMAC(points[i].x + xoffset);        y2 = YLOG2DEVMAC(points[i].y + yoffset);        path->AddLineToPoint( x2 , y2 ) ;    }    m_graphicContext->StrokePath( path ) ;    delete path ;}#if wxUSE_SPLINES

⌨️ 快捷键说明

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