Onega

a lot of VC++ posts, a few C# posts, and some miscellaneous stuff

Thursday, November 11, 2004

CreateControl and destroy at runtime in MFC project.

Author: Onega (www.fruitfruit.com)
To create activex control, place an invisible static control(IDC_STATIC_TMP) on dialog as a place holder.

CWnd *m_pControl; //initialize it to NULL in ctor
int m_top_offset ;
int m_left_offset ;
int m_bottom_offset ;
int m_control_width;

in CxxxDlg::InitDialog()
{
...
CRect static_rect;
GetDlgItem(IDC_STATIC_TMP)->GetWindowRect(&static_rect);
ScreenToClient(&static_rect);
CRect rc;
GetClientRect(&rc);
m_top_offset = static_rect.top-rc.top;
m_left_offset = static_rect.left - rc.left;
m_bottom_offset = rc.bottom - static_rect.bottom;
m_control_width = static_rect.Width();
OnBnClickedInstall();
}

void CxxxDlg::OnBnClickedDismantle()
{
//destroy the control
if(m_pControl)
{
m_pControl->DestroyWindow();
delete m_pControl;
m_pControl = NULL;
}
}

void CxxxDlg::OnBnClickedInstall()
{
//create the control
OnBnClickedDismantle();
//found CLSID from xxx.odl file
//[
// uuid(D2CC1991-C593-11D0-8B19-0020AF14090F),
// helpstring("DoveCtrl Class")
//]
//coclass DoveCtrl
//{
// [default] interface IDoveCtrl;
//};
static CLSID const control_clsid
= { 0xd2cc1991, 0xc593, 0x11d0, { 0x8b, 0x19, 0x0, 0x20, 0xaf, 0x14, 0x9, 0xf } };
OnBnClickedDismantle();
m_pControl = new CWnd;
CRect rc;
GetClientRect(&rc);
rc.left += m_left_offset;
rc.top += m_top_offset;
rc.bottom -= m_bottom_offset;
rc.right = rc.left + m_control_width;
CPoint lt(rc.left,rc.top);
CSize sz(rc.Width(),rc.Height());
m_pControl->CreateControl(control_clsid,_T("DoveControl"),WS_CHILD|WS_VISIBLE,
<,&sz,this,IDC_STATIC_TMP+1); HWND hWnd = m_pControl->Detach();
m_pControl->SubclassWindow(hWnd);

}

void CxxxDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

// resize the control
if(m_pControl)
{
RECT rc;
this->GetClientRect(&rc);
rc.left += m_left_offset;
rc.top += m_top_offset;
rc.bottom -= m_bottom_offset;
rc.right = rc.left + m_control_width;
m_pControl->MoveWindow(&rc);
::RedrawWindow(m_hWnd,NULL,NULL,RDW_ALLCHILDREN |
RDW_UPDATENOW |
RDW_INVALIDATE);
return;
}

}

0 Comments:

Post a Comment

<< Home