Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Bubble Sort Demo - main.cpp

main.cpp

Caricato da: AldoBaldo
Scarica il programma completo

  1. /**=============================================================================
  2.                        B U B B L E    S O R T    D E M O
  3.                     v1.0.1, luglio 2016 - di Aldo Carpanelli
  4.  
  5. Un piccolo programma che presenta in forma grafica animata un'implementazione
  6. dell'algoritmo di ordinamento chiamato "bubble sort". Nient'altro. Potrebbe
  7. avere una qualche utilità didattica.
  8. =============================================================================**/
  9.  
  10. #include "main.h"
  11.  
  12. #include "bubble_sort_demo.h"
  13. #include "errori.h"
  14. #include "offscreen.h"
  15.  
  16. LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar );
  17. BOOL InizializzaClasseFP( HINSTANCE hInst );
  18. INT32 CreaFP( HINSTANCE hInst, HWND *hwnd );
  19. VOID AggiornaFP( HWND hwnd );
  20.  
  21. int WINAPI WinMain(
  22.     HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int nCmdShow ) {
  23.     INT32 errore    = kErrNessunErrore;
  24.     HWND hwnd       = NULL;
  25.     MSG msg         = {0};
  26.  
  27.     if( !InizializzaClasseFP(hInst) )
  28.         { errore = kErrClasseNonRegistrata; goto uscita; }
  29.  
  30.     errore = CreaFP( hInst, &hwnd );
  31.     if ( errore != kErrNessunErrore ) goto uscita;
  32.  
  33.     if( !OSW_CreaDaFinestra(hwnd,kColSfondoFP) )
  34.         { errore = kErrOffscreenNonCreato; goto uscita; }
  35.  
  36.     ShowWindow( hwnd, nCmdShow );
  37.     InizializzaSerie();
  38.     MostraInfo( hwnd );
  39.  
  40.     while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {
  41.         TranslateMessage( &msg );
  42.         DispatchMessage( &msg );
  43.     }
  44.  
  45.     uscita:
  46.     OSW_Distruggi();
  47.     Errore( errore, hwnd );
  48.     return msg.wParam;
  49. }
  50.  
  51. LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar ) {
  52.     switch( msg ) {
  53.         case WM_CREATE:
  54.             srand( GetTickCount() );
  55.             break;
  56.  
  57.         case WM_PAINT:
  58.             AggiornaFP( hwnd );
  59.             break;
  60.  
  61.         case WM_KEYDOWN:
  62.             if( wPar == VK_SPACE )
  63.                 AvviaDemo( hwnd );
  64.             else if( wPar == VK_ESCAPE )
  65.                 MostraInfo( hwnd );
  66.             break;
  67.  
  68.         case WM_CHAR:
  69.             if( wPar == '+' )
  70.                 IngrandisciSerie( hwnd );
  71.             else if( wPar == '-' )
  72.                 RimpicciolisciSerie( hwnd );
  73.             else if( wPar == 'I' || wPar == 'i' )
  74.                 Informazioni( hwnd );
  75.             break;
  76.  
  77.         case WM_CLOSE:
  78.             PostQuitMessage( 0 );
  79.             break;
  80.  
  81.         default:
  82.             return DefWindowProc( hwnd, msg, wPar, lPar );
  83.     }
  84.  
  85.     return 0;
  86. }
  87.  
  88. BOOL InizializzaClasseFP( HINSTANCE hInst ) {
  89.     WNDCLASS wc      = {0};
  90.  
  91.     wc.lpfnWndProc   = WndProc;
  92.     wc.hInstance     = hInst;
  93.     wc.hCursor       = LoadCursor( NULL, IDC_ARROW );
  94.     wc.hIcon         = LoadIcon( NULL, IDI_APPLICATION );
  95.     wc.lpszClassName = kStrNomeClasse;
  96.  
  97.     wc.hbrBackground = CreateSolidBrush( kColSfondoFP );
  98.     if( wc.hbrBackground == NULL ) wc.hbrBackground =
  99.         (HBRUSH) GetStockObject( WHITE_BRUSH );
  100.  
  101.     return RegisterClass(&wc) != 0;
  102. }
  103.  
  104. /*==============================================================================
  105. Crea la finestra principale del programma, con dimensioni kWInizFP e kHInizFP.
  106. La finestra viene posizionata al centro dello schermo e il suo handle collocato
  107. in *hwnd.
  108. ==============================================================================*/
  109.  
  110. INT32 CreaFP( HINSTANCE hInst, HWND *hwnd ) {
  111.     INT ws = GetSystemMetrics( SM_CXSCREEN );
  112.     INT hs = GetSystemMetrics( SM_CYSCREEN );
  113.  
  114.     RECT r = { 0, 0, kWFP, kHFP };
  115.     if( !AdjustWindowRect(&r,kStileFP,kFPHaMenu) ) return kErrFinestraNonCreata;
  116.     if( ws<r.right-r.left || hs<r.bottom-r.top ) return kErrSchermoPiccolo;
  117.  
  118.     OffsetRect( &r,
  119.                 -r.left+(ws-(r.right-r.left))/2,
  120.                 -r.top+(hs-(r.bottom-r.top))/2 );
  121.  
  122.     *hwnd = CreateWindow( kStrNomeClasse, NomeCompletoProgramma(NULL), kStileFP,
  123.         r.left, r.top, r.right-r.left, r.bottom-r.top, 0, 0, hInst, NULL );
  124.  
  125.     return hwnd!=NULL ? kErrNessunErrore : kErrFinestraNonCreata;
  126. }
  127.  
  128. /*==============================================================================
  129. Passa sullo schermo il contenuto dell'offscreen.
  130. ==============================================================================*/
  131.  
  132. VOID AggiornaFP( HWND hwnd ) {
  133.     if( hwnd != NULL ) {
  134.         PAINTSTRUCT ps;
  135.         HDC hdc = BeginPaint( hwnd, &ps );
  136.         OSW_FlipSuHDC( hdc, &(ps.rcPaint) );
  137.         EndPaint( hwnd, &ps );
  138.     }
  139. }