Как делали MFC - Создаем окно

Мы сделаем свою простую функцию создания окна.

class CWnd  
{
public:
	CWnd();
	virtual ~CWnd();
	HWND m_hWnd;				// это окно в стиле С
	BOOL Create(LPCTSTR lpClassName /*имя класса*/, 
			  LPCTSTR lpWindowName /*заголовок окна*/);  
};

И реализация.

BOOL CWnd::Create(LPCTSTR lpClassName,LPCTSTR lpWindowName)
{
m_hWnd = CreateWindow(lpClassName,lpWindowName, WS_OVERLAPPEDWINDOW,
		10,10,600,480,NULL,NULL,hInstance,NULL);
if (m_hWnd==NULL) return FALSE;			// окно не создано вернуть ошибку
ShowWindow(m_hWnd,SW_SHOW);
UpdateWindow(m_hWnd);
return TRUE;					// все нормально
}

Все это хорошо только нам нужно передать hInstance процесса а его нет. Но он же был в WinMain. Был. Но мы его не сохранили, а должны были. Будем сохранять. Заводим переменную.

class CWinApp  
{
	......
	BOOL AfxWinInit(HINSTANCE hInst);		// настрока и инициализация приложения
	HINSTANCE m_hInstance;				// наш экзепляр
private:
	......
};

Реализация.

CWinApp::CWinApp()
{
afxCurrentWinApp = this;
m_pMainWnd = NULL;           // пока окна нет
m_hInstance=NULL;	     // мы еще не запущены
}

Пора его сохранить при запуске программы.

BOOL CWinApp::AfxWinInit(HINSTANCE hInst)
{
	m_hInstance=hInst;						// сохраним

	WNDCLASS wndcls;						// структура окна
	......
}

Ну и естественно передать в функцию Create.

#include "stdafx.h"
#include "Wnd.h"
#include "WinApp.h"

......


BOOL CWnd::Create(LPCTSTR lpClassName,LPCTSTR lpWindowName)
{
	m_hWnd = CreateWindow(lpClassName,lpWindowName, WS_OVERLAPPEDWINDOW,
		10,10,600,480,NULL,NULL,AfxGetApp()->m_hInstance,NULL);
	if (m_hWnd==NULL) return FALSE;	// окно не создано вернуть ошибку
	ShowWindow(m_hWnd,SW_SHOW);
	UpdateWindow(m_hWnd);
	return TRUE;		// все нормально
}

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 16.07.2001