Вопрос

Я вроде как новичок в 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', то у вас возникнут проблемы после того, как вы израсходуете все доступные кисти.Это на самом деле забавно попробовать =)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top