Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Xin mọi người Hướng dẫn đoạn code này!

  1. #1
    Ngày gia nhập
    09 2008
    Bài viết
    2

    Mặc định Xin mọi người Hướng dẫn đoạn code này!

    Mình mới bắt đầu học môn VC.và thầy cho bài tập về làm chương trình đồng hồ kim dùng API,ko được dùng MFC.Và mình lên mạng kiếm được đoạn code sau nhưng ko hiểu gì lắm về đoạn code của chương trình này mong mọi người ghi chú Hay(giải thích giúp giùm)thì quá tuyệt.

    Code như sau:Nó dùng hàm lượng giác em ko hiểu .

    C++ Code:
    1. #include <windows.h>
    2. #include <math.h>
    3.  
    4. #define ID_TIMER    1
    5. #define TWOPI       (2 * 3.14159)
    6.  
    7. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    8.  
    9. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    10.                     PSTR szCmdLine, int iCmdShow)
    11. {
    12.      static TCHAR szAppName[] = TEXT ("Clock") ;
    13.      HWND         hwnd;
    14.      MSG          msg;
    15.      WNDCLASS     wndclass ;
    16.      
    17.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
    18.      wndclass.lpfnWndProc   = WndProc ;
    19.      wndclass.cbClsExtra    = 0 ;
    20.      wndclass.cbWndExtra    = 0 ;
    21.      wndclass.hInstance     = hInstance ;
    22.      wndclass.hIcon         = NULL ;
    23.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
    24.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    25.      wndclass.lpszMenuName  = NULL ;
    26.      wndclass.lpszClassName = szAppName ;
    27.      
    28.      if (!RegisterClass (&wndclass))
    29.      {
    30.           MessageBox (NULL, TEXT ("Program requires Windows NT!"),
    31.                       szAppName, MB_ICONERROR) ;
    32.           return 0 ;
    33.      }
    34.      
    35.      hwnd = CreateWindow (szAppName, TEXT ("Analog Clock"),
    36.                           WS_OVERLAPPEDWINDOW,
    37.                           CW_USEDEFAULT, CW_USEDEFAULT,
    38.                           CW_USEDEFAULT, CW_USEDEFAULT,
    39.                           NULL, NULL, hInstance, NULL) ;
    40.      
    41.      ShowWindow (hwnd, iCmdShow) ;
    42.      UpdateWindow (hwnd) ;
    43.      
    44.      while (GetMessage (&msg, NULL, 0, 0))
    45.      {
    46.           TranslateMessage (&msg) ;
    47.           DispatchMessage (&msg) ;
    48.      }
    49.      return msg.wParam ;
    50. }
    51.  
    52. void SetIsotropic (HDC hdc, int cxClient, int cyClient)
    53. {
    54.      SetMapMode (hdc, MM_ISOTROPIC) ;//dat lai che do canh truc la MM_ISOTROPIC sau khi goi SetMapMode
    55.      SetWindowExtEx (hdc, 1000, 1000, NULL) ;//toa do tam cua so la 1000
    56.      SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ;
    57.      SetViewportOrgEx (hdc, cxClient / 2,  cyClient / 2, NULL) ;
    58. }
    59.  
    60. void RotatePoint (POINT pt[], int iNum, int iAngle)//dung de ve cac cham diem hinh tron
    61. {
    62.      int   i ;
    63.      POINT ptTemp ;
    64.      
    65.      for (i = 0 ; i < iNum ; i++)
    66.      {
    67.           ptTemp.x = (int) (pt[i].x * cos (TWOPI * iAngle / 360) +
    68.                pt[i].y * sin (TWOPI * iAngle / 360)) ;
    69.          
    70.           ptTemp.y = (int) (pt[i].y * cos (TWOPI * iAngle / 360) -
    71.                pt[i].x * sin (TWOPI * iAngle / 360)) ;
    72.          
    73.           pt[i] = ptTemp ;
    74.      }
    75. }
    76.  
    77. void DrawClock (HDC hdc)
    78. {
    79.      int   iAngle ;
    80.      POINT pt[3] ;
    81.      
    82.      for (iAngle = 0 ; iAngle < 360 ; iAngle += 6)
    83.      {
    84.           pt[0].x =   0 ;
    85.           pt[0].y = 900 ;
    86.          
    87.           RotatePoint (pt, 1, iAngle) ;
    88.          
    89.           pt[2].x = pt[2].y = iAngle % 5 ? 33 : 100 ;
    90.          
    91.           pt[0].x -= pt[2].x / 2 ;
    92.           pt[0].y -= pt[2].y / 2 ;
    93.          
    94.           pt[1].x  = pt[0].x + pt[2].x ;
    95.           pt[1].y  = pt[0].y + pt[2].y ;
    96.          
    97.           SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
    98.          
    99.           Ellipse (hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y) ;
    100.      }
    101. }
    102.  
    103. void DrawHands (HDC hdc, SYSTEMTIME * pst, BOOL fChange)
    104. {
    105.      static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150,
    106.                                0, -200,  50, 0, 0, 800,  -50, 0, 0, -200,
    107.                                0,    0,   0, 0, 0,   0,    0, 0, 0,  800 } ;
    108.      int          i, iAngle[3] ;
    109.      POINT        ptTemp[3][5] ;
    110.      
    111.      iAngle[0] = (pst->wHour * 30) % 360 + pst->wMinute / 2 ;
    112.      iAngle[1] =  pst->wMinute  *  6 ;
    113.      iAngle[2] =  pst->wSecond  *  6 ;
    114.      
    115.      memcpy (ptTemp, pt, sizeof (pt)) ;
    116.      
    117.      for (i = fChange ? 0 : 2 ; i < 3 ; i++)
    118.      {
    119.           RotatePoint (ptTemp[i], 5, iAngle[i]) ;
    120.          
    121.           Polyline (hdc, ptTemp[i], 5) ;
    122.      }
    123. }
    124.  
    125. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    126. {
    127.      static int        cxClient, cyClient ;
    128.      static SYSTEMTIME stPrevious ;
    129.      BOOL              fChange ;
    130.      HDC               hdc ;
    131.      PAINTSTRUCT       ps ;
    132.      SYSTEMTIME        st ;
    133.          
    134.      switch (message)
    135.      {
    136.      case WM_CREATE :
    137.           SetTimer (hwnd, ID_TIMER, 1000, NULL) ;
    138.           GetLocalTime (&st) ;
    139.           stPrevious = st ;
    140.           return 0 ;
    141.          
    142.      case WM_SIZE :
    143.           cxClient = LOWORD (lParam) ;
    144.           cyClient = HIWORD (lParam) ;
    145.           return 0 ;
    146.          
    147.      case WM_TIMER :
    148.           GetLocalTime (&st) ;
    149.                    
    150.           fChange = st.wHour   != stPrevious.wHour ||
    151.                     st.wMinute != stPrevious.wMinute ;
    152.          
    153.           hdc = GetDC (hwnd) ;
    154.          
    155.           SetIsotropic (hdc, cxClient, cyClient) ;
    156.          
    157.           SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
    158.           DrawHands (hdc, &stPrevious, fChange) ;
    159.          
    160.           SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
    161.           DrawHands (hdc, &st, TRUE) ;
    162.          
    163.           ReleaseDC (hwnd, hdc) ;
    164.          
    165.           stPrevious = st ;
    166.           return 0 ;
    167.          
    168.      case WM_PAINT :
    169.           hdc = BeginPaint (hwnd, &ps) ;
    170.          
    171.           SetIsotropic (hdc, cxClient, cyClient) ;
    172.           DrawClock    (hdc) ;
    173.           DrawHands    (hdc, &stPrevious, TRUE) ;
    174.          
    175.           EndPaint (hwnd, &ps) ;
    176.           return 0 ;
    177.          
    178.      case WM_DESTROY :
    179.           KillTimer (hwnd, ID_TIMER) ;
    180.           PostQuitMessage (0) ;
    181.           return 0 ;
    182.      }
    183.      return DefWindowProc (hwnd, message, wParam, lParam) ;
    184. }
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 20-11-2008 lúc 07:52 PM.

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    cũng không hiểu lắm, vì mình không học Win32.
    Tuy nhiên bạn nên thử viết ( tự viết ) xem sao.
    Vì vẽ đồng hồ thì khó khăn chỗ vẽ các kim đồng hồ.

    Khi kim đồng hồ lệch 1 góc alpha. Thì bạn sẽ biết được tọa độ của đỉnh kim đồng hồ, từ đó vẽ được kim đồng hồ.

    Nếu đọc code, mà không hiểu rõ ý tưởng của người viết thì khó "đọc" ra lắm.

    Không quá khó đâu

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn không hiểu chỗ nào, phải nói rõ ra chứ. Chỗ hàm lượng giác chỉ đơn giản là phương trình đường tròn theo góc quay thôi mà :
    C Code:
    1. x = r * cos(a);
    2. y = r * sin(a);
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #4
    Ngày gia nhập
    09 2008
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Bạn không hiểu chỗ nào, phải nói rõ ra chứ. Chỗ hàm lượng giác chỉ đơn giản là phương trình đường tròn theo góc quay thôi mà :
    mình ko hieu cho nay cho lam.
    static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150,
    0, -200, 50, 0, 0, 800, -50, 0, 0, -200,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 800 } ;

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn để ý thì sẽ thấy cây kim đồng hồ là hình ngũ giác có 5 cạnh, và dĩ nhiên đồng hồ sẽ có 3 cây kim. Mảng này chỉ đơn giản là lưu tọa độ của các điểm đề vẽ nên cây kim thôi.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

Các đề tài tương tự

  1. Tại sao lại bỏ Store Proceduce nếu code theo hướng Code First trong MVC3
    Gửi bởi rogerminh2401 trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 5
    Bài viết cuối: 02-11-2012, 08:22 PM
  2. Trả lời: 5
    Bài viết cuối: 27-04-2012, 07:51 PM
  3. compiler Warning: Unreachable code và chạy sai trong khi code đúng. Vì sao?
    Gửi bởi lovemoney trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 19
    Bài viết cuối: 19-01-2012, 10:02 PM
  4. Bài tập C++ Nhập code và name sv vào in ra thì name in đúng nhưng code thì in ra cả 2 code lẫn name
    Gửi bởi spacy0212 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 27-09-2011, 08:47 AM
  5. Code quản lý sinh viên bằng danh sách lối vòng. Giúp mình thay đổi code kế thừa?
    Gửi bởi caocanha trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 6
    Bài viết cuối: 04-05-2009, 03:39 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn