Как Вы уже знаете MFC уже имеет много классов видов. Естественно, что все Ваши потребности готовые классы удовлетворить не могут, поэтому мы с Вами попробуем изменить стандартный класс вида на свой манер. Давайте создадим приложение MFC AppWizard с именем TestViews. Пусть оно будет SDI и все дальше можете жать Finish.
Теперь нам надо создать класс порожденный от CView. Для этого выбираем Insert -> New Class, даем ему имя MyView, а базовым классом делаем CView. Нажимаем OK в результате у нас появляется новый класс. В проекте у нас уже есть класс вида CTestViewsView, который наследуется от CView, давайте унаследуем его от MyView, для начала в файле заголовка указываем на него ссылку.
....... #endif // _MSC_VER > 1000 #include "MyView.h" class CTestViewsView : public CView .......
Теперь меняем папу.
...... class CTestViewsView : public MyView { ......
Вот теперь в нашем классе MyView можно перегрузить виртуальную функцию Create.
BOOL MyView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); }
А вот CWnd::Create можно заменить. Для этого посмотрим в исходных кодах MFC как это реализовано. Вот так.
BOOL CWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { // can't use for desktop or pop-up windows (use CreateEx instead) ASSERT(pParentWnd != NULL); ASSERT((dwStyle & WS_POPUP) == 0); return CreateEx(0, lpszClassName, lpszWindowName, dwStyle | WS_CHILD, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, pParentWnd->GetSafeHwnd(), (HMENU)nID, (LPVOID)pContext); }
Но так можем и мы :-)
BOOL MyView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { return CreateEx(0, lpszClassName, lpszWindowName, dwStyle | WS_CHILD | WS_DLGFRAME , rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, pParentWnd->GetSafeHwnd(), (HMENU)nID, (LPVOID)pContext); }
Я специально добавил стиль WS_DLGFRAME, чтобы показать возможность изменения. Посмотрите на результат этого изменения ниже и Вы увидите разницу в виде вида :-)