Comments 20
Эта статья посвящена самому началу работы с Direct2D
Ну и где тут хоть одна строка имеющая отношение к Direct2D?
Не совсем вас понял. Буквально всё, имеет к нему отношение. Ведь без окна , графика не возможна. Но если я выдам всё сразу, получится большее полотно, и используя здравый смысл - я разделил на множество статей.
Хотя прочитав ваш комментарий, я теперь слегка изменю и сделаю пометку, что это первая статья в серии.
"Direct2D разработан компанией Microsoft для создания приложений под управлением операционных систем Windows" - прямая цитата с поисковика. Ну вот, собственно, первая статья это начало, которое объясняет создание окна.
С архитектуры процессора тогда уж можно бы было начать, без него Direct2D графика тоже невозможна. Потом плавно перейти к устройству ядра windows, а только уж потом рассказывать о том как создавать окна на winapi.
Я уж не говорю про то что те, кому зачем-то может понадобиться в 2025 году напрямую работать с низкоуровневвм графическим апи вроде d2d, как правило уже в курсе что такое окно.
статья посвящена самому началу работы с Direct2D
Тогда что она делает в сишном хабе? Нет, если автор покажет рабочий код Direct2D на чистых сях (без костылей на плюсах), это будет номер!
в документации от Microsoft мало что сказано о том, что вообще нужно сделать для создания окна
А это что? Целый учебник с картинками: Get Started with Win32 and C++ (даю линк на английскую версию, т.к. перевод ИИ в MSDN на русский — кровь из глаз).
И почему в затравочном абзаце речь про DX, а тут резко упали до D2D?
структуре класса окна _WNDCLASS. Обратившись к MSDN, получим следующее
Почему WNDCLASSEX в "цитате" из MSDN и в статье обозвали "_WNDCLASS", когда у последнего (сиречь WNDCLASS) полей меньше? И ссылка дана на ansi версию, когда по ходу пьесы у нас вовсю юникод будет?
UPD. Что-то странное с примерами кода:
intWINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,intnCmdShow)
...lpCmdLine - аргументы, указанные при
Это который из четырех?
Имея все пункты, соединяем воедино:
Соединили:
#include <Windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0); //Отправляет сообщение WM_QUIT
return 0;
case WM_PAINT:
{
return 0;
}
// Сообщения, которые мы не обработали, передаем на обработку по умолчанию
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
const wchar_t* CLASS_NAME = L"MyWindowClass";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd, int nCmdShow)
{
// 1. Заполнение структуры класса окна
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(WNDCLASSEX); // Обязательно: размер структуры
wc.lpfnWndProc = WindowProc; // Указатель на оконную процедуру
wc.hInstance = hInstance; // Экземпляр приложения
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Курсор - стрелка
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // Фон - цвет окна
wc.lpszClassName = CLASS_NAME; // Уникальное имя класса
// 2. Регистрация класса окна
RegisterClassEx(&wc));
// 3. Создание окна
HWND hwnd = CreateWindowEx(
0, // Расширенные стили
CLASS_NAME, // Имя класса окна
L"Test Window", // Заголовок окна
WS_OVERLAPPEDWINDOW, // Стиль окна
100, 100, // Позиция (x, y)
400, 300, // Размер (width, height)
NULL, // Родительское окно
NULL, // Меню
hInstance, // Экземпляр приложения
NULL // Дополнительные параметры
);
// 4. Показать и обновить окно
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// 5. Цикл обработки сообщений
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0; // Код завершения из WM_QUIT
}Я нашел 2 причины, почему этот код вообще не скомпилируется. Это нейруха сгенерировала что ли, или просто влом было собирать перед публикацией?
Ну и:
return0; // Код завершения из WM_QUIT
Нет, это обычный ноль!
Возьмите любую функцию и откройте её в MSDN пролистайте вниз, внизу будет указано в какой она DLL , ну а дальше используете DLL как обычно.(Если хотите могу пример и на ассемблере x86 (NASM) скинуть, но в личку)
Ну вы сами понимаете, что есть только на английском, а это на русском.
Как ранее говорил, ошибка форматирования статьи, думал что исправил. Уже исправлено.
Спасибо за комментарий
Спасибо , конечно, за пересказ книги Петцольда 95 года. Надеюсь, дальше будет что-то интереснее.
А зачем вообще выбирать Direct2D? Штука прямо ОЧЕНЬ специфическая, со своими приколами. Почему не Direct 3D, как делает 95% разработчиков? Почему не DirectDraw какой-нибудь?
Насчёт вопроса почему 2D, ну потому что рисуя двухмерное, не важное что это, при помощи Direct3D придётся игнорировать ещё одну ось(об этом кстати даже в интернете есть обсуждения).
Ну то есть это просто странно.
А насчёт DirectDraw - он давно устарел, "DirectDraw уже давно не используется, он был актуален в определённых версиях DirectX. Direct2D появился с DirectX10 и считается актуальным для 2D-графики." Вот ссылка подробней.
Ну и цикл обработки сообщения неправильный, вдовесок. А так - пишите шура пока пишется, не всем умные буквы читать
А почему собственно не правильный, точней чем? Можно отметить что GetMessage блокирует поток ожиданием сообщения, но в данном примере, в целом логично, ничего другого же нет, что бы это как-то повлияло
А почему собственно не правильный, точней чем?
Вы документацию конкретно по GetMessage() до конца читали? Что она в случае ошибки возвращает?
(Было иное сообщение, перепутал с другим языком).
Даже если будет ошибка, и функция снова выполнится, в данном случае ничем это не грозит, так как ошибка будет со стороны системы.
У нас обработка сообщений родительского окна. Вопрос на засыпку, когда hwnd станет не валидным? Собственно когда уничтожено окно или ещё что-то экзотическое случилось. Ну то есть стабильно просто так оно не случится, а стабильно может, если вызвать DestroyWindow.
Выходит, приходим к такому, что раз мы не используем DestroyWindow, то смысла от этих проверок? Проверка ради проверок?
Любая нештатная ситуация не должна быть нештатной.
Единственное что должно "рандомно" влиять на ваш код это излучение из космоса.
Если вы разрабатываете для себя и уверены что всё окей - флаг вам в руки. Если пишите не для себя, то очень быстро обнаружите умника который захотел потеребить win32 и сломал вашу либу, а так как обработчиков у вас не предусмотренно начинается срач что либа\гайд херня и тд.
Если вы ленивый и не хотите соблюдать гайдлайн, вы можете просто вкинуть исключение с мыслями "это никогда не произойдёт", но если это произойдёт то вы или кто-то хотя бы будите знать где, а не сидеть и думать "что я написал такого 3 месяца назад что теперь эта фигня падает\зависает". Какого-нибудь условного макроса #define THROWERR throw _LINE_+_FILE_в целом хватит
ну, -1, а, или вы не знаете, что любое значение кроме 1, в лог. форме является нулём?
Ээ, рановато вам статьи писать...
#include <stdio.h>
int main() {
while (-1)
printf("!");
return 0;
}запустите на досуге
И почему? Потому что наспех перепутал язык? Может не стоит цепляться и подумать когда же hwnd не валидный(это буквально если не вручную допущено, то по сути не возможно)? Или вы тролль? (внёс правки)
Или вы тролль?
Комментарий выше на ваше утверждение о «-1 → 0» в топике C/C++ — это не троллинг, а вполне адекватная реакция. Не важно, перепутали вы что-то или нет, вы об этом написали и вам на это ответили.
В части правильно/неправильно давать в «руководстве для новичков» подход, который может привести к ошибкам в более сложных случаях, тут уж вам решать. Вы же сами назвали статью «альтернативой» документации и захотели улучшить ее.
По поводу отношения к руководствам по win32 в 2025 году (а их за все время накопилось, хоть попой ешь) скажу так. Примерно раз в год на Хабре случаются выбросы в духе: «Пацаны, сейчас я научу вас писать свой движок на DX12. Часть первая: язык Си создал Деннис Ритчи в 1970 году, вот это указатель, вот так писать на плюсах, а так — создается окно. Вот мы и нарисовали окно, а как рисовать, объясню в следующей части».
Ясен пончик, запал заканчивается, и не то что до рисования — до инициализации DX дело не доходит, т.к. писатели сами вдуплить не могут в те 100500 loc, необходимых для радужного треугольника, либо поняли, что объяснить могут только треть или четверть из всего этого бойлерплейта. И все эти первые части стыдливо стираются самими авторами по прошествии пубертатного периода времени.
Пользователи этот цирк видят, отчего сии опусы у некоторых комментаторов ничего кроме раздражения и желания поострить не вызывают.
Direct2D #1: альтернатива началу документации