荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店