Шаг 1 - Инициализация оконного приложения

Все ниже описанные примеры (загружайте проект с расширением sln) работают в Visual Studio .NET Enterprise Architech и под операционную систему WindowsXP Professional (русская версия), так что владельцам Visual Studio 6.0 придеться переехать в данный новый пакет, если хотите загрузить исходники кода и сразу их скомпоновать. В VS 6.0 не должно возникнуть никаких проблем, если Вы еще установили в придачу DirectX 8.0 SDK, но лучше DirectX 8.1 SDK который можно взять с http://www.microsoft.com, но придется Вам шагать с первого и по последний, с середины не начать... хотя не долго все это подправить.

Первое, что мы сделаем, это пустое приложение которое начнем постепенно усложнять наращивая его различными функциями. Итак, зайдите в Visual Studio .NET и создайте новый проект Visual C++ нажав на кнопку New Project (Новый Проект):

1_1.gif (2456 b)

Выберите в разделе Project Types (Тип Проекта) раздел Visual C++ Projects и справа в разделе Templates выберите Win32 Project. В поле Name введите, к примеру, 01:

1_2.gif (13102 b)

И нажмите ОК. В появившемся окне Win32 Application Wizard - 01 выберите раздел Application Settings (Установки Приложения), установите Windows Application (Оконное Приложение) и в дополнительных опциях укажите Empty Project (Пустой Проект) и нажмите кнопку Finish (Финиш).

1_3.gif (8024 b)

Добавьте в него файл, скажем 01.cpp и вставьте ниже следующий код:

//----------------------------------------------------
//
//	Проект		->	Урок 01 - Инициализация Приложения
//	Адрес		->	http://www.firststeps.ru
//	Последние обновление 30.07.2002
//
//----------------------------------------------------
#define APPNAME "http://www.firststeps.ru Первые Шаги Урок 01 - Инициализцаия Приложения"
#define APPTITLE "http://www.firststeps.ru Первые Шаги Урок 01 - Инициализация Приложения"

#define _RELEASE_(p) { if(p) { (p)->Release(); (p)=NULL; };};
#define _DELETE_(p)  { if(p) { delete (p);     (p)=NULL; };};

#include <windows.h>

HWND hWnd;

//---------------------------------
// Name: WindowProc ()
// Desc: 
//---------------------------------
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_DESTROY:
		PostQuitMessage (0);
		break;

	case WM_SETCURSOR:
		SetCursor (NULL);
		break; 
	};
	return DefWindowProc(hWnd, message, wParam, lParam);
};

//---------------------------------
// Name: WindowInit ()
// Desc: 
//---------------------------------
bool WindowInit (HINSTANCE hThisInst, int nCmdShow)
{
	WNDCLASS		    wcl;
		
	wcl.hInstance		= hThisInst;
	wcl.lpszClassName	= APPNAME;
	wcl.lpfnWndProc		= WindowProc;
	wcl.style			= 0;

	wcl.hIcon			= LoadIcon (hThisInst, IDC_ICON);
	wcl.hCursor			= LoadCursor (hThisInst, IDC_ARROW);
	wcl.lpszMenuName	= NULL;

	wcl.cbClsExtra		= 0;
	wcl.cbWndExtra		= 0;
	wcl.hbrBackground	= (HBRUSH) GetStockObject (BLACK_BRUSH);

	RegisterClass (&wcl);

	hWnd = CreateWindowEx (
		WS_EX_TOPMOST,
		APPNAME,
		APPTITLE,
		WS_OVERLAPPEDWINDOW,
		0, 0, 
		640,
		480,
		NULL,
		NULL,
		hThisInst,
		NULL);

	if(!hWnd) return false;

	return true;
};

//---------------------------------
// Name: AppInit()
// Desc: Initializes Aplication
//---------------------------------
bool AppInit (HINSTANCE hThisInst, int nCmdShow)
{
	if(!WindowInit (hThisInst, nCmdShow)) return false;
	ShowWindow (hWnd, nCmdShow);
	UpdateWindow (hWnd);

	return true;
};

//---------------------------------
// Name: WinMain ()
// Desc: 
//---------------------------------
int APIENTRY WinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
	MSG msg;
	if(!AppInit (hThisInst, nCmdShow)) return false;
	
	while (1)
	{
		if(PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage (&msg, NULL, 0, 0)) break;
			TranslateMessage (&msg); 
			DispatchMessage (&msg);
		}
	};

	return 0;
};

//---------------------------------
// EOF
//---------------------------------

Компилируем, запускаем, вот что у нас должно в итоге получиться:

1_4.gif (5526 b)

Заметьте, что курсор мышки пропадает в окне приложения, за его пределами снова появляется.

Это случилось потому, что функция WindowProc есть три строчки кода:

case WM_SETCURSOR:
	SetCursor (NULL);
	break;

которые убирают стандартный курсор с экрана, чтобы он нам не мешал.

Так же в самом начале кода есть два макроса:

#define _RELEASE_(p) { if(p) { (p)->Release(); (p)=NULL; };};
#define _DELETE_(p)  { if(p) { delete (p);     (p)=NULL; };};

которые освобождают использованные интерфейсы и удаляет динамические массивы (обращение на удаление создадим позже, пока только объявим).

Краткое описание функций:

С функцией WinMain не должно возникнуть никаких проблем.

Здесь я сделал простую заготовку над которой мы и начнем свои познания... итак, поехали в DirectX :)


Загрузить проект | Следующий Шаг | Оглавление
Автор Хавов Евгений Валерьевич - 03.08.2002 (обновлено 10.08.2002)