osxcontrol.cpp
来自「这是VCF框架的代码」· C++ 代码 · 共 945 行 · 第 1/2 页
CPP
945 行
//OSXControl.cpp/*Copyright 2000-2004 The VCF Project.Please see License.txt in the top level directorywhere you installed the VCF.*/#include "vcf/ApplicationKit/ApplicationKit.h"#include "vcf/ApplicationKit/ApplicationKitPrivate.h"#include "vcf/ApplicationKit/OSXControl.h"#include "vcf/ApplicationKit/WindowPeer.h"#include "vcf/ApplicationKit/OSXLightweightControl.h"#include "vcf/ApplicationKit/OSXWindow.h"#include "vcf/ApplicationKit/OSXCursorPeer.h"class OSXControlView : public TView {public: OSXControlView( HIViewRef inControl ): TView(inControl){ } virtual ~OSXControlView() { } virtual OSStatus Initialize( TCarbonEvent& inEvent ) { OSStatus res = TView::Initialize( inEvent ); return res; } virtual UInt32 GetBehaviors() { return TView::GetBehaviors() | kHIViewAllowsSubviews | kHIViewDoesNotUseSpecialParts; //kControlSupportsEmbedding | kControlSupportsFocus | //kControlWantsActivate | kControlHandlesTracking | //kControlGetsFocusOnClick | kControlSupportsClickActivation; } virtual ControlPartCode HitTest( const HIPoint& inWhere ) { ControlPartCode part; // Is the mouse in the view? if ( CGRectContainsPoint( Bounds(), inWhere ) ) part = 1; else part = kControlNoPart; return part; } virtual ControlKind GetKind() { const ControlKind result = { 'OSXv', 'OSXc' }; return result; } virtual OSStatus GetRegion( ControlPartCode inPart, RgnHandle outRgn ) { OSStatus err = noErr; TRect bounds; Rect qdBounds; if ( inPart == kControlContentMetaPart || inPart == kControlStructureMetaPart /* || inPart == kControlOpaqueRegionMetaPart */ ) { bounds = Bounds(); qdBounds = bounds; RectRgn( outRgn, &qdBounds ); } return err; } virtual void Draw( RgnHandle inLimitRgn, CGContextRef inContext, GrafPtr port ) { } protected:};namespace VCF {static const EventTypeSpec osxHIViewEvents[] ={ { kEventClassCommand, kEventCommandProcess }, { kEventClassCommand, kEventCommandUpdateStatus }, { kEventClassControl, kEventControlInitialize }, { kEventClassControl, kEventControlDraw }, { kEventClassControl, kEventControlHitTest }, { kEventClassControl, kEventControlGetPartRegion }, { kEventClassControl, kEventControlGetData }, { kEventClassControl, kEventControlSetData }, { kEventClassControl, kEventControlGetOptimalBounds }, { kEventClassControl, kEventControlBoundsChanged }, { kEventClassControl, kEventControlTrack }, { kEventClassControl, kEventControlGetSizeConstraints }, { kEventClassControl, kEventControlHit }, { kEventClassControl, kEventControlOwningWindowChanged }, { kEventClassKeyboard, kEventRawKeyDown }, { kEventClassKeyboard, kEventRawKeyUp }, { kEventClassControl, kEventControlHiliteChanged }, { kEventClassControl, kEventControlActivate }, { kEventClassControl, kEventControlDeactivate }, { kEventClassControl, kEventControlValueFieldChanged }, { kEventClassControl, kEventControlTitleChanged }, { kEventClassControl, kEventControlEnabledStateChanged }, { kEventClassControl, kEventControlOwningWindowChanged }, { kEventClassControl, kEventControlSetFocusPart } };OSXControl::OSXControl( Control* control ): hiView_(NULL), control_(control), handlerRef_(NULL), mouseState_(OSXControl::msNoState){ lastMousePt_.h = 0; lastMousePt_.v = 0;}OSXControl::~OSXControl(){}OSHandleID OSXControl::getHandleID(){ return (OSHandleID) hiView_;}EventHandlerUPP OSXControl::getEventHandlerUPP(){ static EventHandlerUPP result = NULL; if ( NULL == result ) { result = NewEventHandlerUPP( OSXControl::handleOSXEvents ); } return result;}OSXControl* OSXControl::getControlFromControlRef( ControlRef control ){ OSXControl* result = NULL; if ( noErr != GetControlProperty( control, VCF_PROPERTY_CREATOR, VCF_PROPERTY_CONTROL_VAL, sizeof(OSXControl*), NULL, &result ) ) { result = NULL; } return result;}OSStatus OSXControl::installStdControlHandler(){ VCF_ASSERT( hiView_ != NULL ); return InstallEventHandler( GetControlEventTarget( hiView_ ), OSXControl::getEventHandlerUPP(), sizeof(osxHIViewEvents) / sizeof(EventTypeSpec), osxHIViewEvents, this, &handlerRef_ );}void OSXControl::create( Control* owningControl ){ TRect bounds(0,0,0,0); if ( noErr == ViewCreator<OSXControlView>::create( &hiView_, bounds, NULL ) ) { control_ = owningControl; OSXControl* thisPtr = this; SetControlProperty( hiView_, VCF_PROPERTY_CREATOR, VCF_PROPERTY_CONTROL_VAL, sizeof(thisPtr), &thisPtr ); OSStatus err = installStdControlHandler(); if ( err != noErr ) { throw RuntimeException( MAKE_ERROR_MSG_2("InstallEventHandler failed for OSXControl!") ); } } else { throw RuntimeException( MAKE_ERROR_MSG_2("OSXControl failed to be created!") ); }}void OSXControl::destroyControl(){}void OSXControl::setBounds( Rect* rect ){ TRect r( rect->left_, rect->top_, rect->getWidth(), rect->getHeight() ); HIViewSetFrame( hiView_, r );}bool OSXControl::beginSetBounds( const ulong32& numberOfChildren ){ return true;}void OSXControl::endSetBounds(){}Rect OSXControl::getBounds(){ Rect result; HIRect frame; HIViewGetFrame( hiView_, &frame ); TRect r = frame; result.setRect( r.origin.x, r.origin.y, r.origin.x + r.size.width, r.origin.y + r.size.height ); return result;}void OSXControl::setVisible( const bool& visible ){ HIViewSetVisible( hiView_, visible );}bool OSXControl::getVisible(){ return IsControlVisible(hiView_) ? true : false;}Control* OSXControl::getControl(){ return control_;}void OSXControl::setControl( Control* component ){ control_ = component;}void OSXControl::setCursor( Cursor* cursor ){ if (NULL == cursor) { return; } OSXCursorPeer *peer = (OSXCursorPeer*)cursor->getPeer(); if (NULL == peer) { return; } if (peer->isSystemCursor()){ SetThemeCursor(peer->getCursorID()); } }void OSXControl::setParent( Control* parent ){ Frame* windowParent = NULL; if ( parent->isLightWeight() ) { OSXLightweightControl* lwPeer = dynamic_cast<OSXLightweightControl*>(parent->getPeer()); if ( NULL != lwPeer ) { Control* lwParent = lwPeer->getHeavyWeightParent(); if ( NULL != lwParent ) { windowParent = dynamic_cast<Frame*>(lwParent); } } } else { windowParent = dynamic_cast<Frame*>(parent); } if ( NULL != windowParent ) { OSXWindow* osxWnd = dynamic_cast<OSXWindow*>(windowParent->getPeer()); WindowRef wnd = (WindowRef) osxWnd->getHandleID(); ControlRef contentView = osxWnd->getRootControl(); OSStatus err = HIViewAddSubview( contentView, hiView_ ); } else { ControlRef parentControlRef = (ControlRef)parent->getPeer()->getHandleID(); OSStatus err = HIViewAddSubview( parentControlRef, hiView_ ); if ( err != noErr ) { StringUtils::traceWithArgs( Format("HIViewAddSubview failed, err: %d\n") % err ); } }}Control* OSXControl::getParent(){ Control* result = NULL; HIViewRef parentRef = HIViewGetSuperview( hiView_ ); OSXControl* parentPeer = OSXControl::getControlFromControlRef( parentRef ); if ( NULL != parentPeer ) { result = parentPeer->getControl(); } return result;}bool OSXControl::isFocused(){ WindowRef wnd = GetControlOwner( hiView_ ); ControlRef focusedControl = NULL; GetKeyboardFocus( wnd, &focusedControl ); return ( hiView_ == focusedControl ) ? true : false;}void OSXControl::setFocused(){ EventModifiers mods = 0; HIViewAdvanceFocus( hiView_, mods ); }bool OSXControl::isEnabled(){ return IsControlEnabled( hiView_ ) ? true : false;}void OSXControl::setEnabled( const bool& enabled ){ if ( enabled ) { EnableControl( hiView_ ); } else { DisableControl( hiView_ ); }}void OSXControl::setFont( Font* font ){ String fontName = font->getName(); SInt16 iFONDNumber = 0; Str255 pStr; CopyCStringToPascal( fontName.empty() ? "Arial" : fontName.ansi_c_str(), pStr ); iFONDNumber = FMGetFontFamilyFromName( pStr ); ControlFontStyleRec fontRec = {0}; fontRec.flags = kControlUseForeColorMask | kControlUseFontMask | kControlUseSizeMask | kControlUseFaceMask; fontRec.font = iFONDNumber; fontRec.size = font->getPointSize(); if ( font->getBold() ) { fontRec.style |= 1; } if ( font->getItalic() ) { fontRec.style |= 2; } if ( font->getUnderlined() ) { fontRec.style |= 4; } Color* color = font->getColor(); color->getRGB16( fontRec.foreColor.red, fontRec.foreColor.green, fontRec.foreColor.blue ); SetControlFontStyle( hiView_, &fontRec ); }void OSXControl::repaint( Rect* repaintRect, const bool& immediately ){ HIViewSetNeedsDisplay( hiView_, true );}void OSXControl::keepMouseEvents(){}void OSXControl::releaseMouseEvents(){}void OSXControl::translateToScreenCoords( Point* pt ){ HIPoint tmpPt; tmpPt.x = pt->x_; tmpPt.y = pt->y_; HIViewConvertPoint( &tmpPt, hiView_, NULL ); ::Rect r; GetWindowBounds( GetControlOwner(hiView_), kWindowStructureRgn, &r ); tmpPt.x += r.left; tmpPt.y += r.top; pt->x_ = tmpPt.x; pt->y_ = tmpPt.y; }void OSXControl::translateFromScreenCoords( Point* pt ){ HIPoint tmpPt; tmpPt.x = pt->x_; tmpPt.y = pt->y_; ::Rect r; GetWindowBounds( GetControlOwner(hiView_), kWindowStructureRgn, &r ); tmpPt.x -= r.left; tmpPt.y -= r.top; HIViewConvertPoint( &tmpPt, NULL, hiView_ ); pt->x_ = tmpPt.x; pt->y_ = tmpPt.y;}OSStatus OSXControl::handleOSXEvents(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData){ OSXControl* control = (OSXControl*)userData; return control->handleOSXEvent( nextHandler, theEvent );}void OSXControl::setBorder( Border* border ){ //cause the control to repaint itself! repaint(NULL,false);}OSStatus OSXControl::handleWrappedControlHitTest( EventRef theEvent ){ GetEventParameter( theEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof (lastMousePt_), NULL, &lastMousePt_); OSXEventMsg msg( theEvent, control_ ); Event* mouseMove = UIToolkit::createEventFromNativeOSEventData( &msg ); if ( NULL != mouseMove ) { control_->handleEvent( mouseMove ); mouseMove->free(); } return noErr;}OSStatus OSXControl::handleWrappedControlTrack( EventRef theEvent ){ //first fire off a mouse down event! mouseState_ = OSXControl::msDown; OSXEventMsg msg( theEvent, control_ );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?