Шаг 195 - Создание своего вида

Как Вы уже знаете 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, чтобы показать возможность изменения. Посмотрите на результат этого изменения ниже и Вы увидите разницу в виде вида :-)

195_1.gif (1943 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 8.06.2000