Как делали MFC - Регистрируем окно

Для того, чтобы окно у нас было, нам нужно сделать несколько вещей:

  1. Создать структуру окна
  2. Зарегистрировать класс окно
  3. Функции отрисовки и обновления
  4. Создать функцию окна

Нам нужна функция инициализации приложения. В приложении всегда будет главное окно. Это окно мы и будет регистрировать при запуске приложения. Если ошибка в регистрации то приложение должно завершиться.

class CWinApp  
{
	.......
	CWnd* m_pMainWnd;       // ссылка на окно
	BOOL AfxWinInit();	// настрока и инициализация приложения
private:
	.......
};

Реализация.

int PASCAL WinMain (HINSTANCE hInst,HINSTANCE hPrev, LPSTR pszCmdLine, int nCmdShow) 
{	
	if (!AfxGetApp()->AfxWinInit()) return 1; // если окно не инициализировано выйти
	return AfxGetApp()->Run(); 
}


BOOL CWinApp::AfxWinInit()
{

	WNDCLASS wndcls;			// структура окна
	memset(&wndcls, 0, sizeof(WNDCLASS));	// обнулить
	wndcls.lpfnWndProc  = AfxWndProc;	// процедура окна
	wndcls.hInstance    = hInstance;	// кто создает
	wndcls.hCursor      = ::LoadCursor(NULL, IDC_ARROW);	    // курсор
	wndcls.style        = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; // стиль
	wndcls.lpszClassName = _afxWnd;				    // имя класса
	wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);	    // цвет
	if (!::RegisterClass(&wndcls))	return FALSE;		    // если ошибка регистрации выйти
	return TRUE;						    // зарегистрировались	
}

Обратите внимание, что у нас есть куча пока неизвестный вещей. Первое это указатель на процесс который создает окно. Второе это имя класса окна. И наконец самой функции окна. С указателем на процесс просто мы его передадим из WinMain.

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

int PASCAL WinMain (HINSTANCE hInst,HINSTANCE hPrev, LPSTR pszCmdLine, int nCmdShow) 
{	
	if (!AfxGetApp()->AfxWinInit(hInst)) return 1; // если окно не инициализированно выйти
	........
}


BOOL CWinApp::AfxWinInit(HINSTANCE hInst)
{
	...........
	wndcls.hInstance    = hInst;			// кто создает
	........	
}

Имя дадим сами.

BOOL CWinApp::AfxWinInit(HINSTANCE hInst)
{
	...........
	wndcls.lpszClassName = "AfxWin";		// имя класса
	..........					
}

Нам осталась только функция окна. Опишем ее.

........
CWinApp* AfxGetApp();
LONG FAR PASCAL AfxWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam);
........

Реализуем.

LONG FAR PASCAL AfxWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam)
{
if (message == WM_DESTROY )				// если сообщение закрытия
{		
	PostQuitMessage(0);		return 0;	// выйти
}
return DefWindowProc(hWnd,message,wParam,lParam);
}

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