首先,创建HANDLE的源文件,在源文件中定义一个CALLBACK函数,可以通过宏的方式定义
#ifndef FORM
#define FORM(formbody) formbody##Callback
#endif
#ifndef DECLARE_FORM
#define DECLARE_FORM(formbody) /
void FORM(formbody)(SG_MESSAGE* pMsg); /
#endif
eg:DECLARE_FORM(Form_Sample_Screen) 则转换成Form_Sample_ScreenCallback函数
为什么要定义这样一个宏呢,Form_Sample_Screen将做为一个窗口的标识符,标识它自己!这样也就容易知道它是哪个回调函数,在后面将会定义另外一个宏让其与VIEW联系!
如何联系在一起呢,现在使用一个函数,类似SG_CreateWindow(0, 0, 0, 0, 0,WS_CF_HIDE, Form_Sample_ScreenCallback, 0);在里面传入刚才的函数地址,这个函数主要是在里面接收一些消息,并执行Form_Sample_ScreenCallback函数!
接着继续定义宏
#ifndef BEGIN_FORM_IMPLEX
#define BEGIN_FORM_IMPLEX(formid, formbody) /
void FORM(formbody)(SG_MESSAGE* pMsg) /
{ /
if (!pMsg) return; /
PRE_PROCESS_MSG(pMsg); /
/
/*** process before calling message handlers ***/ /
switch (pMsg->MsgId) /
{ /
case WM_LANG_CHANGING: /
case WM_THEME_CHANGING: /
{ /
formid##_FreeResource(pMsg->hWin); /
break; /
} /
case WM_UI_RESET: /
{ /
formid##_FormInit(pMsg->hWin); /
formid##_CreateWidget(pMsg->hWin); /
formid##_LoadResource(pMsg->hWin); /
break; /
} /
case WM_CREATE: /
{ /
formid##_FormInit(pMsg->hWin); /
formid##_CreateWidget(pMsg->hWin); /
break; /
} /
case WM_PAINT: /
{ /
SG_HDC vhDC = SG_GetDC(pMsg->hWin); /
if (vhDC) /
{ /
SG_SetBkColor(vhDC, formid##_GetBkColor()); /
if(!SG_IsWindowTransparent(pMsg->hWin)) /
SG_Clear(vhDC); /
SG_ReleaseDC(vhDC); /
} /
break; /
} /
case WM_SHOW: /
{ /
formid##_LoadResource(pMsg->hWin); /
break; /
} /
} /
/
/*** message handlers ***/ /
switch (pMsg->MsgId) /
{ /
#endif
#ifndef END_FORM_IMPLEX
#define END_FORM_IMPLEX(formid, formbody) /
} /
/
/*** process after calling message handlers ***/ /
switch (pMsg->MsgId) /
{ /
case WM_HIDE: /
{ /
formid##_FreeResource(pMsg->hWin); /
break; /
} /
} /
/
SG_DefaultProc(pMsg); /
POST_PROCESS_MSG(pMsg); /
} /
#endif
#ifndef ON_MSG
#define ON_MSG(msgid, handler) /
case msgid: /
{ /
handler(pMsg); /
break; /
} /
#endif
#ifndef BEGIN_FORM_IMPL
#define BEGIN_FORM_IMPL(formid) BEGIN_FORM_IMPLEX(formid, formid)
#endif
#ifndef END_FORM_IMPL
#define END_FORM_IMPL(formid) END_FORM_IMPLEX(formid, formid)
#endif
这样我们可以在HANDLE里写如下代码
eg:BEGIN_FORM_IMPL(Form_Sample_Screen)
ON_MSG(WM_SHOW, Form_Sample_HomeScreen_ShowHandler)
ON_MSG(WM_HIDE, Form_Sample_HomeScreen_HideHandler)
END_FORM_IMPL(Form_Sample_Screen)
然后在VIEW方面,有Form_Sample_Screen_FormInit(SG_HWND hWnd);
Form_Sample_Screen_CreateWidget(SG_HWND hWnd);
Form_Sample_Screen_LoadResource(SG_HWND hWnd);
的函数来初始化界面
这样就实现了HANDLE和view的分离