Проблемы с отрисовкой в ​​C ++ - PullRequest
0 голосов
/ 13 сентября 2009

Я новичок в c ++ и пытаюсь создать игру. У меня есть 2d массив RECT_GRID прямоугольников. У меня есть 2d массив GRID без знака короткого. Я заполняю прямоугольный массив во время WM_CREATE

Событие WM_PAINT закрашивает прямоугольники для всех элементов в массиве. Цвет прямоугольника основан на значении GRID [x] [y]

Я сделал это так, когда нажата клавиша «вниз». Он меняет цвет одного из прямоугольников, установив GRID [1] [XMOVE] = на другой цвет. тогда это делает недействительным клиентский прямоугольник

В основном, что происходит, это работает хорошо некоторое время, но в конечном итоге это просто прекращает рисовать вещи. Я проверил мою переменную XMOVE во время отладки, я проверил значения сетки и прочее, и все в порядке. Когда я удаляю цикл for из события рисования и фокусируюсь на 1 конкретном прямоугольнике, он никогда не завершается ошибкой, но если я пытаюсь перерисовать их все сразу, примерно через 20 раз, он перестает рисовать вещи. Что может вызвать это? Я новичок в c ++ и держу пари, что рисую неправильно и вызываю переполнение или что-то в этом роде.

Если бы кто-нибудь мог объяснить, что идет не так, или как правильно это сделать, я был бы очень признателен. Я не смог найти ничего подобного этому примеру в Google. Спасибо

EDIT:

Я использую 3 глобальные кисти HBRUSH A; HBRUSH B; HBRUSH C;

и когда я изменяю их, я всегда говорю A = MakeBrush (NUM);

Я правильно использую кисти?

Ответы [ 2 ]

5 голосов
/ 13 сентября 2009

Мое первое предположение, если вы новичок в GDI / C ++, это то, что вы, вероятно, создаете много перьев и кистей. Это ограниченные ресурсы в Windows. Вы можете создать их так много, прежде чем начнете облагать налогом свои ресурсы. Так что или сделайте ваши Кисти, Ручки и 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, я не знаю. Вы, вероятно, создаете много кистей за кулисами, и вы даже не знаете об этом. Серьезно, возьмите книгу Петцольда и потратьте час или два. Позже у тебя будет больше волос на голове! ; -)

2 голосов
/ 13 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...