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

てな感じです。第一引数がウィンドウ名、第二引数が表示するピクトID、第三引数はウィンドウレクトです。第三引数を省略すると、ピクトの大きさのウィンドウを作ります。


 ほぼドキュメントウィンドウと同じですが、updateEvt イベントで SelectWindow と HiliteWindow を実行しています。これによってタイトルバーがいつでもアクティブ状態になり、パレットらしくなります。(逆に言うとパレットウィンドウというのはシステムではサポートされておらず、プログラム側で対処しなければならないものであるとも言えます)
 また app4Evt で HyperCard がデアクティブになった時にウィンドウを hide し、アクティブになった時に show する処理をしています。これは「パレットはアプリがバックグラウンドに回った時には隠すのが望ましい」と決められているためです。
 他には xHidePalettesEvt と xShowPalettesEvt があります。これはパレットに独特のイベントで、コールバックの ShowHCPalettes や HideHCPalettes に対応した処理をするためのものです。


 ウィンドウの種類はハイパカに用意されているものを使うのが普通です。一般的なウィンドウだとパレットに見えないからです。

  2048 paletteProc -- grow box 付きのパレット
  2052 palNoGrowProc -- 標準のパレット
  2056 palZoomProc -- zoom box と grow box のあるパレット
  2060 palZoomNoGrow -- zoom box があり、grow box のないパレット
  8 hasZoom
  2 hasTallTBar
  1 toggleHilite

 実際に試してみて、しっくり来るものを使えば良いでしょう。ズーム機能を使うなら zoom box 付き、クローズボックスに対応するなら、grow box 付きのものを使います。



Next



THINK C Lab.

UDI's HomePage
inserted by FC2 system