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

📄 dc.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        ::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 ;    if ( 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));    if( (xx1 > xx2) || (yy1 > yy2) ) {        alpha2 *= -1;    }    Rect r = { yyc - rad, xxc - rad, yyc + rad, xxc + rad };    if(m_brush.GetStyle() != wxTRANSPARENT) {        MacInstallBrush();        PaintArc(&r, alpha1, alpha2);    }    if(m_pen.GetStyle() != wxTRANSPARENT) {        MacInstallPen();        FrameArc(&r, alpha1, alpha2);    }}void  wxDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h,                              double sa, double ea ){    wxCHECK_RET(Ok(), wxT("wxDC::DoDrawEllepticArc  Invalid DC"));    wxMacFastPortSetter helper(this) ;    Rect r;    double angle = sa - ea;  // Order important Mac in opposite direction to wx    // we have to make sure that the filling is always counter-clockwise    if ( angle > 0 )        angle -= 360 ;    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; }    sa = wxConvertWXangleToMACangle(sa);    r.top    = yy;    r.left   = xx;    r.bottom = yy + hh;    r.right  = xx + ww;    if(m_brush.GetStyle() != wxTRANSPARENT) {        MacInstallBrush();        PaintArc(&r, (short)sa, (short)angle);    }    if(m_pen.GetStyle() != wxTRANSPARENT) {        MacInstallPen();        FrameArc(&r, (short)sa, (short)angle);    }}void  wxDC::DoDrawPoint( wxCoord x, wxCoord y ){    wxCHECK_RET(Ok(), wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    if (m_pen.GetStyle() != wxTRANSPARENT)    {        wxCoord xx1 = XLOG2DEVMAC(x);        wxCoord yy1 = YLOG2DEVMAC(y);        RGBColor pencolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel());        ::SetCPixel( xx1,yy1,&pencolor) ;        CalcBoundingBox(x, y);    }}void  wxDC::DoDrawLines(int n, wxPoint points[],                        wxCoord xoffset, wxCoord yoffset){    wxCHECK_RET(Ok(), wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    if (m_pen.GetStyle() == wxTRANSPARENT)        return;    MacInstallPen() ;    wxCoord offset = ( (m_pen.GetWidth() == 0 ? 1 :    m_pen.GetWidth() ) * (wxCoord)m_scaleX - 1) / 2 ;    wxCoord x1, x2 , y1 , y2 ;    x1 = XLOG2DEVMAC(points[0].x + xoffset);    y1 = YLOG2DEVMAC(points[0].y + yoffset);    ::MoveTo(x1 - offset, y1 - offset );    for (int i = 0; i < n-1; i++)    {        x2 = XLOG2DEVMAC(points[i+1].x + xoffset);        y2 = YLOG2DEVMAC(points[i+1].y + yoffset);        ::LineTo( x2 - offset, y2 - offset );    }}void  wxDC::DoDrawPolygon(int n, wxPoint points[],                          wxCoord xoffset, wxCoord yoffset,                          int fillStyle ){    wxCHECK_RET(Ok(), wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    wxCoord x1, x2 , y1 , y2 ;    if ( m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT )        return ;    PolyHandle polygon = OpenPoly();    x2 = x1 = XLOG2DEVMAC(points[0].x + xoffset);    y2 = y1 = YLOG2DEVMAC(points[0].y + yoffset);    ::MoveTo(x1,y1);    for (int i = 1; i < n; i++)    {        x2 = XLOG2DEVMAC(points[i].x + xoffset);        y2 = YLOG2DEVMAC(points[i].y + yoffset);        ::LineTo(x2, y2);    }    // close the polyline if necessary    if ( x1 != x2 || y1 != y2 )    {        ::LineTo(x1,y1 ) ;    }    ClosePoly();    if (m_brush.GetStyle() != wxTRANSPARENT)    {        MacInstallBrush();        ::PaintPoly( polygon );    }    if (m_pen.GetStyle() != wxTRANSPARENT)    {        MacInstallPen() ;        ::FramePoly( polygon ) ;    }    KillPoly( polygon );}void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height){    wxCHECK_RET(Ok(), wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    wxCoord xx = XLOG2DEVMAC(x);    wxCoord yy = YLOG2DEVMAC(y);    wxCoord ww = m_signX * XLOG2DEVREL(width);    wxCoord hh = m_signY * YLOG2DEVREL(height);    // CMB: draw nothing if transformed w or h is 0    if (ww == 0 || hh == 0)        return;    // CMB: handle -ve width and/or height    if (ww < 0)    {        ww = -ww;        xx = xx - ww;    }    if (hh < 0)    {        hh = -hh;        yy = yy - hh;    }    Rect rect = { yy , xx , yy + hh , xx + ww } ;    if (m_brush.GetStyle() != wxTRANSPARENT)    {        MacInstallBrush() ;        ::PaintRect( &rect ) ;    }    if (m_pen.GetStyle() != wxTRANSPARENT)    {        MacInstallPen() ;        ::FrameRect( &rect ) ;    }}void  wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y,                                   wxCoord width, wxCoord height,                                   double radius){    wxCHECK_RET(Ok(), wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    if (radius < 0.0)        radius = - radius * ((width < height) ? width : height);    wxCoord xx = XLOG2DEVMAC(x);    wxCoord yy = YLOG2DEVMAC(y);    wxCoord ww = m_signX * XLOG2DEVREL(width);    wxCoord hh = m_signY * YLOG2DEVREL(height);    // CMB: draw nothing if transformed w or h is 0    if (ww == 0 || hh == 0)        return;    // CMB: handle -ve width and/or height    if (ww < 0)    {        ww = -ww;        xx = xx - ww;    }    if (hh < 0)    {        hh = -hh;        yy = yy - hh;    }    Rect rect = { yy , xx , yy + hh , xx + ww } ;    if (m_brush.GetStyle() != wxTRANSPARENT)    {        MacInstallBrush() ;        ::PaintRoundRect( &rect , int(radius * 2) , int(radius * 2) ) ;    }    if (m_pen.GetStyle() != wxTRANSPARENT)    {        MacInstallPen() ;        ::FrameRoundRect( &rect , int(radius * 2) , int(radius * 2) ) ;    }}void  wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height){    wxCHECK_RET(Ok(), wxT("Invalid DC"));    wxMacFastPortSetter helper(this) ;    wxCoord xx = XLOG2DEVMAC(x);    wxCoord yy = YLOG2DEVMAC(y);    wxCoord ww = m_signX * XLOG2DEVREL(width);    wxCoord hh = m_signY * YLOG2DEVREL(height);    // CMB: draw nothing if transformed w or h is 0    if (ww == 0 || hh == 0)        return;    // CMB: handle -ve width and/or height    if (ww < 0)    {        ww = -ww;        xx = xx - ww;    }    if (hh < 0)    {        hh = -hh;        yy = yy - hh;    }    Rect rect = { yy , xx , yy + hh , xx + ww } ;    if (m_brush.GetStyle() != wxTRANSPARENT)    {        MacInstallBrush() ;        ::PaintOval( &rect ) ;    }    if (m_pen.GetStyle() != wxTRANSPARENT)    {        MacInstallPen() ;        ::FrameOval( &rect ) ;    }}bool  wxDC::CanDrawBitmap(void) const{    return true ;}bool  wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,                   wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool useMask,                   wxCoord xsrcMask,  wxCoord ysrcMask ){    wxCHECK_MSG(Ok(), false, wxT("wxDC::DoBlit Illegal dc"));    wxCHECK_MSG(source->Ok(), false, wxT("wxDC::DoBlit  Illegal source DC"));    if ( logical_func == wxNO_OP )        return true ;    if (xsrcMask == -1 && ysrcMask == -1)    {        xsrcMask = xsrc; ysrcMask = ysrc;    }    // correct the parameter in case this dc does not have a mask at all    if ( useMask && !source->m_macMask )        useMask = false ;    Rect srcrect , dstrect ;    srcrect.top = source->YLOG2DEVMAC(ysrc) ;    srcrect.left = source->XLOG2DEVMAC(xsrc)  ;    srcrect.right = source->XLOG2DEVMAC(xsrc + width ) ;    srcrect.bottom = source->YLOG2DEVMAC(ysrc + height) ;    dstrect.top = YLOG2DEVMAC(ydest) ;    dstrect.left = XLOG2DEVMAC(xdest) ;    dstrect.bottom = YLOG2DEVMAC(ydest + height )  ;    dstrect.right = XLOG2DEVMAC(xdest + width ) ;    short mode = kUnsupportedMode ;    bool invertDestinationFirst = false ;    switch ( logical_func )    {    case wxAND:        // src AND dst        mode = adMin ; // ok        break ;    case wxAND_INVERT: // (NOT src) AND dst        mode = notSrcOr  ; // ok        break ;    case wxAND_REVERSE:// src AND (NOT dst)        invertDestinationFirst = true ;        mode = srcOr ;        break ;    case wxCLEAR:      // 0        mode = kEmulatedMode ;        break ;    case wxCOPY:       // src        mode = srcCopy ; // ok        break ;    case wxEQUIV:      // (NOT src) XOR dst        mode = srcXor ; // ok        break ;    case wxINVERT:     // NOT dst        mode = kEmulatedMode ; //or hilite ;        break ;    case wxNAND:       // (NOT src) OR (NOT dst)        invertDestinationFirst = true ;        mode = srcBic ;        break ;    case wxNOR:        // (NOT src) AND (NOT dst)        invertDestinationFirst = true ;        mode = notSrcOr ;        break ;    case wxNO_OP:      // dst        mode = kEmulatedMode ; // this has already been handled upon entry        break ;    case wxOR:         // src OR dst        mode = notSrcBic ;        break ;    case wxOR_INVERT:  // (NOT src) OR dst        mode = srcBic ;        break ;    case wxOR_REVERSE: // src OR (NOT dst)        invertDestinationFirst = true ;        mode = notSrcBic ;        break ;    case wxSET:        // 1        mode = kEmulatedMode ;        break ;    case wxSRC_INVERT: // (NOT src)        mode = notSrcCopy ; // ok        break ;    case wxXOR:        // src XOR dst        mode = notSrcXor ; // ok        break ;    default :        break ;    }    if ( mode == kUnsupportedMode )    {        wxFAIL_MSG(wxT("unsupported blitting mode" ));        return false ;    }    CGrafPtr            sourcePort = (CGrafPtr) source->m_macPort ;    PixMapHandle    bmappixels =  GetGWorldPixMap( sourcePort ) ;    if ( LockPixels(bmappixels) )    {        wxMacFastPortSetter helper(this) ;        if ( source->GetDepth() == 1 )        {            RGBForeColor( &MAC_WXCOLORREF(m_textForegroundColour.GetPixel()) ) ;            RGBBackColor( &MAC_WXCOLORREF(m_textBackgroundColour.GetPixel()) ) ;        }        else        {

⌨️ 快捷键说明

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