C++: простой UI-движок для разработки Windows-приложений
Простой UI-движок на C++, который облегчает разработку Windows-интерфейсов, содержит в приложении редактор игровых карт и небольшую приключенческую игру (игра пока не завершена).
В приложении есть два файла:
Движок представляет собой обёртку над Win32 API, которая подойдёт разработчикам, не знакомым с Win32 API.
Пример использования
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
0, 0, 800, 600, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
MyEngine::cGameEngine::GetEngine()->init(hWnd); // Инициализация и привязка к окну
MyEngine::cGameEngine::GetEngine()->CreateCircle(RECT{ 10,10,100,100 }); // Создание круга
MyEngine::cGameEngine::GetEngine()->CreateLine(POINT{ 20,30 }, POINT{ 100,200 }); // Создание линии
MyEngine::cButton* btn = new MyEngine::cButton(L"点我", 100, 30); // Создание кнопки
btn->SetX(100);
btn->SetY(200);
MyEngine::cGameEngine::GetEngine()->AddEngineUi(btn); // Добавление кнопки в движок
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// В конце программы необходимо вызвать MyEngine::cGameEngine::GetEmgine()->ReleaseSelf для освобождения ресурсов
Эффект от примера кода
Обновление от 2017/8/18:15:02
Добавлено управление ресурсами через пул ресурсов GDI. Пул используется для управления изображениями и реализован как синглтон. Также добавлена блокировка CLock для решения проблем с многопоточностью. Исправлены некоторые ошибки.
Использование пула ресурсов
#include "cResourcePool.h"
class LoadResource
{
public:
LoadResource()
{
cResourcePool::AddObjByKey("pic1", (HBITMAP)LoadImage(nullptr, L"D:\\puc1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE));
cResourcePool::AddObjByKey("pic2", (HBITMAP)LoadImage(nullptr, L"D:\\puc2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE));
cResourcePool::AddObjByKey("pic3", (HBITMAP)LoadImage(nullptr, L"D:\\puc3.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE));
cResourcePool::AddObjByKey("pic4", (HBITMAP)LoadImage(nullptr, L"D:\\puc4.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE));
}
~LoadResource(){};
}
#include "cResourcePool.h"
class Test
{
public:
Test()
{
HBITMAP h = cResourcePool::GethObjByKey("pic1");
}
~Test(){}
}
Этот пример показывает, как использовать ресурсы из пула. Для более подробного изучения можно обратиться к исходному коду UIEngine.
Дальнейшие обновления
Последующие обновления включают изменения в классе cGameEngine, добавление класса cSight для помощи в управлении графикой, пересмотр класса cMyTimer и некоторые корректировки в классе cCircle.
Также после обновления 2017/8/23:21:30 движок больше не зависит от шаблонов проектов VS, а создаёт и уничтожает окна самостоятельно.
Код после обновления
#include <cGameEngine.h>
using namespace MyEngine;
#pragma comment(lib, "UIEngine.lib")
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
cGameEngine::GetEngine()->init(hInstance); // Инициализируем движок
cGameEngine::GetEngine()->CreateText(L"文本", 100, 200); // Создаём текст
cGameEngine::GetEngine()->CreateRectangle(POINT{ 300,20 }, 100, 50); // Создаём прямоугольник
cCircle* pCir = new cCircle(POINT{ 200,400 }, 30);
cGameEngine::GetEngine()->AddEngineUi(pCir); // Добавляем круг в движок
return cGameEngine::GetEngine()->LuanchEngine(); // Запускаем движок
}
Результат кода
Безопасность после обновления от 2017/10/14:23:14
Пул ресурсов и класс cGameEngine были изменены для обеспечения безопасности потоков.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )