ActiveX에서 FormView처럼 사용하기


ActiveX에서 무리하게 CFormView를 사용하면 안된다.

OnInitialUpdate() 호출이 되지 않아 CFormView생성 후 초기화 할 방법이 없다.
(OnCreate() 내에서 호출하면 윈도우 생성 이전이기 때문에 핸들값이 비어있다.)

그냥 CDialog 하나 붙여서 사용.

아래는 관련 링크
http://www.codeguru.com/Cpp/COM-Tech/activex/controls/article.php/c2615

하지만 아래와 같이 직접 OnCreate 내에서 FormView를 강제로 생성 할 수 있다

1. Dialog 하나 생성 한 다음에 Wizard를 사용해 Class 추가하는데 base Class를 CFormView로 지정한다.
2. 생성된 CMyFormView 클래스에 아래처럼 Create Overriding 한다.
BOOL CSmartMapFormView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT &rect, CWnd *pParentWnd, UINT nID, CCreateContext *pContext)
{
  return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

3. Ctrl Class에 WM_Create 핸들러 추가하고 아래 코드를 삽입한다.

int CSmartMapFormCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (COleControl::OnCreate(lpCreateStruct) == -1)
  return -1;

 CRuntimeClass* pViewClass = RUNTIME_CLASS(CSmartMapFormView);
 m_pFormView = (CSmartMapFormView*)pViewClass->CreateObject();
 if(m_pFormView == NULL)
 {
  TRACE("CreateObject Failed %Fs\n", pViewClass->m_lpszClassName);
  return -1;
 }

 CCreateContext context;
 context.m_pNewViewClass = pViewClass;
 context.m_pCurrentDoc = NULL;

 CRect rect(0, 0, 500, 400);

 if(!m_pFormView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, rect, this, AFX_IDW_PANE_FIRST, &context))
 {
  TRACE("FormView Create Failed \n");
  delete m_pFormView;
  m_pFormView = NULL;
  return -1;
 }

 return 0;
}

이러면 ActiveX에 CFormView를 올릴 수 있다. 
출처 : http://blog.pages.kr/307?srchid=BR1http%3A%2F%2Fblog.pages.kr%2F307