I have had many, MANY questions asking how to use my MFC grid control in a view instead of in a dialog, so hopefully this will help.
The easiest way as I see it is as follows:
- Add a member variable of type
CGridCtrl*
to your view class:
CGridCtrl* m_pGrid;
- Initialise this to NULL in your view class' constructor:
CMyView::CMyView
{
m_pGrid = NULL;
}
- In the
CView
function OnInitialUpdate
, create a new CGridCtrl
object if the m_pGrid
is not NULL, and then create the CGridCtrl
window:
CMyView::OnInitialUpdate
{
CView::OnInitialUpdate();
if (m_pGrid == NULL) {
m_pGrid = new CGridCtrl; if (!m_pGrid ) return;
CRect rect; GetClientRect(rect);
m_pGrid->Create(rect, this, 100);
m_pGrid->SetRowCount(50); m_pGrid->SetColumnCount(10);
}
}
This allows the view to be reused (eg SDI situations).
- We want the grid to take up the whole of the view's client space, so add a handler to the
WM_SIZE
message for the view and edit the OnSize
function thus:
CMyView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if (m_pGrid->GetSafeHwnd()) { CRect rect;
GetClientRect(rect); m_pGrid->MoveWindow(rect); }
}
- Remember to delete the object when you are done:
CMyView::~CMyView
{
delete m_pGrid;
}
- You may want to also add an
OnCmdMsg
overide to your view class and let the grid control have first go at the messages (this will allow commands such as ID_EDIT_COPY
to be wired in automatically:
BOOL CMyView::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
if (m_pGrid && IsWindow(m_pGrid->m_hWnd))
if (m_pGrid->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
If you want print preview, then check out Koay Kah Hoe's article Print Previewing without the Document/View Framework.