-1

我是 C++ 的新手,我正在尝试创建一个游戏。我有一个矩形的二维数组 RECT_GRID。我有一个无符号短的二维数组网格。我在 WM_CREATE 期间填充矩形数组

WM_PAINT 事件为数组中的所有元素绘制矩形。矩形的颜色基于 GRID[x][y] 的值

我这样做了,当按下向下键时,它通过将 GRID[1][XMOVE] = 设置为不同的颜色来更改其中一个矩形的颜色,然后它使客户端矩形无效

基本上发生的情况是,它在一段时间内运行良好,但最终它只是停止绘制东西。我在调试期间检查了我的 XMOVE 变量,我检查了网格值和其他东西,一切都很好。当我从绘画事件中删除 for 循环并专注于 1 个特定矩形时,它永远不会失败,但如果我尝试一次重绘所有这些矩形,大约 20 次后,它会停止绘画。什么可能导致这种情况?我是 C++ 新手,我敢打赌我没有正确绘画并导致溢出或其他问题。

如果有人可以解释出了什么问题,或者正确的方法来做到这一点,我将非常感激。我在谷歌上找不到类似这个例子的东西。谢谢

编辑:

我正在使用 3 个全局画笔 HBRUSH A;灌木丛 B; 刷子 C;

当我修改它们时,我总是说 A = MakeBrush(NUM);

我正确使用画笔吗?

4

2 回答 2

5

我的第一个猜测是,如果您完全是 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 的代码,我不知道。您可能在幕后创建了很多画笔,而您甚至都不知道。说真的,买一本 Petzold 的书,花一两个小时。以后你的头上会长出更多的头发!;-)

于 2009-09-12T20:48:18.153 回答
2

您会注意到,在所有 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”调用,那么在用完所有可用的画笔后您将遇到问题。尝试真的很有趣=)

于 2009-09-12T22:08:06.207 回答