为什么我创建的HPEN还有HBRUSH有的时候会出现以下这种怪异情况呢?

来源:百度知道 编辑:UC知道 时间:2024/05/15 18:02:02
我做的一个小的五子棋的游戏。其中,玩家的为黑棋,电脑为白棋。

但是在测试的时候,发现个很怪异的问题,就是当玩家在开局的时候,连续走4个相连的棋位,然后,要走第五个棋位(就是走下去就可以赢的那个棋位)的时候,如果不走那个棋位,而是乱走一步的话,此时,电脑会在那个棋位下子(这是正确的,电脑的算法会那样走),但是!这个时候,怪异的问题出现了,电脑走的棋子会显示为黑棋?!然后,再继续走棋,又正常了。。。。。

源码这里贴不下,我放我百度博客的日志里的,链接地址:
http://hi.baidu.com/love8_7less/blog/item/485f05009be8d3054afb5167.html
谢谢了额哈!
重要的地方就是那个函数fnInit中,里面定义的HPEN 和 HBRUSH 。
这个,先谢谢各位了哈!
首先谢谢各位了哈!算法肯定没有问题的,这个我调过了的。。。。肯定是GDI的调用的问题。
先谢谢silvergingko了哈,我照到你说的改下哈。。。

我没有看你的算法。进去我就冲着你所有关于GDI的调用是否正确。现在我认为出现的问题是:
为HDC选中其他的GDI句柄如HPEN后,如果HPEN不用,不能立刻DeleteObject,而是需要让HPEN从被HDC正在使用的状态中退出来,即
HPEN hOlePen = (HPEN)SelectObject(hDC, hPen);
...
hPen = (HPEN)SelectObject(hDC, hOldPen);
DeleteObject(hPen);
楼主可以试着修改下代码,看看能否解决问题,五子棋的算法代码太长了,没耐心看,如果是因为算法上有问题,就需要楼主自己解决了。

对于GetStockObject这样的函数得到的GDI句柄,是不需要调用DeleteObject的。顾名思义,GetStockObject==取得库存对象,对象是原先在“库存”里,我们用不着删除它。所谓的“库存”,是指WINDOWS预定义好了的GDI,由WINDOWS打理,我们不需要删除。

for(int a=0;a<19;a++)
for(int b=0;b<19;b++)
{
if(1 == nGrid[a][b])
{
SelectObject(hDC,hPen);
SelectObject(hDC,hBrush);
Ellipse(hDC,(b+1)*20-10,(a+1)*20-10,(b+1)*20+10,(a+1)*20+10);
}
if(-1 == nGrid[a][b])
Ellipse(hDC,(b+1)*20-10,(a+1)*20-10,(b+1)*20+10,(a+1)*20+10);
}
DeleteObject(hPen);
DeleteObject(hBrush);
}
这段代码有点混乱,画笔怎么会在循环语句中重复被选中呢?虽然有个IF语句限定,能保证HPEN只会被选中一次?并且DeleteObject放