// ( m2.C ) // プッシュボタン・ウィジットをクラスにする // #include // コンパイルすると ww,event が使われて #include // いないと warning が出るが問題はない。 #include // ウィジットをクラスとして定義する方法 #include // は、"bit" Vol.23,No.3 を参考にした。 int i = 0 ; // Motif のウィジットをクラス化するのは簡単! class Push { friend void push_cb( Widget ww,caddr_t myself,caddr_t event ) ; Widget motif ; public: Push( Widget wid ) ; ~Push() { XtDestroyWidget( motif ) ; } void pushCB( void ) ; } ; Push::Push( Widget wid ) { motif = XmCreatePushButton( wid,"PB",NULL,0 ) ; XtManageChild( motif ) ; XtAddCallback( motif,XmNactivateCallback,(XtCallbackProc)push_cb,(caddr_t)this ) ; } // caddr_t は XtPointer でもよい。 void Push::pushCB() { i++ ; if ( i == 3 ) exit(0) ; // ボタンを3回押すと終わる。 cout << "hello katou kun\n" ; cout.flush() ; } // コ−ルバック:必ず3つの引数を定義すること。 void push_cb( Widget ww,caddr_t myself,caddr_t event ) { Push* push = (Push*)myself ; if ( push ) push->pushCB() ; } static String fallback[] = { // これはフォ−ルバック・リソ−スといいます。 "*BB.x : 0","*BB.y : 0", "*BB.width: 250","*BB.height: 200", "*PB.x : 50","*PB.y : 50",NULL } ; void main( int argc,char **argv ) // XtAppInitialize, XtAppMainLoop は Motif1.1 { // からのル−チンです。 XtAppContext appCon ; Widget top,bb ; top = XtAppInitialize( &appCon,NULL,NULL,0,(Cardinal*)&argc,argv, fallback,NULL,0 ) ; bb = XmCreateBulletinBoard( top,"BB",NULL,0 ) ; XtManageChild( bb ) ; Push a( bb ) ; XtRealizeWidget( top ) ; XtAppMainLoop( appCon ) ; } /* [参考] XtAddCallback( ...,(XtCallbackProc)push_cb,(caddr_t)this ) で定義した最後の引数、 ここでも this ポインタ−が、push_cb 関数の myself に渡されることになる。 void push_cb( Widget ww,caddr_t myself,caddr_t event ) */