荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: ATL问题集- #9 如何做一个简单的控件容器?
发信站: 荔园晨风BBS站 (Fri Jun  1 07:59:23 2001), 转信


#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, UIN
T nID = 0 )
{
   HWND hWnd = CWindowImpl<你的控件类>::Create( hWndParent, rcPos,
                                                szWindowName, dwStyle, dwExS
tyle, nID);
   if (hWnd)
   {
      ::SetProp(hWnd, "ABC", static_cast<HANDLE> ((你的控件类*) this));
      m_fnOldWindowProc = (WNDPROC) ::SetWindowLong( hWnd, GWL_WNDPROC, (LON
G) 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 lP
aram )
{
   你的控件类* 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, lPar
am,
                                                    &lResult, dwCookie);
   }
   return lResult;
}

10.在.RGS文件中的MiscStatus中新增加OR 0x10000
'MiscStatus' = s '0'
{
   '1' = s '131473'
}
to:
'MiscStatus' = s '0'
{
   '1' = s '197009'
}

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店