
我是C++语言初学者,编写的一个小程序出了点问题,求高手解答
部分代码如下:LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){intwmId...
部分代码如下:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc=GetDC(hWnd);
static int l=0,t=0,r=100,b=100;
static RECT* pCrect=new RECT;
RECT rect;
RECT* pRun=new RECT;
RECT* ptemp=new RECT;
RECT* ptemp2=new RECT;
RECT* pRect=▭
static int Xspeed=0,Yspeed=0;
char chxspeed[10];
char chyspeed[10];
GetClientRect(hWnd,pCrect);
rect.left=l;
rect.top=t;
rect.right=r;
rect.bottom=b;
ptemp->left=50;
ptemp->top=pCrect->bottom-60;
ptemp->right=220;
ptemp->bottom=pCrect->bottom;
ptemp2->left=rect.left-15;
ptemp2->top=rect.top-15;
ptemp2->right=rect.right+15;
ptemp2->bottom=rect.bottom+15;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
// DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
SetTimer(hWnd,TIME_RUN,10,NULL);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
Rectangle(hdc,l,t,r,b);
itoa(Xspeed,chxspeed,10);
itoa(Yspeed,chyspeed,10);
TextOut(hdc,0,pCrect->bottom-40,"Xspeed:",strlen("Xspeed:"));
TextOut(hdc,70,pCrect->bottom-40,chxspeed,strlen(chxspeed));
TextOut(hdc,0,pCrect->bottom-60,"Yspeed:",strlen("Yspeed:"));
TextOut(hdc,70,pCrect->bottom-60,chyspeed,strlen(chyspeed));
EndPaint(hWnd, &ps);
break;
case WM_TIMER:
switch(wParam)
{
case TIME_UP:
Yspeed-=1;
break;
case TIME_DWON:
Yspeed+=1;
break;
case TIME_LEFT:
Xspeed-=1;
break;
case TIME_RIGHT:
Xspeed+=1;
break;
case TIME_RUN:
r+=Xspeed/5;
l+=Xspeed/5;
t+=Yspeed/5;
b+=Yspeed/5;
InvalidateRect(hWnd,ptemp,FALSE);
delete ptemp;
InvalidateRect(hWnd,ptemp2,FALSE);
delete ptemp2;
}
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:
SetTimer(hWnd,TIME_UP,10,NULL);
break;
case VK_DOWN:
SetTimer(hWnd,TIME_DWON,10,NULL);
break;
case VK_LEFT:
SetTimer(hWnd,TIME_LEFT,10,NULL);
break;
case VK_RIGHT:
SetTimer(hWnd,TIME_RIGHT,10,NULL);
break;
}
break;
case WM_KEYUP:
switch(wParam)
{
case VK_UP:
KillTimer(hWnd,TIME_UP);
break;
case VK_DOWN:
KillTimer(hWnd,TIME_DWON);
break;
case VK_LEFT:
KillTimer(hWnd,TIME_LEFT);
break;
case VK_RIGHT:
KillTimer(hWnd,TIME_RIGHT);
break;
}
break;
。。。。。。。。。
程序可以运行,但是运行一段时间后就会突然全屏(好像是),然后很卡很卡,不知道是怎么回事。 展开
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc=GetDC(hWnd);
static int l=0,t=0,r=100,b=100;
static RECT* pCrect=new RECT;
RECT rect;
RECT* pRun=new RECT;
RECT* ptemp=new RECT;
RECT* ptemp2=new RECT;
RECT* pRect=▭
static int Xspeed=0,Yspeed=0;
char chxspeed[10];
char chyspeed[10];
GetClientRect(hWnd,pCrect);
rect.left=l;
rect.top=t;
rect.right=r;
rect.bottom=b;
ptemp->left=50;
ptemp->top=pCrect->bottom-60;
ptemp->right=220;
ptemp->bottom=pCrect->bottom;
ptemp2->left=rect.left-15;
ptemp2->top=rect.top-15;
ptemp2->right=rect.right+15;
ptemp2->bottom=rect.bottom+15;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
// DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
SetTimer(hWnd,TIME_RUN,10,NULL);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
Rectangle(hdc,l,t,r,b);
itoa(Xspeed,chxspeed,10);
itoa(Yspeed,chyspeed,10);
TextOut(hdc,0,pCrect->bottom-40,"Xspeed:",strlen("Xspeed:"));
TextOut(hdc,70,pCrect->bottom-40,chxspeed,strlen(chxspeed));
TextOut(hdc,0,pCrect->bottom-60,"Yspeed:",strlen("Yspeed:"));
TextOut(hdc,70,pCrect->bottom-60,chyspeed,strlen(chyspeed));
EndPaint(hWnd, &ps);
break;
case WM_TIMER:
switch(wParam)
{
case TIME_UP:
Yspeed-=1;
break;
case TIME_DWON:
Yspeed+=1;
break;
case TIME_LEFT:
Xspeed-=1;
break;
case TIME_RIGHT:
Xspeed+=1;
break;
case TIME_RUN:
r+=Xspeed/5;
l+=Xspeed/5;
t+=Yspeed/5;
b+=Yspeed/5;
InvalidateRect(hWnd,ptemp,FALSE);
delete ptemp;
InvalidateRect(hWnd,ptemp2,FALSE);
delete ptemp2;
}
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:
SetTimer(hWnd,TIME_UP,10,NULL);
break;
case VK_DOWN:
SetTimer(hWnd,TIME_DWON,10,NULL);
break;
case VK_LEFT:
SetTimer(hWnd,TIME_LEFT,10,NULL);
break;
case VK_RIGHT:
SetTimer(hWnd,TIME_RIGHT,10,NULL);
break;
}
break;
case WM_KEYUP:
switch(wParam)
{
case VK_UP:
KillTimer(hWnd,TIME_UP);
break;
case VK_DOWN:
KillTimer(hWnd,TIME_DWON);
break;
case VK_LEFT:
KillTimer(hWnd,TIME_LEFT);
break;
case VK_RIGHT:
KillTimer(hWnd,TIME_RIGHT);
break;
}
break;
。。。。。。。。。
程序可以运行,但是运行一段时间后就会突然全屏(好像是),然后很卡很卡,不知道是怎么回事。 展开
4个回答
展开全部
1 卡的问题
HDC hdc=GetDC(hWnd);
解决办法: a, HDC = hdc; b 消息循环退出之前调用 ReleaseDC ;
2 你的程序并没有全屏,而是不小心得到了桌面的设备刷新了桌面。原因在于GetDC申请了太多的设备资源
3 还有一些内存泄露的小问题,自己分析下。
HDC hdc=GetDC(hWnd);
解决办法: a, HDC = hdc; b 消息循环退出之前调用 ReleaseDC ;
2 你的程序并没有全屏,而是不小心得到了桌面的设备刷新了桌面。原因在于GetDC申请了太多的设备资源
3 还有一些内存泄露的小问题,自己分析下。
展开全部
你真是很谦虚,这样的程序可联是初学者写的出来的吧。
也不知道你是干了什么让它突然就全屏了。既然能运行那这感觉像是内存出了问题,你定义了很多静态变量,如果程序效果也是渐近改变矩形大小方位的话,那样应该会有大量内存被占,时间长了,就会出现意想不到的情况。个人见解,仅供参考
也不知道你是干了什么让它突然就全屏了。既然能运行那这感觉像是内存出了问题,你定义了很多静态变量,如果程序效果也是渐近改变矩形大小方位的话,那样应该会有大量内存被占,时间长了,就会出现意想不到的情况。个人见解,仅供参考
追问
为什么定义静态变量就会有大量内存被占呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不着急的话我明天上班帮你调试了看下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
设置10ms的定时器根本就没任何意义,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询