// CtrlWnd.cpp : implementation file
//

#include "stdafx.h"
#include "CtrlWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_DYNCREATE(CCtrlWnd,CWnd)

/////////////////////////////////////////////////////////////////////////////
// CCtrlWnd

CCtrlWnd::CCtrlWnd()
{
	EnableAutomation();
	m_wndControl.EnableAutomation();
}

CCtrlWnd::~CCtrlWnd()
{
}

BOOL CCtrlWnd::CreateControl(LPCTSTR lpszControlID)
{
	if( ! GetSafeHwnd() || ! ::IsWindow(GetSafeHwnd()) )
	{
		return FALSE;
	}

	if( m_wndControl.GetSafeHwnd() && ::IsWindow(m_wndControl.GetSafeHwnd()) )
	{
		m_wndControl.DestroyWindow();
	}

	CRect rc;
	GetClientRect(&rc);
	
	BOOL bResult = m_wndControl.CreateControl(lpszControlID,NULL,WS_VISIBLE|WS_TABSTOP,rc,this,152);

	return bResult;
}

CWnd* CCtrlWnd::GetControl()
{
	if( ! GetSafeHwnd() || ! ::IsWindow(GetSafeHwnd()) )
	{
		return NULL;
	}

	if( ! m_wndControl.GetSafeHwnd() || !::IsWindow(m_wndControl.GetSafeHwnd()) )
	{
		return NULL;
	}

	return &m_wndControl;
}

LPUNKNOWN CCtrlWnd::GetControlIUnknown()
{
	if( ! GetSafeHwnd() || ! ::IsWindow(GetSafeHwnd()) )
	{
		return NULL;
	}

	if( ! m_wndControl.GetSafeHwnd() || !::IsWindow(m_wndControl.GetSafeHwnd()) )
	{
		return NULL;
	}

	LPUNKNOWN pUnk = m_wndControl.GetControlUnknown();

	if( pUnk )
	{
		pUnk->AddRef();
	}

	return pUnk;
}

BEGIN_MESSAGE_MAP(CCtrlWnd, CWnd)
	//{{AFX_MSG_MAP(CCtrlWnd)
	ON_WM_PAINT()
	ON_WM_SIZE()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CCtrlWnd message handlers

int CCtrlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	ShowWindow(SW_SHOW);
	
	return 0;
}

void CCtrlWnd::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	if( m_wndControl.GetSafeHwnd() && ::IsWindow(m_wndControl.GetSafeHwnd()) )
		return;

	CRect r;
	GetClientRect(&r);
	
	dc.FillSolidRect(r, GetSysColor(COLOR_3DFACE));
}

void CCtrlWnd::OnSize(UINT nType, int cx, int cy) 
{
	CWnd::OnSize(nType, cx, cy);
	
	if( ! m_wndControl.GetSafeHwnd() && ! ::IsWindow(m_wndControl.GetSafeHwnd()) )
		return;

	CRect rc;
	GetClientRect(&rc);

	m_wndControl.SetWindowPos(NULL,0,0,rc.Width(),rc.Height(),SWP_NOZORDER|SWP_NOMOVE|SWP_SHOWWINDOW);
}

void CCtrlWnd::PostNcDestroy() 
{
	CWnd::PostNcDestroy();

	delete this;
}