Difference between revisions of "Mac OS X Implementing HIView"
(→Events) |
|||
Line 14: | Line 14: | ||
Event handler implementation in HandleHIViewEvent() | Event handler implementation in HandleHIViewEvent() | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Line 72: | Line 45: | ||
kEventControlBoundsChanged | kEventControlBoundsChanged | ||
</pre> | </pre> | ||
+ | |||
+ | |||
+ | |||
+ | Current implementation : see vcl/aqua/aquavclevents.hxx for more informations about the syntax. | ||
===Install Event Handler === | ===Install Event Handler === | ||
Line 88: | Line 65: | ||
</pre> | </pre> | ||
− | |||
− | |||
=== The HI* Event Handler === | === The HI* Event Handler === | ||
Line 138: | Line 113: | ||
return status; | return status; | ||
} | } | ||
+ | </pre> | ||
+ | |||
+ | HIView use in AquaSalFrame::CreateNewSystemWindow() : | ||
+ | |||
+ | Code sample : | ||
+ | |||
+ | <pre> | ||
+ | |||
+ | // TEST HIVIew part | ||
+ | // Set mhView with HIView Content ViewRef | ||
+ | |||
+ | HIRect myViewRect; | ||
+ | myViewRect.origin.x = aContentRect.left; | ||
+ | myViewRect.origin.y = aContentRect.right; | ||
+ | myViewRect.size.width = aContentRect.right-aContentRect.left; | ||
+ | myViewRect.size.height = aContentRect.bottom-aContentRect.top; | ||
+ | OSStatus errval; | ||
+ | errval = HIViewFindByID(HIViewGetRoot(mrWindow), kHIViewWindowContentID, &mhView); | ||
+ | |||
+ | // make the view visible | ||
+ | HIViewSetVisible (mhView, true); | ||
+ | |||
+ | // set the frame | ||
+ | HIViewSetFrame (mhView, &myViewRect); | ||
</pre> | </pre> | ||
Revision as of 16:19, 12 March 2007
Contributors
Eric Bachard[ericb]
Sébastien Plisson [plipli]
Introduction
This page is part of [Native Controls Implementation] and the objective is to use HIView for HIComboboxes or other HI* controls.
The generic implmentation, under tests (and not fully working), uses :
Definition in aquavclevents.hxx
Event handler implementation in HandleHIViewEvent()
Note : we "or"- ed kWindowCompositingAttribute in nWindowAttributes, to see compositing effects.
[FIXME] : investigate, because use this attribute causes refresh issues
Current code implementation
Events
Two sorts of events are needed:
- for objects (ClasskEventClassHIObject ) :
kEventHIObjectConstruct kEventHIObjectInitialize kEventHIObjectDestruct
- for controls themselves ( Class kEventClassControl ) :
kEventControlDraw kEventControlInitialize kEventControlHitTest kEventControlGetPartRegion kEventControlBoundsChanged
Current implementation : see vcl/aqua/aquavclevents.hxx for more informations about the syntax.
Install Event Handler
Now we have to install event Handler, inside AquaSalFrame::CreateNewSystemWindow() :
InstallEventHandler ( GetControlEventTarget (mhView), NewEventHandlerUPP (HandleHIViewEvent), GetEventTypeCount (cHIViewEvent), cHIViewEvent, (void*)mhView, NULL );
The HI* Event Handler
The Handler is OSStatus type, and is used when events are detected.
e.g. : we created HandleHIViewEvent()
using GetEventParameter, itself using the parameters described in Apple documentation.
Code sample :
OSStatus HandleHIViewEvent(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void* inUserData) { //lock ImplSalYieldMutexAcquire(); OSStatus status = noErr; // we use mrContext, global and seen from everywhere CGContextRef mrContext; // create HIRect, contianing the control bounds ( in local coordinates) HIRect bounds; status = GetEventParameter (inEvent, kEventParamCGContextRef, typeCGContextRef, NULL, sizeof (CGContextRef), NULL, &mrContext); // not used, but usefull //require_noerr(status, CantGetGraphicsContext); // 2 // We need to know the bounds containing the current control HIViewGetBounds ((HIViewRef) inUserData, &bounds); // not used, but usefull //require_noerr(status, CantGetBoundingRectangle); // unlock ImplSalYieldMutexRelease(); return status; }
HIView use in AquaSalFrame::CreateNewSystemWindow() :
Code sample :
// TEST HIVIew part // Set mhView with HIView Content ViewRef HIRect myViewRect; myViewRect.origin.x = aContentRect.left; myViewRect.origin.y = aContentRect.right; myViewRect.size.width = aContentRect.right-aContentRect.left; myViewRect.size.height = aContentRect.bottom-aContentRect.top; OSStatus errval; errval = HIViewFindByID(HIViewGetRoot(mrWindow), kHIViewWindowContentID, &mhView); // make the view visible HIViewSetVisible (mhView, true); // set the frame HIViewSetFrame (mhView, &myViewRect);
Controls
[FIXME]
Usefull Links
Reference
HIVIew : [reference]
or : [same in .pdf format]