X作成講座 on TC(7) 外部ウィンドウを作る(ドキュメント)
外部命令の華(?)、外部ウィンドウです。
外部ウィンドウを扱うにはポインタや構造体の扱いに精通している必要があり、またイベント駆動という概念も理解していなければなりません。仮にそれらがマスターできていたとしても、ウィンドウの管理はひとつのアプリケーションを作るくらいに面倒で大変な作業です。覚悟して下さい。
取りあえずここではテンプレートとして使えそうなソースを挙げます。
全てのイベントには対応していませんが、このソースを元にしていろいろな外部ウィンドウを作ることが出来ると思います。
ここで作るのは「ドキュメントウィンドウ」です。パレットを作る方法はまた項を改めて説明しますが、小変更で対応できます。
// -------------------------------------- // xDocWin 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 ); WindowPtr getWinPtr( Str255 targetStrName ); 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 ); if( getWinPtr( winName ) ){ SysBeep(1); return; } ZeroToPas( paramPtr, *paramPtr->params[1], tempStr ); picID = StrToNum( paramPtr, tempStr ); myPicHand = GetPicture( picID ); if ( myPicHand == nil ){ paramPtr->returnValue = PasToZero( paramPtr, "\pNot found pict" ); return; } if ( paramPtr->paramCount > 2 ){ ZeroToPas( paramPtr, *paramPtr->params[2], tempStr ); StrToRect( paramPtr, tempStr, &winRect ); } else { winRect = ( **myPicHand ).picFrame; OffsetRect( &winRect, 100,100 ); // move winRect anyplace } myWindowPtr = NewXWindow(paramPtr, &winRect, winName, false, 8, true, false); if ( myWindowPtr == nil ){ paramPtr->returnValue = PasToZero( paramPtr, "\pCan't create win" ); 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 ); break; } break; case xOpenEvt: XWAllowReEntrancy(paramPtr, myWindowPtr, true, true); ShowWindow( myWindowPtr ); paramPtr->passFlag = true; break; case xCloseEvt: paramPtr->passFlag = true; break; case updateEvt: BeginUpdate( myWindowPtr ); myPicHand = ( PicHandle )GetWRefCon( myWindowPtr ); DrawPicture( myPicHand, &( **myPicHand ).picFrame ); EndUpdate( myWindowPtr ); break; case activateEvt: break; case app4Evt: break; case xCursorWithin: paramPtr->passFlag = true; // change arrowCursor by HC break; } SetPort( savePort ); } WindowPtr getWinPtr( Str255 targetStrName ){ Str255 titleStr; WindowPtr theWinPtr; theWinPtr = ( WindowPtr)LMGetWindowList(); while( theWinPtr ){ GetWTitle( theWinPtr, titleStr ); if( EqualString( targetStrName, titleStr, true, true ) ){ return theWinPtr; } theWinPtr = ( WindowPtr)( ( ( CWindowPeek)theWinPtr )->nextWindow ); } return ( WindowPtr)0; }
on mouseUp xWin "testWin", 1000, "100,100,200,200" if the result is not empty then answer the result end mouseUp