andla
asked on
ATL show dialogbox
When i run a control in internet explorer i crashes.
It is created with atl appwizard without MFC.
A dialobox was created with ATL Object wizard.
A Full control was created with ATL Objectwizard.
I show you the code below. I would be very gratefull if you could tell me why it's not working.
Your sincerely
andla.
// MyDialog.h : Declaration of the CMyDialog
#ifndef __MYDIALOG_H_
#define __MYDIALOG_H_
#include "resource.h" // main symbols
#include <atlhost.h>
////////////////////////// ////////// ////////// ////////// ////////// ////////// /
// CMyDialog
class CMyDialog :
public CAxDialogImpl<CMyDialog>
{
public:
CMyDialog()
{
}
~CMyDialog()
{
}
enum { IDD = IDD_MYDIALOG };
BEGIN_MSG_MAP(CMyDialog)
MESSAGE_HANDLER(WM_INITDIA LOG, OnInitDialog)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCE L, OnCancel)
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return 1; // Let the system set the focus
}
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(wID);
return 0;
}
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(wID);
return 0;
}
};
#endif //__MYDIALOG_H_
-------------------------- ---------- ----
// AndyFull.h : Declaration of the CAndyFull
#ifndef __ANDYFULL_H_
#define __ANDYFULL_H_
#include "resource.h" // main symbols
#include <atlctl.h>
#include "mydialog.h"
////////////////////////// ////////// ////////// ////////// ////////// ////////// /
// CAndyFull
class ATL_NO_VTABLE CAndyFull :
public CComObjectRootEx<CComSingl eThreadMod el>,
public CStockPropImpl<CAndyFull, IAndyFull, &IID_IAndyFull, &LIBID_MYNEWDRAGDROP3Lib>,
public CComControl<CAndyFull>,
public IPersistStreamInitImpl<CAn dyFull>,
public IOleControlImpl<CAndyFull> ,
public IOleObjectImpl<CAndyFull>,
public IOleInPlaceActiveObjectImp l<CAndyFul l>,
public IViewObjectExImpl<CAndyFul l>,
public IOleInPlaceObjectWindowles sImpl<CAnd yFull>,
public IConnectionPointContainerI mpl<CAndyF ull>,
public IPersistStorageImpl<CAndyF ull>,
public ISpecifyPropertyPagesImpl< CAndyFull> ,
public IQuickActivateImpl<CAndyFu ll>,
public IDataObjectImpl<CAndyFull> ,
public IProvideClassInfo2Impl<&CL SID_AndyFu ll, &DIID__IAndyFullEvents, &LIBID_MYNEWDRAGDROP3Lib>,
public IPropertyNotifySinkCP<CAnd yFull>,
public CComCoClass<CAndyFull, &CLSID_AndyFull>
{
public:
CAndyFull()
{
m_bWindowOnly = TRUE;
}
DECLARE_REGISTRY_RESOURCEI D(IDR_ANDY FULL)
DECLARE_PROTECT_FINAL_CONS TRUCT()
BEGIN_COM_MAP(CAndyFull)
COM_INTERFACE_ENTRY(IAndyF ull)
COM_INTERFACE_ENTRY(IDispa tch)
COM_INTERFACE_ENTRY(IViewO bjectEx)
COM_INTERFACE_ENTRY(IViewO bject2)
COM_INTERFACE_ENTRY(IViewO bject)
COM_INTERFACE_ENTRY(IOleIn PlaceObjec tWindowles s)
COM_INTERFACE_ENTRY(IOleIn PlaceObjec t)
COM_INTERFACE_ENTRY2(IOleW indow, IOleInPlaceObjectWindowles s)
COM_INTERFACE_ENTRY(IOleIn PlaceActiv eObject)
COM_INTERFACE_ENTRY(IOleCo ntrol)
COM_INTERFACE_ENTRY(IOleOb ject)
COM_INTERFACE_ENTRY(IPersi stStreamIn it)
COM_INTERFACE_ENTRY2(IPers ist, IPersistStreamInit)
COM_INTERFACE_ENTRY(IConne ctionPoint Container)
COM_INTERFACE_ENTRY(ISpeci fyProperty Pages)
COM_INTERFACE_ENTRY(IQuick Activate)
COM_INTERFACE_ENTRY(IPersi stStorage)
COM_INTERFACE_ENTRY(IDataO bject)
COM_INTERFACE_ENTRY(IProvi deClassInf o)
COM_INTERFACE_ENTRY(IProvi deClassInf o2)
END_COM_MAP()
BEGIN_PROP_MAP(CAndyFull)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
PROP_ENTRY("AutoSize", DISPID_AUTOSIZE, CLSID_NULL)
PROP_ENTRY("HWND", DISPID_HWND, CLSID_NULL)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColor Page)
END_PROP_MAP()
BEGIN_CONNECTION_POINT_MAP (CAndyFull )
CONNECTION_POINT_ENTRY(IID _IProperty NotifySink )
END_CONNECTION_POINT_MAP()
BEGIN_MSG_MAP(CAndyFull)
CHAIN_MSG_MAP(CComControl< CAndyFull> )
DEFAULT_REFLECTION_HANDLER ()
MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
// IViewObjectEx
DECLARE_VIEW_STATUS(VIEWST ATUS_SOLID BKGND | VIEWSTATUS_OPAQUE)
// IAndyFull
public:
HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("ATL 3.0 : AndyFull");
TextOut(di.hdcDraw,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
return S_OK;
}
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
CMyDialog mydialog;
RECT rect;
rect.left=0;
rect.right=50;
rect.top=0;
rect.bottom=50;
mydialog.Create(m_hWnd,rec t);
return 0;
}
};
#endif //__ANDYFULL_H_
It is created with atl appwizard without MFC.
A dialobox was created with ATL Object wizard.
A Full control was created with ATL Objectwizard.
I show you the code below. I would be very gratefull if you could tell me why it's not working.
Your sincerely
andla.
// MyDialog.h : Declaration of the CMyDialog
#ifndef __MYDIALOG_H_
#define __MYDIALOG_H_
#include "resource.h" // main symbols
#include <atlhost.h>
//////////////////////////
// CMyDialog
class CMyDialog :
public CAxDialogImpl<CMyDialog>
{
public:
CMyDialog()
{
}
~CMyDialog()
{
}
enum { IDD = IDD_MYDIALOG };
BEGIN_MSG_MAP(CMyDialog)
MESSAGE_HANDLER(WM_INITDIA
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCE
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return 1; // Let the system set the focus
}
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(wID);
return 0;
}
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(wID);
return 0;
}
};
#endif //__MYDIALOG_H_
--------------------------
// AndyFull.h : Declaration of the CAndyFull
#ifndef __ANDYFULL_H_
#define __ANDYFULL_H_
#include "resource.h" // main symbols
#include <atlctl.h>
#include "mydialog.h"
//////////////////////////
// CAndyFull
class ATL_NO_VTABLE CAndyFull :
public CComObjectRootEx<CComSingl
public CStockPropImpl<CAndyFull, IAndyFull, &IID_IAndyFull, &LIBID_MYNEWDRAGDROP3Lib>,
public CComControl<CAndyFull>,
public IPersistStreamInitImpl<CAn
public IOleControlImpl<CAndyFull>
public IOleObjectImpl<CAndyFull>,
public IOleInPlaceActiveObjectImp
public IViewObjectExImpl<CAndyFul
public IOleInPlaceObjectWindowles
public IConnectionPointContainerI
public IPersistStorageImpl<CAndyF
public ISpecifyPropertyPagesImpl<
public IQuickActivateImpl<CAndyFu
public IDataObjectImpl<CAndyFull>
public IProvideClassInfo2Impl<&CL
public IPropertyNotifySinkCP<CAnd
public CComCoClass<CAndyFull, &CLSID_AndyFull>
{
public:
CAndyFull()
{
m_bWindowOnly = TRUE;
}
DECLARE_REGISTRY_RESOURCEI
DECLARE_PROTECT_FINAL_CONS
BEGIN_COM_MAP(CAndyFull)
COM_INTERFACE_ENTRY(IAndyF
COM_INTERFACE_ENTRY(IDispa
COM_INTERFACE_ENTRY(IViewO
COM_INTERFACE_ENTRY(IViewO
COM_INTERFACE_ENTRY(IViewO
COM_INTERFACE_ENTRY(IOleIn
COM_INTERFACE_ENTRY(IOleIn
COM_INTERFACE_ENTRY2(IOleW
COM_INTERFACE_ENTRY(IOleIn
COM_INTERFACE_ENTRY(IOleCo
COM_INTERFACE_ENTRY(IOleOb
COM_INTERFACE_ENTRY(IPersi
COM_INTERFACE_ENTRY2(IPers
COM_INTERFACE_ENTRY(IConne
COM_INTERFACE_ENTRY(ISpeci
COM_INTERFACE_ENTRY(IQuick
COM_INTERFACE_ENTRY(IPersi
COM_INTERFACE_ENTRY(IDataO
COM_INTERFACE_ENTRY(IProvi
COM_INTERFACE_ENTRY(IProvi
END_COM_MAP()
BEGIN_PROP_MAP(CAndyFull)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
PROP_ENTRY("AutoSize", DISPID_AUTOSIZE, CLSID_NULL)
PROP_ENTRY("HWND", DISPID_HWND, CLSID_NULL)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColor
END_PROP_MAP()
BEGIN_CONNECTION_POINT_MAP
CONNECTION_POINT_ENTRY(IID
END_CONNECTION_POINT_MAP()
BEGIN_MSG_MAP(CAndyFull)
CHAIN_MSG_MAP(CComControl<
DEFAULT_REFLECTION_HANDLER
MESSAGE_HANDLER(WM_CREATE,
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
// IViewObjectEx
DECLARE_VIEW_STATUS(VIEWST
// IAndyFull
public:
HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("ATL 3.0 : AndyFull");
TextOut(di.hdcDraw,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
return S_OK;
}
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
CMyDialog mydialog;
RECT rect;
rect.left=0;
rect.right=50;
rect.top=0;
rect.bottom=50;
mydialog.Create(m_hWnd,rec
return 0;
}
};
#endif //__ANDYFULL_H_
The mydialog object is created on the stack. It is destroyed when it goes out of scope. So, mydialog will be destroyed right after mydialog.Create. Define it as a member variable of CAndyFull.
ASKER
Well my program doesen't crash any more but the dialogbox doesn't show up?
new code:
public:
CMyDialog m_mydialog;
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
RECT rect;
rect.left=0;
rect.right=50;
rect.top=0;
rect.bottom=50;
m_mydialog.Create(m_hWnd,r ect);
return 0;
}
};
new code:
public:
CMyDialog m_mydialog;
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
RECT rect;
rect.left=0;
rect.right=50;
rect.top=0;
rect.bottom=50;
m_mydialog.Create(m_hWnd,r
return 0;
}
};
Debug it and check all the return values.
ASKER
I now know what went wrong. It's wrong to use create in combination with EndDialog(wID), but if i use create i also have to show the window like the ordinary win32 API. And probebly i have to use a function like destroy window? I'm not sure.
Your sincerely
andla.
Your sincerely
andla.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks!
:-)
:-)
ASKER