- Q.ウィンドウ開閉の際、注意点はありますか?
- ウィンドウのクローズ処理に注意が必要です。
ウィンドウのクローズ処理はイベント処理のため意図したタイミングとずれることがあります。
次のようなアプリケーションを作成する場合には、注意が必要です。
同じコールバック関数内に、「表示中のウィンドウAをクローズ直後にウィンドウBをオープンする」という処理を記述した場合、
クローズとオープンの順番が逆になる可能性があります。

このような動作をさせたい場合には、同じコールバック関数内に2つの処理を記述せず、別のコールバック関数で処理するようにします。処理の流れは以下のとおりです。
・ウィンドウAのクローズ処理を行う
・ウィンドウAのクローズ処理後、ほかのコントロールにユーザイベントを送信する
・ユーザイベント送信先のコントロールのOnUserコールバック関数内で、ウィンドウのオープン処理を行う
表示中のウィンドウAをクローズした直後に、ウィンドウBをオープンする場合のサンプルソースを以下に示します。
下記のサンプルでは、パネル上に配置された基本コントロールに対して、ユーザイベントを送信しています。
/*---------------------------------------------
ウィンドウAのクローズ処理を行う任意のコールバック関数
-----------------------------------------------*/
long GPANEL00001_GBUTTONON******(GPanel00001 *pSelf, unsigned short usMessage, long lLParam, long lUParam)
{
GFrame *pFrame; /*フレームのポインタ */
GWindow *pWindow; /*ウィンドウのポインタ*/
GBasicControl *pBControl; //基本コントロールのポインタ
/*フレームのポインタを取得*/
pFrame = (GFrame*)GWGetVmt( GScreen_VMT, GWGetScreen() )->GetFrame( GWGetScreen() );
/*ウィンドウAのポインタを取得*/
pWindow = (GWindow*)GWGetVmt( GFrame_VMT, pFrame )->GetChild( pFrame, WINDOW_NO_A);
/*ウィンドウAをクローズ(モーダレス)*/
GWGetVmt( GScreen_VMT, pWindow )->Close( pWindow );
/*基本コントロールのポインタを取得*/
pBControl =(GBasicControl *)GWGetVmt(GPanel_VMT,pSelf)->GetChild(pSelf,GPANEL00001_GBASICCONTROL_B);
/*↓オープン処理を別のOnUserコールバック関数へ移すことで処理のタイミングを遅らせる*/
/*基本コントロールへユーザイベントを送信*/
GESetEvent( GECreateEventMessage( GM_USER, pBControl, 0, 0 ) , FALSE );
/*↑オープン処理を別のOnUserコールバック関数へ移すことで処理のタイミングを遅らせる*/
return TRUE;
}
/*---------------------------------------------
OnUserコールバック関数
-----------------------------------------------*/
long GPANEL00001_GBASICCONTROL_BOnUser(GPanel00001 *pSelf, unsigned short usMessage, long lLParam, long lUParam)
{
/*ウィンドウBをオープン */
GWGetVmt( GScreen_VMT, GWGetScreen() )->CreateGWindow( GWGetScreen(), WINDOW_NO_B);
return TRUE;
}
※
WINDOW_NO_A:GENSKECH2上のウィンドウAの画面番号
WINDOW_NO_B:GENSKECH2上のウィンドウBの画面番号