HGE в дочернем окне

Запуск HGE в дочернем окне управляемом приложением Windows может быть полезно, когда создаешь внешние инструменты, или элементы управления ActiveX, или когда происходит интеграция HGE в сторонние IDE (интегрированная среда разработки). Далее следуют указания, как это следует делать.

Создание дочернего окна HGE

Чтобы запустить HGE в режиме дочернего окна, необходимо просто указать идентификатор (handle) родительского окна. Чтобы это сделать, установите перменную системы HGE_HWNDPARENT перед вызовом System_Initiate:

hge->System_SetState(HGE_HWNDPARENT, (int)hwnd);

Курсор мыши

Возможно вы предпочитаете, чтобы HGE пользовался стандартным курсором Windows в режиме дочернего окна. Этого можно добиться установив переменную системы HGE_HIDEMOUSE в значение false:

hge->System_SetState(HGE_HIDEMOUSE, false);

Обработка сообщений приложения и выполнения функции кадра

Чтобы добавить дополнительную гибкость функция System_Start ведет себе немного подругому в режиме дочернего окна. Во-первых, она возвращается после одного вызова пользовательской функции кадра, в зависимости от значение, которое она вернет. Во-вторых, она не обрабатывает оконных сообщений. Поэтому вам придется самостоятельно организовать цикл обработки сообщений. Вот простой пример, досточный для правильного запуска HGE:

for(;;)
{
  if(hge->System_GetState(HGE_HWND).int_value)
    hge->System_Start();

  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  { 
    if(msg.message == WM_QUIT) break;
    DispatchMessage(&msg);
  }
}

Обработка сообщения WM_PAINT

По умолчанию, HGE не обновляет свое окно по сообщению WM_PAINT, так как для простоты, оно совмещает обновление/отрисовку кадра. Вы можете выделить код отрисовки в отдельную функцию и вызывать ее как из функции кадра, так и по сообщению WM_PAINT, чтобы окно лучше выглядело во время перемещения и изменения размеров:

case WM_PAINT:
    RenderHGEGame();
    break;  // pass to default window proc

Перемещение и изменение размеров окна HGE

Вы можете двигать и изменять размеры окна HGE посредствам функций WinAPI, таких как MoveWindow. Когда его окно меняет размер, HGE переиницилизирует DirectX, чтобы учесть новые значения:

MoveWindow((HWND)(hge->System_GetState(HGE_HWND).int_value),
           x, y, width, height, true);

Закрытие окна HGE

С окном HGE связано много ресурсов. Поэтому необходимо использовать функцию System_Shutdown для их освобождения, не полагайтесь просто на функцию разрушения окна. Хорошее место для ее вызова - обработчик сообщения WM_DESTROY родительского окна:

case WM_DESTROY:
    FreeLoadedHGEResources();
    hge->System_Shutdown();
    PostQuitMessage(0);
    return FALSE;

Ограничения на дочернее окно

1. Чтобы принять события от клавиатуры в режиме дочернего окна HGE должна иметь фокус ввода. Она получает его автоматически когда вы щелкаете мышкой куда-нибудь внутрь окна. Чтобы явно установить фокус, используйте следующий вызов:

SetFocus((HWND)(hge->System_GetState(HGE_HWND).int_value));

2. Переключение в полноэкранный режим недоступно в режиме дочернего окна. Согласно переменной системы HGE_WINDOWED, HGE будет работать в оконном режиме.