/**=============================================================================
B U B B L E S O R T D E M O
v1.0.1, luglio 2016 - di Aldo Carpanelli
Un piccolo programma che presenta in forma grafica animata un'implementazione
dell'algoritmo di ordinamento chiamato "bubble sort". Nient'altro. Potrebbe
avere una qualche utilità didattica.
=============================================================================**/
#include "main.h"
#include "bubble_sort_demo.h"
#include "errori.h"
#include "offscreen.h"
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar );
BOOL InizializzaClasseFP( HINSTANCE hInst );
INT32 CreaFP( HINSTANCE hInst, HWND *hwnd );
VOID AggiornaFP( HWND hwnd );
int WINAPI WinMain(
HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int nCmdShow ) {
INT32 errore = kErrNessunErrore;
HWND hwnd = NULL;
MSG msg = {0};
if( !InizializzaClasseFP(hInst) )
{ errore = kErrClasseNonRegistrata; goto uscita; }
errore = CreaFP( hInst, &hwnd );
if ( errore != kErrNessunErrore ) goto uscita;
if( !OSW_CreaDaFinestra(hwnd,kColSfondoFP) )
{ errore = kErrOffscreenNonCreato; goto uscita; }
ShowWindow( hwnd, nCmdShow );
InizializzaSerie();
MostraInfo( hwnd );
while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
uscita:
OSW_Distruggi();
Errore( errore, hwnd );
return msg.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar ) {
switch( msg ) {
case WM_CREATE:
srand( GetTickCount() );
break;
case WM_PAINT:
AggiornaFP( hwnd );
break;
case WM_KEYDOWN:
if( wPar == VK_SPACE )
AvviaDemo( hwnd );
else if( wPar == VK_ESCAPE )
MostraInfo( hwnd );
break;
case WM_CHAR:
if( wPar == '+' )
IngrandisciSerie( hwnd );
else if( wPar == '-' )
RimpicciolisciSerie( hwnd );
else if( wPar == 'I' || wPar == 'i' )
Informazioni( hwnd );
break;
case WM_CLOSE:
PostQuitMessage( 0 );
break;
default:
return DefWindowProc( hwnd, msg, wPar, lPar );
}
return 0;
}
BOOL InizializzaClasseFP( HINSTANCE hInst ) {
WNDCLASS wc = {0};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.lpszClassName = kStrNomeClasse;
wc.hbrBackground = CreateSolidBrush( kColSfondoFP );
if( wc.hbrBackground == NULL ) wc.hbrBackground =
(HBRUSH) GetStockObject( WHITE_BRUSH );
return RegisterClass(&wc) != 0;
}
/*==============================================================================
Crea la finestra principale del programma, con dimensioni kWInizFP e kHInizFP.
La finestra viene posizionata al centro dello schermo e il suo handle collocato
in *hwnd.
==============================================================================*/
INT32 CreaFP( HINSTANCE hInst, HWND *hwnd ) {
INT ws = GetSystemMetrics( SM_CXSCREEN );
INT hs = GetSystemMetrics( SM_CYSCREEN );
RECT r = { 0, 0, kWFP, kHFP };
if( !AdjustWindowRect(&r,kStileFP,kFPHaMenu) ) return kErrFinestraNonCreata;
if( ws<r.right-r.left || hs<r.bottom-r.top ) return kErrSchermoPiccolo;
OffsetRect( &r,
-r.left+(ws-(r.right-r.left))/2,
-r.top+(hs-(r.bottom-r.top))/2 );
*hwnd = CreateWindow( kStrNomeClasse, NomeCompletoProgramma(NULL), kStileFP,
r.left, r.top, r.right-r.left, r.bottom-r.top, 0, 0, hInst, NULL );
return hwnd!=NULL ? kErrNessunErrore : kErrFinestraNonCreata;
}
/*==============================================================================
Passa sullo schermo il contenuto dell'offscreen.
==============================================================================*/
VOID AggiornaFP( HWND hwnd ) {
if( hwnd != NULL ) {
PAINTSTRUCT ps;
HDC hdc = BeginPaint( hwnd, &ps );
OSW_FlipSuHDC( hdc, &(ps.rcPaint) );
EndPaint( hwnd, &ps );
}
}