Все ниже описанные примеры (загружайте проект с расширением 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 (Новый Проект):
Выберите в разделе Project Types (Тип Проекта) раздел Visual C++ Projects и справа в разделе Templates выберите Win32 Project. В поле Name введите, к примеру, 01:
И нажмите ОК. В появившемся окне Win32 Application Wizard - 01 выберите раздел Application Settings (Установки Приложения), установите Windows Application (Оконное Приложение) и в дополнительных опциях укажите Empty Project (Пустой Проект) и нажмите кнопку Finish (Финиш).
Добавьте в него файл, скажем 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 //---------------------------------
Компилируем, запускаем, вот что у нас должно в итоге получиться:
Заметьте, что курсор мышки пропадает в окне приложения, за его пределами снова появляется.
Это случилось потому, что функция 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 :)