Article ID: 175503
Article Last Modified on 7/15/2004
template <class T>
class ATL_NO_VTABLE CComDlgCtrl : public CComControlBase,
public CDialogImpl<T>
{
public:
CComDlgCtrl() : CComControlBase(m_hWnd) {}
HRESULT FireOnRequestEdit(DISPID dispID)
{
T* pT = static_cast<T*>(this);
return T::__ATL_PROP_NOTIFY_EVENT_CLASS::FireOnRequestEdit
(pT->GetUnknown(), dispID);
}
HRESULT FireOnChanged(DISPID dispID)
{
T* pT = static_cast<T*>(this);
return T::__ATL_PROP_NOTIFY_EVENT_CLASS::FireOnChanged
(pT->GetUnknown(), dispID);
}
virtual HRESULT ControlQueryInterface(const IID& iid, void** ppv)
{
T* pT = static_cast<T*>(this);
return pT->_InternalQueryInterface(iid, ppv);
}
virtual HWND CreateControlWindow(HWND hWndParent, RECT& rcPos)
{
T* pT = static_cast<T*>(this);
return pT->Create(hWndParent);
// CDialogImpl::Create differs from CWindowImpl
}
};
class ATL_NO_VTABLE CMyDlgCtrl :
...
public CComDlgCtrl<CMyDlgCtrl>, // Replaced CComControl
...
class ATL_NO_VTABLE CMyDlgCtrl :
...
{
public:
enum { IDD = IDD_MYDIALOG };
...
BEGIN_MSG_MAP(CMyDlgCtrl)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDC_SOMECOMMAND, OnSomeCommand)
// The next 3 lines are only for Visual C++ 6.0, and should
// replace the CHAIN_MSG_MAP() entry.
MESSAGE_HANDLER(WM_SETFOCUS, CComControlBase::OnSetFocus)
MESSAGE_HANDLER(WM_KILLFOCUS, CComControlBase::OnKillFocus)
MESSAGE_HANDLER(WM_MOUSEACTIVATE,
CComControlBase::OnMouseActivate)
END_MSG_MAP()
...
LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,
BOOL&bHandled)
{
InPlaceActivate( OLEIVERB_UIACTIVATE );
// Perform any dialog initialization
return FALSE;
}
LRESULT OnSomeCommand(WORD wNotifyCode,WORD wID,HWND hWndCtl,
BOOL&bHandled)
{
// Perform operation for this command.
return 0;
}
BEGIN_MSG_MAP(CMyDlgCtrl)
...
MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate)
END_MSG_MAP()
...
LRESULT OnMouseActivate(UINT uMsg,WPARAM wParam,LPARAM lParam,
BOOL&bHandled)
{
// UI-Activate control
InPlaceActivate( OLEIVERB_UIACTIVATE );
return FALSE;
}
This step is required only for Visual C++ 5.0 and earlier. The
MESSAGE_HANDLER entry in step 4 above for WM_MOUSEACTIVATE calls
CComControlBase::OnMouseActivate(), which UI activates your control.
STDMETHOD(TranslateAccelerator)(MSG *pMsg)
{
if ( ( pMsg->message < WM_KEYFIRST
|| pMsg->message > WM_KEYLAST )
&& ( pMsg->message < WM_MOUSEFIRST
|| pMsg->message > WM_MOUSELAST ) )
return S_FALSE;
return ( IsDialogMessage( m_hWnd, pMsg ) ) ? S_OK : S_FALSE;
}
CMyDlgCtrl()
{
m_bWindowOnly = 1;
}
Keywords: kbhowto kbctrlcreate kbdlg KB175503