osxcontext.cpp
来自「这是VCF框架的代码」· C++ 代码 · 共 2,398 行 · 第 1/5 页
CPP
2,398 行
} if ( state.isActive() && state.isEnabled() ) { btnInfo.state |= kThemeStateActive; } btnInfo.adornment = kThemeAdornmentNone; if ( state.isFocused() ) { btnInfo.adornment |= kThemeAdornmentFocus; } ThemeButtonDrawUPP btnDrawUPP = NewThemeButtonDrawUPP(OSXContext_drawThemeButtonText); DrawThemeButton( r, kThemeRadioButton, &btnInfo, NULL, NULL, btnDrawUPP, (UInt32)&state ); DisposeThemeButtonDrawUPP(btnDrawUPP);}void OSXContext::drawThemeComboboxRect( Rect* rect, ButtonState& state ){ Rect tmp = *rect; tmp.offset( origin_.x_, origin_.y_ ); OSXRect r = &tmp; ThemeButtonDrawInfo btnInfo; btnInfo.state = kThemeStateInactive ; btnInfo.value = kThemeButtonOff; if ( state.isPressed() ) { btnInfo.state |= kThemeStatePressed; btnInfo.value = kThemeButtonOn; } if ( state.isActive() && state.isEnabled() ) { btnInfo.state |= kThemeStateActive; } btnInfo.adornment = kThemeAdornmentNone; if ( state.isFocused() ) { btnInfo.adornment |= kThemeAdornmentFocus; } ThemeButtonDrawUPP btnDrawUPP = NewThemeButtonDrawUPP(OSXContext_drawThemeButtonText); DrawThemeButton( r, kThemePopupButton, &btnInfo, NULL, NULL, btnDrawUPP, (UInt32)&state ); DisposeThemeButtonDrawUPP(btnDrawUPP);}void OSXContext::drawThemeScrollButtonRect( Rect* rect, ScrollBarState& state ){ /* OSXRect r = rect; ThemeTrackEnableState enableState = 0; if ( !state.isEnabled() ) { enableState = kThemeTrackDisabled; } else { if ( state.isActive() ) { enableState = kThemeTrackActive; } else { enableState = kThemeTrackInactive; } } DrawThemeScrollBarArrows */}void OSXContext::drawThemeDisclosureButton( Rect* rect, DisclosureButtonState& state ){ Rect tmp = *rect; tmp.offset( origin_.x_, origin_.y_ ); OSXRect r = &tmp; ThemeButtonDrawInfo btnInfo; btnInfo.state = kThemeStateInactive ; btnInfo.value = kThemeButtonOff; if ( state.isClosed() ) { btnInfo.value = kThemeDisclosureRight; } else if ( state.isOpened() ) { btnInfo.value = kThemeDisclosureDown; } if ( state.isActive() && state.isEnabled() ) { btnInfo.state |= kThemeStateActive; } btnInfo.adornment = kThemeAdornmentNone; DrawThemeButton( r, kThemeDisclosureButton, &btnInfo, NULL, NULL, NULL, 0 ); }void OSXContext::drawThemeTab( Rect* rect, TabState& state ){ Rect tmp = *rect; tmp.offset( origin_.x_, origin_.y_ ); OSXRect r = &tmp; TabState* ts = (TabState*)&state; ThemeTabStyle tabStyle = kThemeTabNonFront; if ( ts->isPressed() ) { tabStyle |= kThemeTabFront; } if ( !ts->isActive() ) { if ( ts->isPressed() ) { tabStyle |= kThemeTabFrontInactive; } else { tabStyle |= kThemeTabNonFrontInactive; } } ThemeTabDirection dir = 0; if ( ts->isTabOnTop() ) { dir = kThemeTabNorth; } else if ( ts->isTabOnBottom() ) { dir = kThemeTabSouth; } else if ( ts->isTabOnLeft() ) { dir = kThemeTabWest; } else if ( ts->isTabOnRight() ) { dir = kThemeTabEast; } DrawThemeTab( r, tabStyle, dir, NULL, 0 );}void OSXContext::drawThemeTabContent( Rect* rect, DrawUIState& state ){}void OSXContext::drawThemeTabPage( Rect* rect, DrawUIState& state ){ Rect tmp = *rect; tmp.offset( origin_.x_, origin_.y_ ); OSXRect r = &tmp; DrawThemeTabPane( r, state.isActive() ? kThemeStateActive : kThemeStateInactive );}void OSXContext::drawThemeTabs( Rect* rect, DrawUIState& paneState, TabState& selectedTabState, TabState& otherTabs, const std::vector<String>& tabNames, int selectedTabIndex ){ }void OSXContext::drawThemeTickMarks( Rect* rect, SliderState& state ){ Rect tmp = *rect; tmp.offset( origin_.x_, origin_.y_ ); OSXRect r = &tmp; ThemeTrackDrawInfo info; info.kind = kThemeSlider;//kThemeMediumSlider; info.bounds = r; info.min = (int)state.min_; info.max = (int)state.max_; info.value = (int)state.position_; info.attributes = state.isVertical() ? 0 : kThemeTrackHorizontal; info.attributes |= kThemeTrackShowThumb; info.trackInfo.slider.thumbDir = 0; info.trackInfo.slider.pressState = 0; if ( state.isFocused() ) { info.attributes |= kThemeTrackHasFocus; } if ( !state.isEnabled() ) { info.enableState = kThemeTrackDisabled; } else { if ( state.isActive() ) { info.enableState = kThemeTrackActive; } else { info.enableState = kThemeTrackInactive; } } if ( state.isPressed() ) { info.trackInfo.slider.pressState = kThemeThumbPressed; } bool drawBothSides = false; info.trackInfo.slider.thumbDir = 0; if ( state.isTickMarkingOnBottomRight() && state.isTickMarkingOnTopLeft() ) { drawBothSides = true; } else if ( state.isTickMarkingOnBottomRight() ) { info.trackInfo.slider.thumbDir = kThemeThumbDownward; } else if( state.isTickMarkingOnTopLeft() ) { info.trackInfo.slider.thumbDir = kThemeThumbUpward; } //GetThemeTrackBounds( &info, r ); //info.bounds = r; if ( drawBothSides ) { info.trackInfo.slider.thumbDir = kThemeThumbUpward; if ( noErr != DrawThemeTrackTickMarks( &info, (unsigned int)state.tickMarkFrequency_, NULL, 0 ) ) { StringUtils::trace( "DrawThemeTrackTickMarks failed\n" ); } info.trackInfo.slider.thumbDir = kThemeThumbDownward; if ( noErr != DrawThemeTrackTickMarks( &info, (unsigned int)state.tickMarkFrequency_, NULL, 0 ) ) { StringUtils::trace( "DrawThemeTrackTickMarks failed\n" ); } } else if ( info.trackInfo.slider.thumbDir != 0 ) {//if info.trackInfo.slider.thumbDir == 0 then no track marks if ( noErr != DrawThemeTrackTickMarks( &info, (unsigned int)state.tickMarkFrequency_, NULL, 0 ) ) { StringUtils::trace( "DrawThemeTrackTickMarks failed\n" ); } } //DrawThemeTrack( &info, NULL, NULL, 0 ); }void OSXContext::drawThemeSlider( Rect* rect, SliderState& state ){ Rect tmp = *rect; tmp.offset( origin_.x_, origin_.y_ ); OSXRect r = &tmp; ThemeTrackDrawInfo info; info.kind = kThemeSlider;//kThemeMediumSlider; info.bounds = r; info.min = (int)state.min_; info.max = (int)state.max_; info.value = (int)state.position_; info.attributes = state.isVertical() ? 0 : kThemeTrackHorizontal; info.attributes |= /*kThemeTrackRightToLeft |*/ kThemeTrackShowThumb; info.trackInfo.slider.thumbDir = 0; info.trackInfo.slider.pressState = 0; if ( state.isFocused() ) { info.attributes |= kThemeTrackHasFocus; } if ( !state.isEnabled() ) { info.enableState = kThemeTrackDisabled; } else { if ( state.isActive() ) { info.enableState = kThemeTrackActive; } else { info.enableState = kThemeTrackInactive; } } if ( state.isPressed() ) { info.trackInfo.slider.pressState = kThemeThumbPressed; } if ( state.isTickMarkingOnBottomRight() && state.isTickMarkingOnTopLeft() ) { info.trackInfo.slider.thumbDir = kThemeThumbPlain; } else if ( state.isTickMarkingOnBottomRight() ) { info.trackInfo.slider.thumbDir = kThemeThumbDownward; } else if( state.isTickMarkingOnTopLeft() ) { info.trackInfo.slider.thumbDir = kThemeThumbUpward; } GetThemeTrackBounds( &info, r ); info.bounds = r; DrawThemeTrack( &info, NULL, NULL, 0 );}void OSXContext::drawThemeProgress( Rect* rect, ProgressState& state ){ Rect tmp = *rect; tmp.offset( origin_.x_, origin_.y_ ); OSXRect r = &tmp; ThemeTrackDrawInfo info; info.kind = kThemeProgressBar; info.bounds = r; info.min = (int)state.min_; info.max = (int)state.max_; info.value = (int)state.position_; info.attributes = state.isVertical() ? 0 : kThemeTrackHorizontal; //info.attributes |= kThemeTrackRightToLeft; info.trackInfo.progress.phase = 0; if ( state.isFocused() ) { info.attributes |= kThemeTrackHasFocus; } if ( !state.isEnabled() ) { info.enableState = kThemeTrackDisabled; } else { if ( state.isActive() ) { info.enableState = kThemeTrackActive; } else { info.enableState = kThemeTrackInactive; } } DrawThemeTrack( &info, NULL, NULL, 0 );}void OSXContext::drawThemeImage( Rect* rect, Image* image, DrawUIState& state ){ CGContextSaveGState( contextID_ ); if ( !state.isEnabled() ) { CGContextSetAlpha( contextID_, 0.2 ); } if ( (rect->getWidth() > image->getWidth()) || (rect->getHeight() > image->getHeight()) ) { throw BasicException( MAKE_ERROR_MSG("Invalid image bounds requested"), __LINE__); } OSXImage* osXimage = (OSXImage*)(image); ulong32 imgBoundsWidth = (ulong32)rect->getWidth(); ulong32 imgBoundsHeight = (ulong32)rect->getHeight(); if ( (imgBoundsWidth == image->getWidth()) && (imgBoundsHeight == image->getHeight()) ) { CGImageRef imgRef = osXimage->getCGImage(); CGRect imgBounds; imgBounds.origin.x = rect->left_; imgBounds.origin.y = rect->top_; imgBounds.size.width = imgBoundsWidth; imgBounds.size.height = imgBoundsHeight; CGContextDrawImage( contextID_, imgBounds, imgRef ); } else { //create a smaller portion of the image int componentCount = image->getType(); int bitsPerPix = image->getChannelSize() * componentCount; int bitsPerComponent = image->getChannelSize(); int rowStride = ((imgBoundsWidth * bitsPerComponent * componentCount) + 7)/ 8; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); SysPixelType* data = new SysPixelType[imgBoundsWidth*imgBoundsHeight]; ulong32 imgSize = imgBoundsWidth * imgBoundsHeight * componentCount; CGDataProviderRef provider = CGDataProviderCreateWithData( NULL, (char*)data, imgSize, NULL ); CGImageRef imgRef = CGImageCreate( imgBoundsWidth, imgBoundsHeight, image->getChannelSize(), bitsPerPix, rowStride, colorSpace, kCGImageAlphaNone, provider, NULL, FALSE, kCGRenderingIntentDefault ); //copy over bits SysPixelType* imageBuf = image->getImageBits()->pixels_; SysPixelType* tmpBmpBuf = data; ulong32 incr = (ulong32)((rect->top_ * image->getWidth()) + rect->left_); imageBuf += incr; ulong32 imgWidth = image->getWidth(); int s = (int)rect->top_; int e = (int)rect->bottom_; for (int y1=s;y1<e;y1++) { memcpy( tmpBmpBuf, imageBuf, imgBoundsWidth*componentCount ); tmpBmpBuf += imgBoundsWidth; imageBuf += imgWidth; } CGRect imgBounds; imgBounds.origin.x = rect->left_; imgBounds.origin.y = rect->top_; imgBounds.size.width = imgBoundsWidth; imgBounds.size.height = imgBoundsHeight; CGContextDrawImage( contextID_, imgBounds, imgRef ); CGColorSpaceRelease(colorSpace); CGDataProviderRelease(provider); CGImageRelease( imgRef ); delete [] data; } CGContextRestoreGState( contextID_ );}void OSXContext::drawThemeHeader( Rect* rect, ButtonState& state ){ Rect tmp = *rect; tmp.offset( origin_.x_, origin_.y_ ); OSXRect r = &tmp; ThemeButtonDrawInfo btnInfo; btnInfo.state = kThemeStateInactive ; btnInfo.value = kThemeButtonOff; if ( state.isPressed() ) { btnInfo.state |= kThemeStatePressed; btnInfo.value = kThemeButtonOn; } if ( state.isActive() && state.isEnabled() ) { btnInfo.state |= kThemeStateActive; } btnInfo.adornment = kThemeAdornmentNone; DrawThemeButton( r, kThemeListHeaderButton, &btnInfo, NULL, NULL, NULL, 0 );}void OSXContext::drawThemeEdge( Rect* rect, DrawUIState& state, const long& edgeSides, const long& edgeStyle ){ Rect modRect = *rect; modRect.offset( origin_.x_, origin_.y_ ); if ( GraphicsContext::etAllSides == edgeSides ) { OSXRect r = &modRect; DrawThemePrimaryGroup( r, state.isActive() ? kThemeStateActive : kThemeStateInactive ); } else { if ( edgeSides & GraphicsContext::etLeftSide ) { OSXRect tmp = &modRect; ::Rect r = tmp; r.right = r.left; DrawThemeSeparator( &r, state.isActive() ? kThemeStateActive : kThemeStateInactive ); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?