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