标准c写的windows程序因为使用内存过量导致程序崩溃,问题在哪儿?
/*以下程序使用标准c编写,运行一段时间之后会变得不响应。从内存使用上来看,程序占用的内存越来越多,没办法释放,那位有解决的办法,回复本贴或者QQ:23033206都可以,急用,多谢!*/
#include <windows.h>
#include <time.h>
#include "resource.h"
#define SCREENWIDTH 128
#define SCREENHEIGHT 128
HINSTANCE instance;
HBITMAP bmpstart;
int visualflag,delay;
void DrawAll(HDC dc);
void MainMenu();
void DrawBmp(HDC dc, int x, int y, int width, int height,HBITMAP bmp, int sx, int sy, int transparent);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR pCmdLine,int iCmdShow)
{
MSG msg;
WNDCLASSEX wndproc;
HWND hWnd;
instance=hInstance;
wndproc.cbSize=sizeof(WNDCLASSEX);
wndproc.lpfnWndProc=(WNDPROC)WndProc;
wndproc.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS|CS_OWNDC;
wndproc.cbClsExtra=0;
wndproc.cbWndExtra=0;
wndproc.hInstance=hInstance;
wndproc.hIcon=NULL;
wndproc.hCursor=LoadCursor(NULL,IDC_ARROW);
wndproc.hbrBackground=(HBRUSH)(0);
wndproc.lpszMenuName=NULL;
wndproc.lpszClassName="abc";
wndproc.hIconSm=NULL;
RegisterClassEx(&wndproc);
hWnd=CreateWindow("abc","abc",WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,SCREENWIDTH,SCREENHEIGHT+26,NULL,NULL,hInstance,NULL);
if(!hWnd)
return 0;
bmpstart=LoadBitmap(instance,MAKEINTRESOURCE(IDB_start));
SetTimer (hWnd, 1, 30, NULL);
while(GetMessage(&msg,NULL,0,0))
{
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND wnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
HDC dc,buf=0;
RECT rect;
PAINTSTRUCT paint;
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_TIMER:
MainMenu();
rect.left = rect.top = 0;
rect.right = SCREENWIDTH;
rect.bottom = SCREENHEIGHT;
InvalidateRect (wnd, & rect, 0);
break;
case WM_PAINT:
dc=BeginPaint(wnd,&paint);
GetClientRect (wnd, & rect);
if (!buf)
{
buf = CreateCompatibleDC(dc);
SelectObject (buf,
CreateCompatibleBitmap(dc, SCREENWIDTH, SCREENHEIGHT));
}
DrawAll (buf);
BitBlt(dc, 0, 0, SCREENWIDTH, SCREENHEIGHT, buf, 0, 0, SRCCOPY);
EndPaint(wnd,&paint);
DeleteObject(buf);
break;
case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_SYSCHAR:
case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_RBUTTONDBLCLK:
case WM_MOUSEMOVE:
break;
default:
return DefWindowProc(wnd,msg,wParam,lParam);
}
return 0;
}
void DrawAll(HDC dc)
{ if(visualflag)
{
DrawBmp(dc,15,80,93,20,bmpstart,0,0,0);
}
}
void MainMenu()
{
delay--;
if(delay<=0)
{
visualflag=visualflag==0?1:0;
delay=10;
}
}
void DrawBmp(HDC dc, int x, int y, int width, int height,
HBITMAP bmp, int sx, int sy, int transparent)
{
HDC buf = CreateCompatibleDC (dc);
SelectObject (buf, bmp);
if (transparent)
TransparentBlt ( dc,x,y,width,height,buf,sx,sy,width,height,RGB(255,255,255));
else
StretchBlt (dc,x, y,width,height,buf, sy, sy, width, height,SRCCOPY);
DeleteObject (buf);
}