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

📄 dc.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    wxMacFastPortSetter helper(this) ;    wxCoord xx = XLOG2DEVMAC(x);    wxCoord yy = YLOG2DEVMAC(y);    wxCoord w = icon.GetWidth();    wxCoord h = icon.GetHeight();    wxCoord ww = XLOG2DEVREL(w);    wxCoord hh = YLOG2DEVREL(h);    Rect r = { yy , xx, yy + hh, xx + ww } ;    PlotIconRef( &r , kAlignNone , kTransformNone , kPlotIconRefNormalFlags , MAC_WXHICON( icon.GetHICON() ) ) ;}void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height ){    wxCHECK_RET(Ok(), wxT("wxDC::DoSetClippingRegion - invalid DC"));    wxCoord xx, yy, ww, hh;    xx = XLOG2DEVMAC(x);    yy = YLOG2DEVMAC(y);    ww = XLOG2DEVREL(width);    hh = YLOG2DEVREL(height);    SetRectRgn( (RgnHandle) m_macCurrentClipRgn , xx , yy , xx + ww , yy + hh ) ;    SectRgn( (RgnHandle) m_macCurrentClipRgn , (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;    if ( m_clipping )    {        m_clipX1 = wxMax( m_clipX1 , xx );        m_clipY1 = wxMax( m_clipY1 , yy );        m_clipX2 = wxMin( m_clipX2, (xx + ww) );        m_clipY2 = wxMin( m_clipY2, (yy + hh) );    }    else    {        m_clipping = true;        m_clipX1 = xx;        m_clipY1 = yy;        m_clipX2 = xx + ww;        m_clipY2 = yy + hh;    }}void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region ){    wxCHECK_RET(Ok(), wxT("wxDC::DoSetClippingRegionAsRegion - invalid DC"));    wxMacFastPortSetter helper(this) ;    wxCoord x, y, w, h;    region.GetBox( x, y, w, h );    wxCoord xx, yy, ww, hh;    xx = XLOG2DEVMAC(x);    yy = YLOG2DEVMAC(y);    ww = XLOG2DEVREL(w);    hh = YLOG2DEVREL(h);    // if we have a scaling that we cannot map onto native regions    // we must use the box    if ( ww != w || hh != h )    {        wxDC::DoSetClippingRegion( x, y, w, h );    }    else    {        CopyRgn( (RgnHandle) region.GetWXHRGN() , (RgnHandle) m_macCurrentClipRgn ) ;        if ( xx != x || yy != y )            OffsetRgn( (RgnHandle) m_macCurrentClipRgn , xx - x , yy - y ) ;        SectRgn( (RgnHandle) m_macCurrentClipRgn , (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;        if ( m_clipping )        {            m_clipX1 = wxMax( m_clipX1 , xx );            m_clipY1 = wxMax( m_clipY1 , yy );            m_clipX2 = wxMin( m_clipX2, (xx + ww) );            m_clipY2 = wxMin( m_clipY2, (yy + hh) );        }        else        {            m_clipping = true;            m_clipX1 = xx;            m_clipY1 = yy;            m_clipX2 = xx + ww;            m_clipY2 = yy + hh;        }    }}void wxDC::DestroyClippingRegion(){    wxMacFastPortSetter helper(this) ;    CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;    ResetClipping();}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::SetTextForeground - invalid DC"));    m_textForegroundColour = col;    m_macFontInstalled = false ;}void wxDC::SetTextBackground( const wxColour &col ){    wxCHECK_RET(Ok(), wxT("wxDC::SetTextBackground - invalid DC"));    m_textBackgroundColour = col;    m_macFontInstalled = false ;}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;    default:    case wxMM_TEXT:        SetLogicalScale( 1.0, 1.0 );        break;    }    if (mode != wxMM_TEXT)    {        m_needComputeScaleX = true;        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 ){    // is this still correct ?    m_logicalOriginX = x * m_signX;    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{    if ( IsPortColor( (CGrafPtr) m_macPort ) )        return ( (**GetPortPixMap( (CGrafPtr) m_macPort)).pixelSize ) ;    return 1 ;}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_internalDeviceOriginX + m_externalDeviceOriginX;    m_deviceOriginY = m_internalDeviceOriginY + 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;    m_macFontInstalled = false ;}void wxDC::SetPen( const wxPen &pen ){    if ( m_pen == pen )        return ;    m_pen = pen;    m_macPenInstalled = false ;}void wxDC::SetBrush( const wxBrush &brush ){    if (m_brush == brush)        return;    m_brush = brush;    m_macBrushInstalled = false ;}void wxDC::SetBackground( const wxBrush &brush ){    if (m_backgroundBrush == brush)        return;    m_backgroundBrush = brush;    if (m_backgroundBrush.Ok())        m_macBrushInstalled = false ;}void wxDC::SetLogicalFunction( int function ){    if (m_logicalFunction == function)        return;    m_logicalFunction = function ;    m_macFontInstalled = false ;    m_macBrushInstalled = false ;    m_macPenInstalled = false ;}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::DoGetPixel - invalid DC") );    wxMacFastPortSetter helper(this) ;    // NOTE: Get/SetCPixel are slow!    RGBColor colour;    GetCPixel( XLOG2DEVMAC(x), YLOG2DEVMAC(y), &colour );    // 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::DoDrawLine - invalid DC"));    wxMacFastPortSetter helper(this) ;    if (m_pen.GetStyle() != wxTRANSPARENT)    {        MacInstallPen() ;        wxCoord offset = ( (m_pen.GetWidth() == 0 ? 1 :            m_pen.GetWidth() ) * (wxCoord)m_scaleX - 1) / 2;        wxCoord xx1 = XLOG2DEVMAC(x1) - offset;        wxCoord yy1 = YLOG2DEVMAC(y1) - offset;        wxCoord xx2 = XLOG2DEVMAC(x2) - offset;        wxCoord yy2 = YLOG2DEVMAC(y2) - offset;        if ((m_pen.GetCap() == wxCAP_ROUND) &&            (m_pen.GetWidth() <= 1))        {            // Implement LAST_NOT for MAC at least for            // orthogonal lines. RR.            if (xx1 == xx2)            {                if (yy1 < yy2)                    yy2--;                if (yy1 > yy2)                    yy2++;            }            if (yy1 == yy2)            {                if (xx1 < xx2)                    xx2--;                if (xx1 > xx2)                    xx2++;            }        }        ::MoveTo(xx1, yy1);        ::LineTo(xx2, yy2);    }}void wxDC::DoCrossHair( wxCoord x, wxCoord y ){    wxCHECK_RET(Ok(), wxT("wxDC::DoCrossHair - invalid DC"));    wxMacFastPortSetter helper(this) ;    if (m_pen.GetStyle() != wxTRANSPARENT)    {        int w = 0, h = 0;        GetSize( &w, &h );        wxCoord xx = XLOG2DEVMAC(x);        wxCoord yy = YLOG2DEVMAC(y);        MacInstallPen();        ::MoveTo( XLOG2DEVMAC(0), yy );        ::LineTo( XLOG2DEVMAC(w), yy );        ::MoveTo( xx, YLOG2DEVMAC(0) );        ::LineTo( xx, YLOG2DEVMAC(h) );        CalcBoundingBox(x, y);        CalcBoundingBox(x + w, y + h);    }}/** To draw arcs properly the angles need to be converted from the WX style:* Angles start on the +ve X axis and go anti-clockwise (As you would draw on* a normal axis on paper).* TO* the Mac style:* Angles start on the +ve y axis and go clockwise.*/static double wxConvertWXangleToMACangle(double angle){    double newAngle = 90 - angle ;    while ( newAngle > 360 )        newAngle -= 360 ;    while ( newAngle < 0 )        newAngle += 360 ;    return newAngle ;}void wxDC::DoDrawArc( wxCoord x1, wxCoord y1,                      wxCoord x2, wxCoord y2,                      wxCoord xc, wxCoord yc ){    wxCHECK_RET(Ok(), wxT("wxDC::DoDrawArc - invalid DC"));    wxMacFastPortSetter helper(this) ;    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 radius1, radius2;    if (xx1 == xx2 && yy1 == yy2)    {        radius1 = 0.0;        radius2 = 360.0;    }    else if (radius == 0.0)    {        radius1 = radius2 = 0.0;    }    else    {        radius1 = (xx1 - xxc == 0) ?            (yy1 - yyc < 0) ? 90.0 : -90.0 :        -atan2(double(yy1 - yyc), double(xx1 - xxc)) * RAD2DEG;        radius2 = (xx2 - xxc == 0) ?            (yy2 - yyc < 0) ? 90.0 : -90.0 :        -atan2(double(yy2 - yyc), double(xx2 - xxc)) * RAD2DEG;    }    wxCoord alpha2 = wxCoord(radius2 - radius1);    wxCoord alpha1 = wxCoord(wxConvertWXangleToMACangle(radius1));    while ( alpha2 < 0 )        alpha2 += 360 ;    alpha2 = -alpha2 ;    Rect r = { yyc - rad, xxc - rad, yyc + rad, xxc + rad };    if (m_brush.GetStyle() != wxTRANSPARENT)    {        MacInstallBrush();        PaintArc(&r, alpha1, alpha2);    }

⌨️ 快捷键说明

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