📄 dc.cpp
字号:
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 ®ion ){ 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 + -