Готовый перевод The Ultimate DirectX Tutorial (Directx 9) / Максимальные DirectX уроки (Directx 9): Win32 Basics(Lesson 2: A Primer of Basic Windows)

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «идёт перевод»

Обзор Урока

В этом уроке будет рассказано, как создать базовое приложение Windows. Прежде чем мы непосредственно перейдем к созданию окна (которое требуется для DirectX), мы рассмотрим, как создать приложение и добавить простое окно сообщения. Мы сделаем это, изучая каждый шаг программы "Hello World!".

Если вы впервые видите этот код, имейте ввиду, что вы не должны запоминать каждую строку, которую мы здесь приводим. Через некоторое время практики программирования, вы будете способны вспомнить код без всяких ссылок. Но пока знайте, что если вы не сможете его вспомнить в следующих четырех уроках, то это не значит, что вы глупы. ;)

Win32 Консольная программа и Оконное приложение

Ниже приведен пример кода демоверсии простой программы "Hello World!" для консольного приложения Win32.

#include <stdio.h> // стандартные заголовочный файл ввода/вывода информации

void main(void) // Программа начинается от сюда

{

printf("Hello World!"); // выводит сообщение "Hello World!" в консоль

return; // возвращает значение

}

Как вы, скорее всего, знаете, функция main() используется здесь для запуска приложения и работы с Windows. Проще говоря, main () - это место, где запускается ваша программа, и Windows может передать в вашу программу любые параметры, которые вы сочтете необходимыми. Конечно, есть определенные параметры, которые могут быть сюда помещены, но мы не будем касаться их здесь и где либо еще в рамках данного курса.

Windows программа, однако, отличается тем, что имеет две функции, чтобы работать с Windows.
Одна из них - это точное подобие Win32 консольной фунции main(). Другая функция позволяет Windows программам быть событийно-управляемыми. События - это такие явления как клик мышки пользователем, или нажатие клавиши, или таймер, достигший нуля. Когда любое из этих событий случается, Windows записывает сообщение о произошедшем и помещает это сообщение в очередь сообщений для программы, для которой это сообщение предназначено, в нашем случае, для твоей игры.

Чтобы написать нашу первую Windows программу, нам нужно написать первую из этих двух функций, WinMain().

WinMain() Функция

WinMain() функция - это аналог main() функции в консольном Win32. Это где приложение запускается и где вы можете задать какие-нибудь основные начальные значения. Я обычно просто вставляю код для создания окна, для главного цикла и, обычно, какой-нибудь код для таймера. Мы охватим каждую часть в лекции 'Основы'. Вот образец для WinMain() функции:

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow);

Готово, итак, давайте разберём эту функцию на части:

WINAPI

Прежде, чем мы перейти к аргументам функции, давайте взглянем что прямо перед ними. Между int и WinMain есть команда WINAPI. WINAPI - это метод передачи аргументов функции, который пришёл со дней Фортрана и Паскаля. Коротко говоря, то что он делает - это изменение наоборот последовательности передачи аргументов. Они обычно передаются справа налево, но с WINAPI они передаются слева направо. Подробности о том, почему это так, не очень важны. Windows просто требует, чтобы это было таким образом.

Теперь, давайте глянем на каждый аргумент функции

HINSTANCE hInstance,

Этот первый аргумент - это есть сокращенное наименование "метка на экземпляр". Метка - это 32 битное (2^32) целое число, которое нумерует что-либо, вроде объекта.
Экземпляром является копия приложения. По причине многозадачности и возможности запускать несколько копий программы, Windows нужен способ отслеживать какие программы есть какие. Делают это, придавая каждому экземпляру любого приложения "метку на экземпляр" или целое число, которое идентифицирует каждое приложение от других. Когда ваша программа запускается, Windows выбирает число и подставляет его в этот аргумент.

HINSTANCE hPrevInstance,

