OS-sw ver.: CCBot/2.0 (https://commoncrawl.org/faq/)
Login date: 24 Mar 19 - 02:43:58
IP Address: 54.87.18.165Cursore

Registrati
Windows - Contatore da 1..99 fullscreen
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++):


#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);    
}


Visite totali62108
Questo sito web usa i cookies per gestire alcune funzionalità, quali navigazione, autenticazione, commenti, etc. Utilizzando il nostro sito web, accetti l'utilizzo dei cookies.