Creating Controls Dynamically in ATL

As in MFC, you can create controls dynamically with ATL. These are the steps required:

1.   Insert the appropriate #import statement in the dialog header file or in the StdAfx.h file.

2.   Add two member variables to your dialog or window class:

  CAxWindow m_wndGrid;      // host window

  IVSFlexGridPtr m_spGrid;  // pointer to control

3.   When the dialog or window is created, create the control and its host window, and attach the control to the window:

  // initialize ATL ActiveX hosting

  AtlAxWinInit();

  // create the control (will fail if not registered)

 

  m_spGrid.CreateInstance(__uuidof(VSFlexGrid)));

  ATLASSERT(m_spGrid != NULL);

  // create the host window (nID = IDC_GRID1)

  // the nID is needed if you want to sink events.

  RECT rc;

  GetClientRect(&rc);

  m_wndGrid.Create(m_hWnd, rc, NULL,

                   WS_CHILD | WS_VISIBLE, 0, IDC_GRID1);

  // attach the control to the host window

  CComPtr<IAxWinHostWindow> spHost;

  m_wndGrid.QueryHost(&spHost1);

  spHost->AttachControl(m_spGrid, m_wndGrid);

As in MFC, this approach requires you to hook up the event handlers manually. You can also copy wizard-generated code, which does two things: it adds an IDispEventImpl declaration to your class so it inherits the ATL event handling mechanisms, and adds an event sink map to your class using BEGIN_SINK_MAP, SINK_ENTRY, and END_SINK_MAP macros. You still need to add the call to AtlAdviseSinkMap in order to start getting the events.

Also in ATL, unless you have a good reason to create the controls dynamically, you should still stick to the resource editor and the Wizard.