65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 CAxWindow 支持简单的 ActiveX 控件接口

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.20/5 (13投票s)

2003年1月4日

viewsIcon

60173

如何通过 CAxWindow 支持 AX 控件接口

引言

以下代码仅描述了将 CComQIPtr 模板与 CAxWindow 配对使用的思路。
class CAxOwnControl : 
public CWindowImpl< CAxOwnControl , CAxWindow >,
public CComQIPtr< IControl, &IID_IControl >
{
public:
DECLARE_WND_SUPERCLASS("AxOwnControl", CAxWindow::GetWndClassName());
CAxOwnControl(){}
virtual ~CAxOwnControl(){}

HWND Create(HWND hWndParent, RECT& rcPos, 
        DWORD dwStyle = 0, DWORD dwExStyle = 0, 
        UINT nID = 0, LPVOID lpCreateParam = NULL)
{
	AtlAxWinInit(); // initialize AxHost stuff
	LPOLESTR pstrCLSID_CAxOwnControl = NULL;
	StringFromCLSID( CLSID_Control, &pstrCLSID_CAxOwnControl );
	ATLASSERT( pstrCLSID_CAxOwnControl != NULL );
	if( !pstrCLSID_CAxOwnControl )
		return NULL;

	USES_CONVERSION;
	HWND hWnd = CWindowImpl<CAxOwnControl , 
                     CAxWindow>::Create(hWndParent, rcPos, 
                     OLE2T(pstrCLSID_CAxOwnControl ), 
                     dwStyle, dwExStyle, nID, lpCreateParam);
	CoTaskMemFree(pstrCLSID_CAxOwnControl);

	if( hWnd ){
		IControlPtr pControl = NULL;
		QueryControl( IID_IControl, (void**)&pControl );
		*((CComQIPtr< IControl, &IID_IControl >*)this) = pControl;
	}

	return hWnd;
}

BEGIN_MSG_MAP_EX(CAxOwnControl)
END_MSG_MAP()
};

使用方法
    CAxOwnControl m_ctrl;
    m_ctrl.Create(...);
    m_ctrl->SomeControlMethod();
© . All rights reserved.