- 質問:パネルのメンバ関数はオーバライドできますか?
- 回答:可能です。
C++版、そしてC言語版はC++言語版と同様のクラス構成:VMT(Virtual Method Table)を使用しており、 ともにオーバライドできます。
パネルのDelete関数をオーバライドする場合のサンプルソースを以下に示します(C言語版)。
■ヘッダファイル
typedef struct GPanel00000_VMT{
//{{FUNCTION_TABLE
long (*MessageProcedure)( void* pSelf, unsigned short usMessage, long lLParam, long lUParam );
long (*CallBackMessageProcedure)( void* pSelf, unsigned short usID, unsigned short usMessage,
long lLParam, long lUParam );
・
・
void (*Delete)( void *pSelf ); /* ←★*/
・
・
short (*RestartFrameAnimation)( void *pSelf, unsigned short usID, unsigned long ulKeyFrame );
GFrameAnimation* (*FindFrameAnimation)( void *pSelf, unsigned short usID );
//}}FUNCTION_TABLE
}GPanel00000_VMT;
・
・
GDefClass( GPanel00000, GFrameAnimationPanel )
GDefEnd
//{{CALLBACK_METHOD
//}}CALLBACK_METHOD
/*↓オーバーライド用に新たにDelete関数を宣言 */
/* ★上記VMTファンクションテーブルに記載されている関数名、引数、戻り値の型に揃えてください */
void Delete( void *pSelf );
/* ↑オーバーライド用に新たにDelete関数を宣言 */
/*{{PROTECTED_METHOD
/* 専用の処理を作らない関数は関数名の定義をしておくこと */
#define GPanel00000_GetType GFrameAnimationPanel_GetType
・
・
#define GPanel00000_Create GFrameAnimationPanel_Create
/* ↓オーバライドした関数(今回はDelete)の定義部分をコメントアウト */
/* #define GPanel00000_Delete GFrameAnimationPanel_Delete */
/* ↑オーバライドした関数(今回はDelete)の定義部分をコメントアウト */
・
・
#define GPanel00000_Paint GFrameAnimationPanel_Paint
#define GPanel00000_OnDraw GFrameAnimationPanel_OnDraw
#define GPanel00000_OnNcDraw GFrameAnimationPanel_OnNcDraw
【注意事項】
ヘッダファイル内でコメントアウトした関数は、
次回ソース生成時に上書きされコメントアウトが消されますのでご注意ください。
■ソースファイル
void GPANEL00000_Delete(void *pSelf)
{
/* パネルDelete時に行う処理を記載(例:パネル内で使用したタイマの消滅)*/
GPicture *pPicture;
pPicture = (GPicture*)GWGetVmt(GPanel00000_VMT,pSelf )->GetChild( pSelf, PANEL00000_GPICTURE00000 );
GEKillTimer(pPicture,MYTIMER_ID);
/* ※オーバライドした本来の処理を実行するためDelete関数をコール */
/*(Delete関数はヘッダファイル内のVMTファンクションテーブルにあります)*/
GWGetGPanelVMT()->Delete(pSelf);
return;
}