欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>杂项>>文章内容
ATL问题集- #9 如何做一个简单的控件容器?
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
   

/*此文是我将网上的一些文章,自已遇到的问题进行整理,有些是翻译,所有只供学习讨论,如有版权还属于原作者——作者:黄森堂*/

#9 如何做一个简单的控件容器?

MFC控件向导支持简单框架控件,ATL 2.1不支持,以下代码演示在ATL 3.0(VC6环境)中实现简单的ISimpleFrameSite的容器框架.

1.定义两个宏(主要是为了方便)

#define RELEASE_OBJECT( ptr )if (ptr) { IUnknown *pUnk = (ptr); (ptr) = NULL; pUnk->Release(); }

#define QUICK_RELEASE(ptr) if (ptr) ((IUnknown *)ptr)->Release();

2.在控件类中加入成员变量:

ISimpleFrameSite* m_pSimpleFrameSite;

3.在控件类的构造函数中加入:

m_pSimpleFrameSite = NULL;

4.在控件类的析构函数中加入:

QUICK_RELEASE(m_pSimpleFrameSite);

5.覆盖IOleObject::SetClientSite:

STDMETHOD(SetClientSite)(IOleClientSite *pClientSite)

{

   HRESULT hr = IOleObjectImpl<你的控件类>::SetClientSite(pClientSite);



   RELEASE_OBJECT(m_pSimpleFrameSite);

   if( pClientSite != NULL )

      pClientSite->QueryInterface( IID_ISimpleFrameSite,

                                   (void **)&m_pSimpleFrameSite);



   return hr;

}

6.在控件类中加入成员变量:

WNDPROC m_fnOldWindowProc;

7.覆盖Create函数:

HWND Create( HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,

             DWORD dwStyle = WS_CHILD | WS_VISIBLE, DWORD dwExStyle = 0, UINT nID = 0 )

{

   HWND hWnd = CWindowImpl<你的控件类>::Create( hWndParent, rcPos,

                                                szWindowName, dwStyle, dwExStyle, nID);

   if (hWnd)

   {

      ::SetProp(hWnd, "ABC", static_cast<HANDLE> ((你的控件类*) this));

      m_fnOldWindowProc = (WNDPROC) ::SetWindowLong( hWnd, GWL_WNDPROC, (LONG) SimpleFrameWindowProc);

   }

   return hWnd;

}

8.在你的控件类中加入定义:

static LRESULT CALLBACK SimpleFrameWindowProc( HWND hWnd, UINT uMsg,

                                               WPARAM wParam, LPARAM lParam );

9.加入实理代码:

LRESULT CALLBACK 你的控件类::SimpleFrameWindowProc( HWND hWnd, UINT uMsg,

                                                    WPARAM wParam, LPARAM lParam )

{

   你的控件类* pThis = static_cast<你的控件类*> (::GetProp(hWnd, "ABC"));

   WNDPROC fnOldWindowProc = pThis->m_fnOldWindowProc;



   LRESULT lResult;

   BOOL bProcess = TRUE;

   DWORD dwCookie;

   HRESULT hr = E_FAIL;



   if(pThis->m_pSimpleFrameSite)

   {

      hr = pThis->m_pSimpleFrameSite->PreMessageFilter(hWnd, uMsg, wParam,

                                             lParam, &lResult, &dwCookie);

      bProcess = (hr != S_FALSE);

   }



   if (bProcess)

      lResult = fnOldWindowProc(hWnd, uMsg, wParam, lParam);



   if(pThis->m_pSimpleFrameSite && bProcess)

   {

      pThis->m_pSimpleFrameSite->PostMessageFilter( hWnd, uMsg, wParam, lParam,

                                                    &lResult, dwCookie);

   }



   return lResult;

}

10.在.RGS文件中的MiscStatus中新增加OR 0x10000

'MiscStatus' = s '0'

{

   '1' = s '131473'

}

to:

'MiscStatus' = s '0'

{

   '1' = s '197009'

}

 


附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步