Questo programma è un software per Microsoft Windows e non fa altro che visualizzare a tutto schermo (in base alla risoluzione rilevata) un contatore da 1 a 99 incrementabile tramite i tasti "freccia sx" "freccia dx" con possibilità di zoommare (Z X) e spostare lo stesso (A S D W).
Nel contempo caricheremo un font personalizzato.
Di seguito alcune immagini d'esempio del risultato finale:
Con la freccia -> aumento di una unità il contatore
Fino a 99, poi riparto da 1:
Devo avere la possibilità di zoommare
E spostare su giu, dx sx il contatore
Il font come si nota è caricato con il programma, per comodità l'ho piazzato sotto la stessa directory e si chiama "STENCIL.ttf". La prima schermata del programma mostra un testo introduttivo, la risoluzione rilevata e se il font è stato caricato correttamente.
Di seguito il sorgente C (io uso Dev-C++):
Di seguito alcune immagini d'esempio del risultato finale:
Con la freccia -> aumento di una unità il contatore
Fino a 99, poi riparto da 1:
Devo avere la possibilità di zoommare
E spostare su giu, dx sx il contatore
Il font come si nota è caricato con il programma, per comodità l'ho piazzato sotto la stessa directory e si chiama "STENCIL.ttf". La prima schermata del programma mostra un testo introduttivo, la risoluzione rilevata e se il font è stato caricato correttamente.
Di seguito il sorgente C (io uso Dev-C++):
#include <windows.h>
//#include <iostream>
#include <tchar.h>
#include <string>
#include <sstream> // Richiesto per lo stringstream
#include <ctime>
//using namespace std;
static HWND static_label;
static HWND static_label1;
HDC hdc;
HBRUSH NewBrush;
HINSTANCE g_hInst;
HINSTANCE hInst;
HBITMAP hBitmap = NULL;
unsigned int n = 0; // setto il contatore
int horizontal = 640; // dimensione orizzontale minima nel caso in cui non rilevo la risoluzione
int vertical = 480; // dimensione verticale minima nel caso in cui non rilevo la risoluzione
int zoom = 0; // setto lo zoom
int margine_sopra = 0; // setto il margine verticale
int margine_fianco = 0; // setto il margine orizzontale
int font_caricato = AddFontResourceEx( //carico il font stencil dalla directory nella quale eseguo l'applicazione
"STENCIL.ttf", // nome del font
FR_PRIVATE, // caratteristiche del font
NULL);
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
inline void pausa(clock_t sec) // clock_t is a like typedef unsigned int clock_t. Use clock_t instead of integer in this context
{
clock_t start_time = clock();
clock_t end_time = sec * 1000 + start_time;
while(clock() != end_time);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
LPCTSTR className = TEXT("myClass");
WNDCLASSEX wc;
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbWndExtra = 0;
wc.cbClsExtra = 0;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("myClass");
wc.hbrBackground = (HBRUSH)(CreateSolidBrush(RGB(255, 255, 0)));// sfondo finestra
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
if(!RegisterClassEx(&wc))
{
return 1;
}
RECT desktop;
const HWND hDesktop = GetDesktopWindow();
GetWindowRect(hDesktop, &desktop);
horizontal = desktop.right;
vertical = desktop.bottom;
HWND hwnd = CreateWindowEx(0, TEXT("myClass"), TEXT("NOTRPIZZA"), WS_OVERLAPPEDWINDOW, 0, 0, 0, 0 , NULL, NULL, hInstance, NULL); // creao una finestra e i suoi parametri
if(!hwnd)
{
return true;
}
SetWindowLong(hwnd, GWL_STYLE, 0); //rimuove tutti gli stili, quindi la finestra va sopra alla barra win e non crea la barra in alto
ShowWindow(hwnd, SW_SHOWMAXIMIZED); //visualizza la finestra massimizzata
UpdateWindow(hwnd); //aggiorno la finestra
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
SetBkColor((HDC)wParam, RGB(255,255,0)); //setto il colore giallo di sfondo alla label
std::stringstream stream; //stream stringa da visualizzare nella label
HFONT hFont = CreateFont( horizontal - (((horizontal/100)*10)+zoom), vertical - (((vertical/3))+zoom), 0, 0, 0, FALSE, FALSE, FALSE, //settaggio font della label
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_MODERN, "Stencil"
);
SendMessage(static_label, WM_SETFONT ,(WPARAM)hFont,0); // invio alla label i parametri del font
switch(msg)
{
case WM_PAINT:
{
}
break;
case WM_CTLCOLORSTATIC:
//SetBkColor( (HDC)wParam, RGB(255,255,0)); //setto il colore giallo di sfondo alla label
//SetBkMode ( (HDC)wParam, TRANSPARENT ); //setto il colore trasparente del testo - nb vedo la label sotto con font non trasformato
//SetTextColor((HDC)wParam, RGB(255,0,0));//setto il colore nero del testo
return (BOOL) GetStockObject(HOLLOW_BRUSH);
break;
case WM_CREATE:
{
RECT rect;
if(GetWindowRect(hwnd, &rect))
{
HFONT hFont = CreateFont( 50, 30, 0, 0, 0, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_MODERN, TEXT("Stencil"));
static_label1 = CreateWindow("Static","",WS_CHILD |SS_CENTER|WS_VISIBLE,0,0,horizontal+margine_fianco,vertical-margine_sopra,hwnd,0, g_hInst,0);
stream << "Nomi on the rock \r\n" << horizontal << "x" << vertical << "\r\n";
if (0 == font_caricato)
{
stream << "Font non caricato";
}
else {
stream << "Font caricato";
}
SendMessage(static_label1, WM_SETFONT ,(WPARAM)hFont,0);
SetWindowText(static_label1,stream.str().c_str());
}
}
break;
case WM_KEYDOWN:
DestroyWindow(static_label1);
switch (wParam)
{
case VK_LEFT: // se premo freccia a sinistra diminuisco il contatore
n = n - 1;
break;
case VK_RIGHT: // se premo freccia a destra aumento il contatore
n = n + 1;
break;
case 'R': // se premo r resetto il contatore
n = 0;
break;
case 'X': // se premo x zoommo di piu
zoom = zoom + 10;
break;
case 'Z': // se premo z zoommo di meno
zoom = zoom - 10;
break;
case 'W': //se premo w sposto in su il contatore
margine_sopra = margine_sopra + 10;
break;
case 'S': //se premo s sposto in giu il contatore
margine_sopra = margine_sopra - 10;
break;
case 'A': // se premo a sposto a sinistra il contatore
margine_fianco = margine_fianco - 20;
break;
case 'D': // se premo d sposto a destra il contatore
margine_fianco = margine_fianco + 10;
break;
case VK_ESCAPE: // se premo esc chiudo l'applicazione
DestroyWindow(hwnd);
break;
}
switch (n)
{
case 100: //se il contatore arriva a 100 lo ripristino a 99
n = 1;
break;
case 0: //se il contatore arriva a 0 lo imposto sempre a 1
n = 99;
break;
case -1: //se il contatore arriva a -1 lo imposto sempre a 1 (caso in cui alla schermata iniziale io prema freccia sx)
n = 99;
break;
}
DestroyWindow(static_label); // distruggo la label precedente
static_label = CreateWindow("Static","-",WS_CHILD |SS_CENTER|SS_CENTERIMAGE|WS_VISIBLE,0,0,horizontal+margine_fianco,vertical-margine_sopra,hwnd,0, g_hInst,0); // creo la label nuova
stream << n; // scrivo in stream il contatore aggiornato
//InvalidateRect(hwnd, NULL, TRUE);
SetWindowText(static_label,stream.str().c_str()); //scrivo nella label lo stream
break;
case WM_COMMAND:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CLOSE:
DestroyWindow(hwnd); //distruggo la finestra
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}