X作成講座 on TC(8) 外部ウィンドウを作る(パレット)
パレットタイプのウィンドウを作ります。
// --------------------------------
// xPalette template 1998.3.11 ( c )UDI
// for THINK C 7.1
// --------------------------------
#include "HyperXCmd.h"
#include "SetUpA4.h"
/* Prototypes */
void createWindow( XCmdPtr paramPtr );
void doEvent( XCmdPtr paramPtr );
pascal void main( XCmdPtr paramPtr ){
RememberA0( );
SetUpA4( );
if ( paramPtr->paramCount > -1 ){
createWindow( paramPtr );
} else {
doEvent( paramPtr );
}
RestoreA4( );
}
void createWindow( XCmdPtr paramPtr ){
Str255 tempStr, winName;
short theLeft, theTop, theRight, theBottom, picID;
Rect winRect;
PicHandle myPicHand;
WindowPtr myWindowPtr;
ZeroToPas( paramPtr, *paramPtr->params[0], winName );
ZeroToPas( paramPtr, *paramPtr->params[1], tempStr );
picID = StrToNum( paramPtr, tempStr );
myPicHand = GetPicture( picID );
if ( myPicHand == nil ){
paramPtr->returnValue = PasToZero( paramPtr, "\pNot found picture resource" );
return;
}
if ( paramPtr->paramCount > 2 ){
ZeroToPas( paramPtr, *paramPtr->params[2], tempStr );
StrToRect( paramPtr, tempStr, &winRect );
} else {
winRect = ( **myPicHand ).picFrame;
OffsetRect( &winRect, 100,100 );
}
myWindowPtr = NewXWindow(paramPtr, &winRect,winName, false, paletteProc, true, true);
if ( myWindowPtr == nil ){
paramPtr->returnValue = PasToZero( paramPtr, "\pCouldn't create XWindow" );
return;
}
SetWRefCon( myWindowPtr, ( long )myPicHand );
}
void doEvent( XCmdPtr paramPtr ){
GrafPtr savePort;
EventRecord myEvent;
WindowPtr myWindowPtr;
XWEventInfoPtr myXWEventInfoPtr;
PicHandle myPicHand;
myXWEventInfoPtr = ( XWEventInfoPtr)(paramPtr->params[0] );
myWindowPtr = myXWEventInfoPtr->eventWindow;
myEvent = myXWEventInfoPtr->event;
GetPort( &savePort) ;
SetPort( myWindowPtr );
switch ( myEvent.what ){
case mouseDown:
switch ( FindWindow( myEvent.where, &myWindowPtr ) ){
case inGoAway: // closeBox
if ( TrackGoAway( myWindowPtr, myEvent.where ) ){
CloseXWindow( paramPtr, myWindowPtr );
}
break;
case inDrag: // titleBar
paramPtr->passFlag = true;
break;
case inContent: // window content
SelectWindow( myWindowPtr );
InvertRect( &( myWindowPtr->portRect ) );
break;
}
break;
case xOpenEvt:
XWAllowReEntrancy(paramPtr, myWindowPtr, true, true);
ShowWindow( myWindowPtr );
paramPtr->passFlag = true;
break;
case xCloseEvt:
paramPtr->passFlag = true;
break;
case xHidePalettesEvt: // palette only
HideWindow( myWindowPtr );
break;
case xShowPalettesEvt: // palette only
ShowWindow( myWindowPtr );
break;
case updateEvt:
BeginUpdate( myWindowPtr );
myPicHand = ( PicHandle )GetWRefCon( myWindowPtr );
DrawPicture( myPicHand, &( **myPicHand ).picFrame );
EndUpdate( myWindowPtr );
if( FrontWindow() == myWindowPtr ) SelectWindow( myWindowPtr ); // palette only
HiliteWindow( myWindowPtr, true ); // palette only
break;
case activateEvt:
break;
case app4Evt:
ShowHide( myWindowPtr, ( myEvent.message % 2 != 0 ) ); // palette only
break;
case xCursorWithin:
paramPtr->passFlag = true; // change arrow-cursor by HyperCard
break;
}
SetPort( savePort );
}
on mouseUp xWin "testWin", 1000, "100,100,200,200" if the result is not empty then answer the result end mouseUp