C 实现HANDLE和VIEW的分离

首先,创建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的分离                

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值