是要用来在窗口中显示一个球,该球以与水平成45度角做直线运动,当遇到边界时,反弹回来,仍然与水平成45度角继续运动
#include<windows.h>
#define min(a,b) (((a)<(b))?(a):(b))
#define max(a,b)  (((a)>(b))?(a):(b))
HWND hwnd;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(
   HINSTANCE hInstance,
   HINSTANCE hPrevInstance,
   LPSTR szCmdLine,
   int nCmdShow)
{
static char szAppName[]="Ball"; MSG msg;
WNDCLASS wndclass;
if(!hPrevInstance)  //在win32下可省
{
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
RegisterClass(&wndclass);
}
hwnd=CreateWindow(szAppName,
"Bouncing ball",
WS_OVERLAPPEDWINDOW|WS_VSCROLL,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if(!SetTimer(hwnd,1,50,NULL))
{
MessageBox(hwnd,"Too many clocks or timers!",szAppName,MB_ICONEXCLAMATION|MB_OK);
return FALSE;
}
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static handle hBitmap;
static short cxClient,cyClient,xCenter,yCenter,cxTotal,cyTotal,cxRadius,cyRadius,cxMove,cyMove,xPixel,yPixel;
HBRUSH hBrush;
HDC hdc,hdcMem;
short nScale; switch(message)
{
case WM_CREATE:
hdc=GetDC(hwnd);
xPixel=GetDeviceCaps(hdc,ASPECTX);//此函数返回设备信息,得到划一条线设备用的X方向一个象素单位的相对长度
yPixel=GetDeviceCaps(hdc,ASPECTY);
ReleaseDC(hwnd,hdc);
case WM_SIZE:
xCenter=(cxClient=LOWORD(lParam))/2;
yCenter=(cyClient=HIWORD(lParam))/2;
nScale=min(cxClient*xPixel,cyClient*yPixel)/16;
cxRadius=nScale/xPixel;
cyRadius=nScale/yPixel;
cxMove=max(1,cxRadius/4);
cyMove=max(1,cyRadius/4);
cxTotal=2*(cxRadius+cxMove);
cyTotal=2*(cyRadius+cyMove);
if(hBitmap)
DeleteObject(hBitmap);
hdc=GetDC(hwnd);
hdcMem=CreateCompatibleDC(hdc);
hBitmap=CreateCompatibleBitmap(hdc,cxTotal,cyTotal);
ReleaseDC(hwnd,hdc);
SelectObject(hdcMem,hBitmap);
Rectangle(hdcMem,-1,-1,cxTotal+1,cyTotal+1);
hBrush=CreateHatchBrush(HS_DIAGCROSS,0L);
SelectObject(hdcMem,hBrush);
SetBkColor(hdcMem,RGB(255,0,0));
Ellipse(hdcMem,cxMove,cyMove,cxTotal-cxMove,cyTotal-cyMove);
DeleteDC(hdcMem);
DeleteObject(hBrush);
return 0;
case WM_TIMER:
if(!hBitmap)
   break;
hdc=GetDC(hwnd);
hdcMem=CreateCompatibleDC(hdc);
SelectObject(hdc,hBitmap);
BitBlt(hdc,xCenter-cxTotal/2,yCenter-cyTotal/2,cxTotal,cyTotal,hdcMem,0,0,SRCCOPY);
ReleaseDC(hwnd,hdc);
DeleteDC(hdcMem);
xCenter+=cxMove;
yCenter+=cyMove;
if((xCenter+cxRadius>=cxClient)||(xCenter-cxRadius<=0))
cxMove=-cxMove;
if((yCenter+cyRadius>=cyClient)||(yCenter-cyRadius<=0))
cyMove=-cyMove;
return 0;
case WM_DESTROY:
if(hBitmap)
DeleteObject(hBitmap);
KillTimer(hwnd,1);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}

解决方案 »

  1.   

    case WM_TIMER:
    if(!hBitmap)
       break;
    hdc=GetDC(hwnd);
    hdcMem=CreateCompatibleDC(hdc);
    SelectObject(hdc,hBitmap);  //改成SelectObject(hdcMem,hBitmap);
    BitBlt(hdc,xCenter-cxTotal/2,yCenter-cyTotal/2,cxTotal,cyTotal,hdcMem,0,0,SRCCOPY);
    ReleaseDC(hwnd,hdc);
    DeleteDC(hdcMem);
      

  2.   

    //#define min(a,b) (((a)<(b))?(a):(b))
    //#define max(a,b)  (((a)>(b))?(a):(b))
    static HANDLE hBitmap;正常。你没注意点太小。
      

  3.   

    SelectObject(hdc,hBitmap);  //改成SelectObject