Здесь у нас есть еще один пережиток прошлого. Этот второй параметр обозначает дескриптор предыдущего экземпляра. Это означает, что если открыто несколько копий приложения, hPrevInstance будет содержать дескриптор последнего создаваемого экземпляра. Теоретически.

Еще задолго до момента появления 32-разрядных процессоров и Windows 95 несколько копий одного и того же приложения были вынуждены использовать одно и то же пространство памяти. Это сильно усложняло дело, и многим программистам было интересно, чтобы их приложения не запускали несколько копий самих себя. Чтобы избежать этого, hPrevInstance даст дескриптор предыдущему экземпляру (если таковой имеется) и вернет NULL, если он единственный, что позволит программисту обнаружить любые запущенные копии.

Однако теперь, когда у нас есть 32-разрядные приложения, Windows предоставляет каждому такому приложению собственное пространство памяти, а аргумент hPrevInstance устарел. Он существует только для обратной совместимости и равен нулю в каждом приложении, несмотря на существование других экземпляров.

Существует метод обнаружения предыдущих экземпляров приложения, но он выходит за рамки данного руководства. Этот метод можно изучить в библиотеке MSDN в разделе функция WinMain.

LPSTR lpCmdLine,

Этот параметр является длинным указателем на строку, которая содержит в себе командную строку, вызывающую работу программы. Пример: если у вас есть приложение под названием "MyApp.exe "и вы запустили его с помощью "Выполнить" прямо в меню "Пуск", то вы сможете запустить его так: "MyApp.exe" или "MyApp.exe RunA" или "MyApp.exe RunB" .В любом случае, lpCmdLine будет хранить все, что было введено, позволяя программе проверять специальные параметры.

Это полезно в программировании игр для запуска специальных режимов, таких как: безопасный режим, оконный режим, режим рендеринга программного обеспечения, режим чит-кода или всего прочего, что вам угодно.

int nCmdShow

Этот параметр показывает, как должно выглядеть окно при создании. Например, он может потребовать, чтобы окно было свернуто, развернуто или находилось в исходном состоянии, или даже открыть окно тогда, когда оно работает в фоновом режиме. Вам нет нужды использовать эти возможности, но они доступны, если вы того пожелаете. Обычно вы не будете использовать их в программировании игр, но они могут быть полезны в случае необходимости. Ниже приведены некоторые общие значения, которые могут исходить из этого параметра:

nCmdShow Values:

Описания значений

SW_SHOWNORMAL активирует и отображает окно. Если окно развернуто или свернуто, система восстанавливает его первоначальный размер и положение. Приложение должно указать этот флаг при первом отображении окна.

SW_SHOW Активирует окно и изображает его в текущем размере и позиции

SW_HIDE Скрывает окно и активирует другое

SW_MAXIMIZE Разворачивает указанное окно.

SW_MINIMIZE Сворачивает указанное окно и активирует следующее, верхнее окно по оси Z.

SW_RESTORE Активирует и отображает окно. Если окно свернуто или развернуто, система восстанавливает его исходный размер и положение. Приложение должно указывать этот флаг при восстановлении свернутого окна.

SW_SHOWMAXIMIZED Активирует окно и отображает его развёрнутым.

SW_SHOWMINIMIZED Активирует окно и отображает его как свернутое окно.

SW_SHOWMINNOACTIVE Отображает окно как свернутое окно. Это значение похоже на SW_SHOWMINIMIZED, за исключением того, что окно не активировано.

SW_SHOWNA Отображает окно в его текущем размере и позиции. Это значение аналогично SW_SHOW, за исключением того, что окно не активировано.

SW_SHOWNOACTIVATE Отображает окно в его самом последнем размере и позиции. Это значение аналогично SW_SHOWNORMAL, за исключением того, что окно не активно.

Hello World

Отлично! Хватить теории! Давайте уже что-то напишем и запустим пару программ.

Мы остановимся здесь и напишем простую программу. Давайте начнём, как ты догадался, с программы "Hello World!"

