Relógio Analógico em C - Pequeno trecho do código: iAngle[2] = pst->wSecond * 6;

main.html

#include <windows.h>
#include <math.h>
#define ID_TIMER 1
#define dPI (2 * 3.14159)

static HFONT font;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hPI, PSTR szCL, int iCS) {
   static TCHAR szAppName[] = TEXT("Clock");
   HWND hwnd;
   MSG msg;
   WNDCLASS wndclass;
   wndclass.style = CS_HREDRAW | CS_VREDRAW;
   wndclass.lpfnWndProc = WndProc;
   wndclass.cbClsExtra = 0;
   wndclass.cbWndExtra = 0;
   wndclass.hInstance = hI;
   wndclass.hIcon = NULL;
   wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
   wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
   wndclass.lpszMenuName = NULL;
   wndclass.lpszClassName = szAppName;
   if(!RegisterClass(&wndclass)) {
      MessageBox(NULL, TEXT("Error!"), szAppName, MB_ICONERROR);
      return 0;
   }
	
   hwnd = CreateWindow( /* ---- Janela Principal ---- */
      szAppName, TEXT("Analog Clock"), WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
      NULL, NULL, hI, NULL
   );                   /* ---- Janela Principal ---- */
	
   ShowWindow(hwnd, iCS);
   UpdateWindow(hwnd);
	
   while(GetMessage(&msg, NULL, 0, 0)) {
      TranslateMessage(&msg);
      DispatchMessage (&msg);
   }
   return msg.wParam ;
}

void SetIsotropic(HDC hdc, int cxClient, int cyClient) {
   SetMapMode(hdc, MM_ISOTROPIC);
   SetWindowExtEx(hdc, 1000, 1000, NULL);
   SetViewportExtEx(hdc, cxClient / 2, -cyClient / 2, NULL);
   SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);
}

void RotatePoint(POINT pt[], int iNum, int iAg) {
   int i;
   POINT ptTemp;
   for(i=0; i<iNum; i++) {
      ptTemp.x=(int)(pt[i].x*cos(dPI*iAg/360)+pt[i].y*sin(dPI*iAg/360));
      ptTemp.y=(int)(pt[i].y*cos(dPI*iAg/360)-pt[i].x*sin(dPI*iAg/360));
      pt[i] = ptTemp;
   }
}

void DrawClock(HDC hdc) {
   int iAngle;
   POINT pt[3];
   for(iAngle=0; iAngle<360; iAngle+=6) {
      pt[0].x = 0;
      pt[0].y = 900;
      RotatePoint(pt, 1, iAngle);
      pt[2].x = pt[2].y = iAngle % 5 ? 33 : 100;
      pt[0].x -= pt[2].x / 2;
      pt[0].y -= pt[2].y / 2;
      pt[1].x = pt[0].x + pt[2].x;
      pt[1].y = pt[0].y + pt[2].y;
      SelectObject(hdc, GetStockObject(BLACK_BRUSH));
      Ellipse(hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y);
   }
}

void DrawHands(HDC hdc, SYSTEMTIME * pst, BOOL fCh) {
   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
   };
   int i, iAngle[3];
   POINT ptTemp[3][5];
   iAngle[0] = (pst->wHour * 30) % 360 + pst->wMinute / 2;
   iAngle[1] = pst->wMinute * 6;
   iAngle[2] = pst->wSecond * 6;
   memcpy(ptTemp, pt, sizeof(pt));
   
   /* ---------------------- for ---------------------- */
   /*Se i for igual a fCh então retorne 0, se não for o caso retorne 2;*/
   /*i menor que 3; i++*/
   for(i=fCh?0:2; i<3; i++) {
      RotatePoint(ptTemp[i], 5, iAngle[i]);/*Parte trigonométrica*/
      Polyline(hdc, ptTemp[i], 5);
   }
   /* ---------------------- for ---------------------- */
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
   static int cxClient, cyClient;
   static SYSTEMTIME stPv;
   BOOL fCG;
   HDC hdc, hdc2;
   PAINTSTRUCT ps;
   SYSTEMTIME st;
   switch(msg) {
      case WM_CREATE:
         SetTimer(hwnd, ID_TIMER, 1000, NULL);
         GetLocalTime(&st);
         stPv = st;
         return 0;
      case WM_SIZE:
         cxClient = LOWORD(lp);
         cyClient = HIWORD(lp);
         return 0;
      case WM_TIMER:
         GetLocalTime(&st);
         fCG = st.wHour != stPv.wHour || st.wMinute != stPv.wMinute;
         hdc = GetDC(hwnd);
         SetIsotropic(hdc, cxClient, cyClient);
         SelectObject(hdc, GetStockObject(WHITE_PEN));
         DrawHands(hdc, &stPv, fCG);
         SelectObject(hdc, GetStockObject(BLACK_PEN));
         DrawHands(hdc, &st, TRUE);
         ReleaseDC(hwnd, hdc);
         stPv = st;
         return 0;
      case WM_PAINT:
         hdc = BeginPaint(hwnd, &ps);
         font = CreateFont(
            70, 0, 0, 0, 1,
            0, 0, 0, 0, 0,
            0, 0, 0, "Arial Black"
         );
         SelectObject(hdc, font);
         SetTextColor(hdc, RGB(255, 0, 1));
         TextOut(hdc, 10, 20, "Relógio:", strlen("Relógio:"));
         SetIsotropic(hdc, cxClient, cyClient);
         DrawClock(hdc);
         DrawHands(hdc, &stPv, TRUE);
         EndPaint(hwnd, &ps);
         return 0;
      case WM_DESTROY:
         KillTimer(hwnd, ID_TIMER);
         PostQuitMessage(0);
         return 0;
   }
   return DefWindowProc(hwnd, msg, wp, lp);
}


Comentários