RAPORT
Lucrarea de laborator nr.6
Programarea in Windows
A efectuat:
A verificat:
lect., univ. Lisnic Inga
Chisinau 2017
Notiuni teoretice
Ceasul sistemului Windows este un dispozitiv de intrare, care comunică (periodic) unei aplicații intervalul
de timp scurs; ulterior, mediul de operare trimite programului mesaje WM_TIMER, pentru a semnala
intervalele de timp scurse. În continuare vom reda câteva din întrebuințările ceasului.În primul rînd, ceasul
se utilizează pentru evidența timpului. Programele CLOCK și CONTROL PANEL afișează timpul curent;
timer-ul indică aplicațiilor momentul de timp cînd trebuie să acutalizeze ceasul.Ceasul de sistem se
utilizează pentru păstrarea unui raport referitor la starea resurselor sistemului Windows; funcționează pe
post de alarmă (programul CALENDAR poate utiliza timer-ul pentru a declanșa o alarmă
prestabilită).Asigură facilitatea multitasking – Windows este un sistem ce posedă caracteristica
nonpriemptive multitasking; în acest context, este important faptul că programele înapoiază controlul
mediului cît de curînd posibil. Dacă un program trebuie să facă multe prelucrări, el poate împărți aceste
proceduri în unități mai mici și le poate prelucra pe fiecare la primirea mesajlui WM_TIMER.De
asemenea, ceasul de sistem implementează caracteristica de autosalvare – indică unei aplicații Windows
să salveze fișierele unui utilizator pe discm după ce a trecut un interval de timp. Asigură terminarea
versiunilor demo ale diverselor programe.
2. Este posibila activarea simultana a citeva ceasuri? Daca da atunci cite pot fi activate simultan
in sistemul Windows?
Primele versiuni de Windows aveau un numar limitat de ceasuri pe care puteai sa le pornesti la
momentul actual numarul de ceasuri pe care le poate porni sistemul de operare si programele practic
este infinit
1
Ceasul sistemului Windows, reprezinta o extensie simpla a logicii aferente timerului, incorporata in
hard-ul
PC-ului si in ROM BIOS. Aceasta din urma initializeaza un ceas Intel pentru a genera intrerupere 08h,
care mai este denumita “clock tick timer tick”. O astfel de intrerupere se produce la fiecare 54 925ms,
ceea ce constituie aproximativ 18.2 ori pe secunda.
Listingul programului
#include <windows.h>
#include "class.h"
#include <time.h>
#include <math.h>
#define ID_TIMER 1
#define TWOPI (2 * 3.14159)
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,
int iCmdShow) {
HWND hWnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(wndclass);
wndclass.style = NULL;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = NULL;
wndclass.cbWndExtra = NULL;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, NULL);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = NULL;//(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "Time";
wndclass.hIconSm = LoadIcon(NULL, NULL);
RegisterClassEx(&wndclass);
hWnd = CreateWindow("Time", "Time",
WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU,
CW_USEDEFAULT,
2
CW_USEDEFAULT,
345,
395,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, SW_SHOW);
nTime.LoadBmp();
nTime.Init();
SetTimer(hWnd,1,0,NULL);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
KillTimer(hWnd,1);
return 0;
}
void SetIsotropic (HDC hdc, int cxClient, int cyClient){
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 1000, 1000, NULL) ;
SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2.4, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2.4, NULL) ;
}
3
TextOut(hdc, -470, 790, "11", 2);
TextOut(hdc, -50, 910, "12", 2);
}
}
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
HDC hDcMem;
HANDLE hOld;
PAINTSTRUCT ps;
HBITMAP hBmp[11];
static int cxClient, cyClient ;
static struct tm dtPrevious ;
BOOL bChange ;
HDC hdc ;
time_t lTime ;
struct tm *datetime ;
switch (msg) {
case WM_CREATE :
time (&lTime) ;
datetime = localtime (&lTime) ;
dtPrevious = * datetime ;
return 0 ;
case WM_SIZE :
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
case WM_DESTROY:
KillTimer (hwnd, ID_TIMER) ;
PostQuitMessage(0);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
nTime.LearnTime();
hDcMem = CreateCompatibleDC(hdc);
for (int i = 0; i < 8; i++) {
if(nTime.NumbTime[i] == 10) nTime.right -= 30;
hOld = SelectObject(hDcMem, nTime.hBmp[nTime.NumbTime[i]]);
BitBlt(hdc, nTime.left, nTime.top, nTime.right, nTime.bottom,
hDcMem, 0, 0, SRCCOPY);
4
SelectObject(hDcMem, hOld);
nTime.Invn();
}
SetIsotropic (hdc, cxClient, cyClient) ;
DrawClock (hdc) ;
DrawHands (hdc, &dtPrevious, TRUE) ;
DeleteObject(hDcMem);
EndPaint(hwnd, &ps);
break;
case WM_TIMER:
InvalidateRect(hwnd,NULL,TRUE);
time (&lTime) ;
datetime = localtime (&lTime) ;
bChange = datetime->tm_hour != dtPrevious.tm_hour || datetime-
>tm_min != dtPrevious.tm_min ;
hdc = GetDC (hwnd) ;
SetIsotropic (hdc, cxClient, cyClient) ;
SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
DrawHands (hdc, &dtPrevious, bChange) ;
SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
DrawHands (hdc, datetime, TRUE) ;
ReleaseDC (hwnd, hdc) ;
dtPrevious = *datetime ;
return 0 ;
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
Rezultatele obtinute
Concluzii
5
În urma executării acestei lucrări de laborator am studiat metodele și principiile de lucru cu
timerul. Pentru a realiza sarcina propusă am creat un program ce preia datele legate de timp de la
sistemul operațional și generează un desen ce reprezintă un ceas analog și digital.