求问ontimer函数调用 我用ontimer实现一个绘图函数。如果图像坐标在ontimer函数中改变,ondraw函数中绘图,图像不能动了。如果在ontimer中修改一个变量,在ondraw中用这个变量去修改图像坐标,图像就能动了。求问如何在ontimer中修改图像坐标也能让图像动起来。 多谢各位大牛!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 估计是图像坐标在ontimer函数中改变后,而函数ondraw函数绘图没有执行(也即没有WM_PAINT)消息修改下,如果图像坐标在ontimer函数中改变了,则直接调用函数InvalidateRect使窗体接受WM_PAINT消息,进行绘图。 在ontimer函数里边,InvalidateRect图片的坐标。 就是在ontimer末尾加上InvalidateRect函数确认下“图像坐标在ontimer函数中改变后“在ondraw中能用上图像坐标改变的值吗是不是图像坐标定义成全局的才合适? 我一般是这样实现的:在OnTimer在生成重画消息,在OnDraw中重画。 坐标是定义为全局了,我把画图函数加到ontimer里才行,如果画图函数在ondraw里,InvalidateRect也不好使,不知道为啥 InvalidateRect后加句updatewindow试试..另是不是InvalidateRect参数有没有设置正确 >>坐标是定义为全局了,我把画图函数加到ontimer里才行,如果画图函数在ondraw里,InvalidateRect也不好使,不知道为啥为了确定问题的原因,可以增加些调试信息1.先确定下ontimer 里 增加了InvalidateRect 函数后,是否使ondraw函数运行了 在 ontimer 函数里的InvalidateRect 后 增加TRACE("InvalidateRect\n");2.然后在ondraw里增加 TRACE("OK\n");3.按 F5 调试运行程序 就可以输出的信息,大体可以推断出问题的所在如果上述测试表明InvalidateRect没起作用则在InvalidateRect 后再增加 UpdateWindow函数强制发送WM_PAINT消息 终于搞好了,在ontimer中改坐标,ondraw中画出来。我加上了用键盘上下左右来控制图像坐标的平移,但是ontimer里不响应,不知道为啥,代码如下,请各位大神指点一下。void CSnakeView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default int i=0; if(yFlag==1) { //水平运动 for(i=0; i<snakeCount-1;i++) { snakePoint[i].x=snakePoint[i+1].x; snakePoint[i].y=snakePoint[i+1].y; } snakePoint[snakeCount-1].x=snakePoint[snakeCount-1].x+xFlag*50; snakePoint[snakeCount-1].y=snakePoint[snakeCount-1].y; } else { //上下运动 for(i=0; i<snakeCount-1;i++) { snakePoint[i].x=snakePoint[i+1].x; snakePoint[i].y=snakePoint[i+1].y; } snakePoint[snakeCount-1].x=snakePoint[snakeCount-1].x; snakePoint[snakeCount-1].y=snakePoint[snakeCount-1].y+xFlag*50; } snakeStep++; InvalidateRect(CRect(-1500, -1200, 1200, 1500)); CView::OnTimer(nIDEvent);}void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default switch(nChar){ case VK_DOWN: xFlag=-1; yFlag=-1; Invalidate() ; break; case VK_UP: xFlag=1; yFlag=-1; Invalidate() ; break; case VK_LEFT: xFlag=-1; yFlag=1; Invalidate() ; break; case VK_RIGHT: xFlag=1; yFlag=1; Invalidate() ; break; default:; Invalidate() ; break; } CView::OnKeyDown(nChar, nRepCnt, nFlags);} 请问onkeydown中如何传递消息给ontimer ? 直接修改全局变量的话好像传递不过去 求高手帮忙 串口读入数据无法写入JPG 输出的是乱码。。。求解决。。。急~~~~ 欢迎各位界面大侠进来商讨。 文件bit流处理的问题,大家一起探讨!!!!!!!!!!!!!!!!!!!! 两个程序通讯的问题 简单问题请各位大侠指点. 在调用SetupDiEnumDeviceInterfaces()时出现的问题,已给出原码,请赐教!谢谢 关于CImage的问题,超级烦人 Windows中密码的解密 创建文件夹权限问题 求教如何显示出一个bmp文件有多张位图里的位图? 如何读取现成的.csv文件?并且显示出来?
修改下,如果图像坐标在ontimer函数中改变了,则直接调用函数InvalidateRect使窗体接受
WM_PAINT消息,进行绘图。
确认下“图像坐标在ontimer函数中改变后“
在ondraw中能用上图像坐标改变的值吗
是不是图像坐标定义成全局的才合适?
在OnTimer在生成重画消息,在OnDraw中重画。
为了确定问题的原因,可以增加些调试信息
1.先确定下ontimer 里 增加了InvalidateRect 函数后,是否使ondraw函数运行了
在 ontimer 函数里的InvalidateRect 后 增加TRACE("InvalidateRect\n");
2.然后在ondraw里增加
TRACE("OK\n");
3.按 F5 调试运行程序 就可以输出的信息,大体可以推断出问题的所在
如果上述测试表明InvalidateRect没起作用则
在InvalidateRect 后再增加 UpdateWindow函数强制发送WM_PAINT消息
我加上了用键盘上下左右来控制图像坐标的平移,但是ontimer里不响应,不知道为啥,代码如下,请各位大神指点一下。void CSnakeView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int i=0;
if(yFlag==1)
{
//水平运动 for(i=0; i<snakeCount-1;i++)
{
snakePoint[i].x=snakePoint[i+1].x;
snakePoint[i].y=snakePoint[i+1].y;
}
snakePoint[snakeCount-1].x=snakePoint[snakeCount-1].x+xFlag*50;
snakePoint[snakeCount-1].y=snakePoint[snakeCount-1].y;
}
else
{
//上下运动 for(i=0; i<snakeCount-1;i++)
{
snakePoint[i].x=snakePoint[i+1].x;
snakePoint[i].y=snakePoint[i+1].y;
}
snakePoint[snakeCount-1].x=snakePoint[snakeCount-1].x;
snakePoint[snakeCount-1].y=snakePoint[snakeCount-1].y+xFlag*50;
}
snakeStep++; InvalidateRect(CRect(-1500, -1200, 1200, 1500)); CView::OnTimer(nIDEvent);
}
void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch(nChar){
case VK_DOWN:
xFlag=-1;
yFlag=-1; Invalidate() ;
break;
case VK_UP:
xFlag=1;
yFlag=-1; Invalidate() ;
break;
case VK_LEFT:
xFlag=-1;
yFlag=1;
Invalidate() ;
break;
case VK_RIGHT:
xFlag=1;
yFlag=1;
Invalidate() ;
break; default:;
Invalidate() ;
break;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}