home *** CD-ROM | disk | FTP | other *** search
/ Beginning C++ Through Gam…rogramming (2nd Edition) / BCGP2E.ISO / bloodshed / devcpp-4.9.9.2_setup.exe / Examples / WinAnim / Main.c < prev   
C/C++ Source or Header  |  2002-05-05  |  5KB  |  192 lines

  1. /* 
  2.    Name: WinAnim
  3.    Author: Brook Miles
  4.    Description: Making an animation in windows
  5. */
  6.  
  7. #include <windows.h>
  8.  
  9. static char g_szClassName[] = "MyWindowClass";
  10. static HINSTANCE g_hInst = NULL;
  11.  
  12. const UINT idTimer1 = 1;
  13. UINT nTimerDelay = 10;
  14.  
  15. HBITMAP hbmBall, hbmMask;
  16. BITMAP bm;
  17.  
  18. int ballX, ballY;
  19. int deltaX, deltaY;
  20.  
  21. int deltaValue = 4;
  22.  
  23. void EraseBall(HDC hdc)
  24. {
  25.    RECT rc;
  26.    rc.left = ballX;
  27.    rc.top = ballY;
  28.    rc.right = ballX + bm.bmWidth;
  29.    rc.bottom = ballY + bm.bmHeight;
  30.    FillRect(hdc, &rc, (HBRUSH)(COLOR_BTNFACE+1));
  31. }
  32.  
  33. void DrawBall(HDC hdc)
  34. {
  35.    HDC hdcMemory;
  36.    hdcMemory = CreateCompatibleDC(hdc);
  37.  
  38.    SelectObject(hdcMemory, hbmMask);
  39.    BitBlt(hdc, ballX, ballY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCAND);
  40.  
  41.    SelectObject(hdcMemory, hbmBall);
  42.    BitBlt(hdc, ballX, ballY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCPAINT);
  43.  
  44.    DeleteDC(hdcMemory);
  45. }
  46.  
  47. void UpdateBall(HWND hwnd)
  48. {
  49.    RECT rc;
  50.    GetClientRect(hwnd, &rc);
  51.  
  52.    ballX += deltaX;
  53.    ballY += deltaY;
  54.  
  55.    if(ballX < 0){
  56.       ballX = 0;
  57.       deltaX = deltaValue;
  58.    }
  59.    else if(ballX + bm.bmWidth > rc.right){
  60.       ballX = rc.right - bm.bmWidth;
  61.       deltaX = -deltaValue;
  62.    }
  63.    if(ballY < 0){
  64.       ballY = 0;
  65.       deltaY = deltaValue;
  66.    }
  67.    else if(ballY + bm.bmHeight > rc.bottom){
  68.       ballY = rc.bottom - bm.bmHeight;
  69.       deltaY = -deltaValue;
  70.    }
  71. }
  72.  
  73. LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
  74. {
  75.    switch(Message)
  76.    {
  77.       case WM_CREATE:
  78.          hbmBall = LoadBitmap(g_hInst, "BALLBMP");
  79.          hbmMask = LoadBitmap(g_hInst, "MASKBMP");
  80.          if(!hbmBall || !hbmMask){
  81.             MessageBox(hwnd, "Load of resources failed.", "Error",
  82.                MB_OK | MB_ICONEXCLAMATION);
  83.             return -1;
  84.          }
  85.  
  86.          GetObject(hbmBall, sizeof(bm), &bm);
  87.          SetTimer(hwnd, idTimer1, nTimerDelay, NULL);
  88.  
  89.          ballX = 0;
  90.          ballY = 0;
  91.          deltaX = deltaValue;
  92.          deltaY = deltaValue;
  93.  
  94.       break;
  95.       case WM_TIMER:
  96.          if(hbmBall && hbmMask)
  97.          {
  98.             HDC hdcWindow;
  99.             hdcWindow = GetDC(hwnd);
  100.  
  101.             EraseBall(hdcWindow);
  102.             UpdateBall(hwnd);
  103.             DrawBall(hdcWindow);
  104.  
  105.             ReleaseDC(hwnd, hdcWindow);
  106.          }
  107.       break;
  108.       case WM_PAINT:
  109.          if(hbmBall && hbmMask)
  110.          {
  111.             PAINTSTRUCT ps;
  112.             HDC hdcWindow;
  113.             hdcWindow = BeginPaint(hwnd, &ps);
  114.  
  115.             DrawBall(hdcWindow);
  116.             
  117.             EndPaint(hwnd, &ps);
  118.          }
  119.       break;
  120.       case WM_CLOSE:
  121.          DestroyWindow(hwnd);
  122.       break;
  123.       case WM_DESTROY:
  124.          KillTimer(hwnd, idTimer1);
  125.          
  126.          DeleteObject(hbmBall);
  127.          DeleteObject(hbmMask);
  128.          PostQuitMessage(0);
  129.       break;
  130.       default:
  131.          return DefWindowProc(hwnd, Message, wParam, lParam);
  132.    }
  133.    return 0;
  134. }
  135.  
  136.  
  137. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  138.    LPSTR lpCmdLine, int nCmdShow)
  139. {
  140.    WNDCLASSEX WndClass;
  141.    HWND hwnd;
  142.    MSG Msg;
  143.  
  144.    g_hInst = hInstance;
  145.  
  146.    WndClass.cbSize        = sizeof(WNDCLASSEX);
  147.    WndClass.style         = 0;
  148.    WndClass.lpfnWndProc   = WndProc;
  149.    WndClass.cbClsExtra    = 0;
  150.    WndClass.cbWndExtra    = 0;
  151.    WndClass.hInstance     = g_hInst;
  152.    WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  153.    WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  154.    WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
  155.    WndClass.lpszMenuName  = NULL;
  156.    WndClass.lpszClassName = g_szClassName;
  157.    WndClass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
  158.  
  159.    if(!RegisterClassEx(&WndClass))
  160.    {
  161.       MessageBox(0, "Window Registration Failed!", "Error!",
  162.          MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
  163.       return 0;
  164.    }
  165.  
  166.    hwnd = CreateWindowEx(
  167.       WS_EX_CLIENTEDGE,
  168.       g_szClassName,
  169.       "A Bitmap Program",
  170.       WS_OVERLAPPEDWINDOW,
  171.       CW_USEDEFAULT, CW_USEDEFAULT, 320, 240,
  172.       NULL, NULL, g_hInst, NULL);
  173.  
  174.    if(hwnd == NULL)
  175.    {
  176.       MessageBox(0, "Window Creation Failed!", "Error!",
  177.          MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
  178.       return 0;
  179.    }
  180.  
  181.    ShowWindow(hwnd, nCmdShow);
  182.    UpdateWindow(hwnd);
  183.  
  184.    while(GetMessage(&Msg, NULL, 0, 0))
  185.    {
  186.       TranslateMessage(&Msg);
  187.       DispatchMessage(&Msg);
  188.    }
  189.    return Msg.wParam;
  190. }
  191.  
  192.