#include <windows.h> // включает в программу базовый заголовочный файл для ОС windows

// отправная точка для любой программы под ОС Windows

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nShowCmd)

{

// создаёт окно уведомления "Hello World" используя MessageBox()

MessageBox(NULL,

L"Hello World!",

L"Просто ещё одна Hello World программа!",

MB_ICONEXCLAMATION | MB_OK);

// возвращает "0" Windows

return 0;

}

Если вы запустите эту программу, то увидите что-то вроде этого:

Hello World программа в действии

Hello World программа в действии

Давайте разберем новые части этой программы, начиная сверху вниз.

#include <windows.h>

Это функция, которая создает окно сообщения, которое вы видели в демоверсии. Вот его прототип:

int MessageBox(HWND hWnd,

LPCTSTR lptext,

LPCTSTR lpcaption,

UINT utype);

Теперь давайте быстро пройдемся по каждому из параметров:

HWND hWnd,

HWND это дескриптор окна. Как мы уже говорили ранее, дескрипторы являются целыми числами, которые идентифицируют объект. В этом случае мы идентифицируем окно. Всё просто. Поскольку у нас нет созданного окна, мы ставим NULL, и Windows знает, что это сообщение не приходит из какого-либо окна, кроме рабочего стола.

LPCTSTR lptext,

Это указатель на 16-битную строку, которая содержит текст окна сообщения. Ничего больше.

LPCTSTR lpcaption,

Это указатель на 16-битную строку, которая содержит текст строки заголовка или заголовок для окна сообщения. Довольно просто.

UINT utype

Этот параметр определяет стиль окна сообщения. Ниже приведен список часто используемых значений, которые вы можете поместить в этот параметр (в сочетании с логическим оператором ИЛИ для нескольких значений).

Чтобы указать кнопки, отображаемые в окне сообщения, укажите одно из следующих значений:

Описание Значений

MB_CANCELTRYCONTINUE Окно сообщения имеет три кнопки: Отмена, Повторить (попробовать снова), Продолжить.

MB_OK Окно сообщения содержит одну кнопку: ОК. Это по умолчанию.

MB_OKCANCEL Окно сообщения содержит две кнопки: ОК и Отмена.

MB_RETRYCANCEL Окно сообщения содержит две кнопки: Повторить и Отмена.

MB_YESNO Окно сообщения содержит две кнопки: Да и Нет

MB_YESNOCANCEL Окно сообщения содержит три кнопки: Да, Нет и Отмена.

Чтобы отобразить значок в окне сообщения, укажите одно из следующих значений:

Описание Значений

MB_ICONINFORMATION В окне сообщения появляется значок, состоящий из строчной буквы «i» в кружке.

MB_ICONEXCLAMATION В окне сообщения появляется значок с восклицательным знаком.

MB_ICONERROR В окне сообщения появляется !останавливающий" значок.

В программировании игры вам обычно не нужно возвращать значения, потому что сообщения об ошибках (именно это вы будете использовать в 99% случаев) имеют только одно направление: выход. Тем не менее, это все еще полезно знать. Ниже приведен список возвращаемых значений, сообщающий, какая кнопка была нажата:

Значение нажатой кнопки

IDCANCEL Была выбрана кнопка «Отмена».

IDTRYAGAIN Была выбрана кнопка «Повторить попытку».

IDCONTINUE Была выбрана кнопка «Продолжить».

IDNO Была выбрана кнопка «Нет».

IDYES Была выбрана кнопка «Да».

IDOK Была выбрана кнопка «ОК».

Замечательно! Теперь вы официально являетесь программистом Windows. Да, мы только рассмотрели, как сделать простейшую из программ, но вскоре мы это исправим, написав программу для создания окна. Давайте сделаем это!

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод

Переведено на Нотабеноиде
http://notabenoid.org/book/53957/233964

Переводчики: thesimplyowl, p_zombie, Myxach

Настройки

Готово:

100.00% КП = 1.0