Re: CWnd-derived class, VC6SP6, Invalid m_hWnd
Yes, it is possible to create an invisible window like this. As I understand
it, Create is returning TRUE. I'm not sure exactly why it would then have no
window handle. What I would do is step through the Create call and see when
it creates the actual window. Shouldn't be that hard to figure out why
m_hWnd would be NULL but it still returns TRUE.
--
Jonathan Wood
SoftCircuits Programming
http://www.softcircuits.com
"Jason Tost" <no-spam-32-jason@aspenmt.com> wrote in message
news:uL6fYaNhGHA.3956@TK2MSFTNGP02.phx.gbl...
I'm trying to create a class that will derive from CWnd so that it can
have a message map, however it does not need to display anything. This
class will be a member of a CWnd-derived object (CChildView) (not using
Document/View), and will simply be a target for posting messages to from
various code in the application. The class declaration is as follows:
#define WM_ALERT (WM_USER+1)
class MyWnd : public CWnd {
public:
afx_msg LRESULT OnAlert(WPARAM w, LPARAM l);
DECLARE_MESSAGE_MAP()
};
The implementation for this class is as follows:
BEGIN_MESSAGE_MAP(MyWnd, CWnd)
ON_MESSAGE(WM_ALERT, OnAlert)
END_MESSAGE_MAP()
LRESULT MyWnd::OnAlert(WPARAM w, LPARAM, l) {
::MessageBox(NULL,
_T("Message was successfully posted and dispatched."),
_T("Test Event"),
MB_OK | MB_ICONINFORMATION);
return 0;
}
The view declaration is as follows:
class CChildView : public CWnd
{
// Construction
public:
CChildView();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CChildView)
protected:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CChildView();
// Generated message map functions
protected:
MyWnd m_MyObj;
virtual void OnInitialUpdate(); // called first time after construct
//{{AFX_MSG(CChildView)
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
I am using the OnInitialUpdate() member to create the window as follow:
void CChildView::OnInitialUpdate() {
// IDC_OBJ_MINE is a resource ID in resource.h
// and is unique.
BOOL bResult = m_MyObj.Create(NULL, NULL, WS_CHILD,
CRect(0, 0, 100, 100),
this, IDC_OBJ_MINE);
if (!bResult) {
::MessageBox(NULL,
_T("Unable to create child window instance."),
_T("Stupid Thing(tm) anyway..."),
MB_OK | MB_ICONSTOP);
}
if (m_MyObj.GetSafeHwnd() == NULL) {
CString ErrMsg;
ErrMsg.Format(
_T("No HWND is present in child (Error %d)"),
GetLastError());
::MessageBox(NULL,
(LPCTSTR)ErrMsg,
_T("Stupid Thing(tm) anyway..."),
MB_OK | MB_ICONSTOP);
}
}
When the application runs, the call to CWnd::Create() succeeds, however
the message appears indicating that the m_hWnd/GetSafeHwnd() value is
NULL, and GetLastError() returns 0. Of course, since I get no HWND I am
not able to post messages to the object. Is it possible to create
so-called "invisible" windows like this, and am I missing something
fundamental in the creation of a CWnd-based child class?
Thank you all for your efforts and suggestions!
Jason