Проблемы с рисованием на c ++
-
06-07-2019 - |
Вопрос
Я вроде как новичок в c ++ и пытаюсь создать игру.У меня есть 2d массив RECT_GRID из прямоугольников.У меня есть 2d-массивная СЕТКА unsigned short.Я заполняю прямоугольный массив во время WM_CREATE
Событие WM_PAINT рисует прямоугольники для всех элементов массива.Цвет прямоугольника зависит от значения сетки[x][y]
Я сделал так, чтобы при нажатии клавиши down цвет одного из прямоугольников менялся путем установки GRID[1][XMOVE] = на другой цвет затем это делает недействительным клиентский прямоугольник
По сути, происходит то, что какое-то время это работает хорошо, но в конце концов это просто перестает что-то рисовать.Я проверил свою переменную XMOVE во время отладки, я проверил по значениям сетки и прочее, и все в порядке.Когда я удаляю цикл for из события paint и фокусируюсь на 1 конкретном прямоугольнике, он никогда не дает сбоев, но если я попытаюсь перерисовать их все сразу, примерно через 20 раз он перестанет рисовать объекты.Что могло бы стать причиной этого?Я новичок в c ++, и держу пари, что я неправильно рисую и вызываю переполнение или что-то в этом роде.
Если бы кто-нибудь мог объяснить, что происходит не так, или как правильно это сделать, я был бы очень признателен.Я не смог найти ничего подобного этому примеру в Google.Спасибо
Редактировать:
Я использую 3 глобальные кисти HBRUSH A;H КИСТЬ B;H КИСТЬ C;
и когда я изменяю их, я всегда говорю A = MakeBrush(NUM);
правильно ли я пользуюсь кистями?
Решение
Мое первое предположение, если вы абсолютный новичок в GDI / C ++, заключается в том, что вы, вероятно, создаете много ручек и кистей.Это ограниченные ресурсы в Windows.Вы можете создать только такое количество из них, прежде чем начнете облагать налогом свои ресурсы.Так что либо сделайте все свои кисти, перья, окошки и т.д. сразу и используйте их повторно, либо утилизируйте должным образом, когда закончите.Я рекомендую приобрести экземпляр "Библии" (http://www.amazon.com/Programming-Windows%C2%AE-Fifth-Microsoft/dp/157231995X/ref=sr_1_1?ie=UTF8&s=books&qid=1252788457&sr=8-1) и читаю там главы о рисовании.
Редактировать:Не похоже, что вы изменяете свои кисти должным образом, но поскольку я не вижу кода для MakeBrush, я не знаю.Вероятно, вы создаете множество кистей за кулисами и даже не подозреваете об этом.Серьезно, возьмите экземпляр книги Петцольда и потратьте на это час или два.Позже у тебя на голове вырастет еще больше волос!;-)
Другие советы
Вы заметите, что во всех примерах GDI за "CreatePen" или "CreateSolidBrush" будет следовать объект удаления.Это связано с тем, что они являются ограниченными ресурсами в Windows, и они могут закончиться, если вы не удалите их, когда закончите.
PAINTSTRUCT Ps;
HDC hDC = BeginPaint(hWnd, &Ps);
HBRUSH NewBrush = CreateSolidBrush(RGB(250, 25, 5));
SelectObject(hDC, NewBrush);
Rectangle(hDC, 20, 20, 250, 125);
DeleteObject(NewBrush);
EndPaint(hWnd, &Ps);
Если вы забудете включить вызов 'DeleteObject', то у вас возникнут проблемы после того, как вы израсходуете все доступные кисти.Это на самом деле забавно попробовать =)