标题:重绘问题,请教
只看楼主
taxueliuyun
Rank: 1
等 级:新手上路
帖 子:66
专家分:0
注 册:2007-4-17
 问题点数:0 回复次数:4 
重绘问题,请教

我做了一个连连看得程序,在响应鼠标左键的函数中出现了一个问题,就是:我的本意是如果第二次选中的图案与第一次不同,就将第二次的那个图案用一个矩形框圈起来,但是总是不成功,只是不能画出这个矩形框,我检查出是重绘的问题,但不知是为什么,请教了,先谢了。下面是响应左键的代码:
void C_LLK_Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
//1.计算鼠标点击方块的的位置
int x=point.x/FRONTWIDTH+(point.x%FRONTWIDTH?1:0)-1;
int y=point.y/FRONTHEIGHT+(point.y%FRONTHEIGHT?1:0)-1;

//2.在游戏区域内并且该区域还有该区域不是空的区域
if(x<m_nCol&&y<m_nRow&&m_map[y*m_nCol+x]!= BLANK_STATE)
{


//3.假设尚未记录第一个方块
if(m_nX1==BLANK_STATE)
{
//4.记录第一个方块的位置
m_nX1=x;
m_nY1=y;

//获取程序框架的设备环境
CDC *pWinDC = GetDC();

//临时绘制点中的方块外框
//只绘屏幕不载入内存位图
CPen myPen;
CPen *pOldPen;
myPen.CreatePen(PS_SOLID, 4, RGB(255,0,0));
pOldPen = pWinDC->SelectObject(&myPen);
//方块外框绘制,线条环绕绘制框架
pWinDC->MoveTo(x*FRONTWIDTH,y*FRONTHEIGHT);
pWinDC->LineTo(x*FRONTWIDTH,(y+1)*FRONTHEIGHT);
pWinDC->LineTo((x+1)*FRONTWIDTH,(y+1)*FRONTHEIGHT);
pWinDC->LineTo((x+1)*FRONTWIDTH,y*FRONTHEIGHT);
pWinDC->LineTo(x*FRONTWIDTH,y*FRONTHEIGHT);
//现场恢复
pWinDC->SelectObject(pOldPen);
}
else
{
//5.判断是否点击的方块非本身, 是否点击同一种动物
if((m_nX1!=x||m_nY1!=y)&&
m_map[m_nY1*m_nCol+m_nX1]==m_map[y*m_nCol+x]
)
{
//6.检测是否可以消除
if(IsLink(m_nX1,m_nY1,x,y))
{
//7.数据清理
m_map[m_nY1*m_nCol+m_nX1]=BLANK_STATE;
m_map[y*m_nCol+x]=BLANK_STATE;
//8.清空记录方块的值
m_nX1=BLANK_STATE;
m_nY1=BLANK_STATE;

//通知重绘
Invalidate(FALSE);
}
}
else
{
//通知重绘
Invalidate(FALSE);//我怀疑是这句代码出错了,不知为什么?

m_nX1=x;
m_nY1=y;

//获取程序框架的设备环境
CDC *pWinDC = GetDC();

//临时绘制点中的方块外框
//只绘屏幕不载入内存位图
CPen myPen;
CPen *pOldPen;
myPen.CreatePen(PS_SOLID, 4, RGB(255,0,0));
pOldPen = pWinDC->SelectObject(&myPen);
//方块外框绘制,线条环绕绘制框架
pWinDC->MoveTo(x*FRONTWIDTH,y*FRONTHEIGHT);
pWinDC->LineTo(x*FRONTWIDTH,(y+1)*FRONTHEIGHT);
pWinDC->LineTo((x+1)*FRONTWIDTH,(y+1)*FRONTHEIGHT);
pWinDC->LineTo((x+1)*FRONTWIDTH,y*FRONTHEIGHT);
pWinDC->LineTo(x*FRONTWIDTH,y*FRONTHEIGHT);
//现场恢复
pWinDC->SelectObject(pOldPen);
}

}
}

//察看是否已经胜利
if(IsWin())
{
MessageBox("恭喜您胜利闯关,即将开始新局");
StartNewGame();
}
}

搜索更多相关主题的帖子: 鼠标 连连看 point 图案 左键 
2007-08-14 21:03
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
得分:0 
你为什么要把参数设为FALSE呢

天行健,君子以自强不息!!QQ:68660681
2007-08-14 21:13
taxueliuyun
Rank: 1
等 级:新手上路
帖 子:66
专家分:0
注 册:2007-4-17
得分:0 

这个有影响吗?true与false的区别只是 是否删除更新区域中的背景而已,true与false好像没有什么区别,我刚刚试过了,改成true也还是一样的,用不用我传给源文件与你?
我的QQ:544124847。望不吝赐教.

2007-08-14 21:31
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
得分:0 

请问当前没有选择,你点的时候是否能辉出边框?如果可放一个Invalidate(FALSE)在绘边框之后看看


天行健,君子以自强不息!!QQ:68660681
2007-08-14 22:00
taxueliuyun
Rank: 1
等 级:新手上路
帖 子:66
专家分:0
注 册:2007-4-17
得分:0 
我试过了,还是不行,不知怎么搞得,要不我把源码传给你,你试试看,好么
2007-08-15 16:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-162727-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.614321 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved