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
Estrazione - pulsante.cpp

pulsante.cpp

Caricato da: AldoBaldo
Scarica il programma completo

  1. /// === PULSANTE 1.0 (31/01/2014) ==============================================
  2.  
  3. #include "pulsante.h"
  4.  
  5.  
  6. static const char kPULSANTEErrMemoriaInsufficiente[] =
  7.     "classe PULSANTE, memoria insufficiente";
  8.  
  9. static const ARGB kColoriSfondoDflt[] =
  10.     { 0xFF000000, 0xFFFF9900, 0xFF333333, 0xFF000000, 0xFF006600 };
  11.  
  12. static const ARGB kColoriTrattoDflt[] =
  13.     { 0xFF666666, 0xFF000000, 0xFFFF9900, 0xFF33CC00, 0xFF000000 };
  14.  
  15.  
  16. PULSANTE::PULSANTE() {
  17.     os      = NULL;
  18.     t       = NULL;
  19.     dimFont = 0.0f;
  20.     wBordo  = 1;
  21.  
  22.     allinOrizz = 0;
  23.     allinVert  = 0;
  24.  
  25.     set_colori_sfondo( kColoriSfondoDflt[0], kColoriSfondoDflt[1],
  26.                        kColoriSfondoDflt[2], kColoriSfondoDflt[3],
  27.                        kColoriSfondoDflt[4], FALSE );
  28.  
  29.     set_colori_tratto( kColoriTrattoDflt[0], kColoriTrattoDflt[1],
  30.                        kColoriTrattoDflt[2], kColoriTrattoDflt[3],
  31.                        kColoriTrattoDflt[4], FALSE );
  32.  
  33.     stato = kPULSANTENormale;
  34.     staGiu = 0;
  35.  
  36.     set_rettangolo( 0, 0, 0, 0 );
  37.     set_titolo( NULL,FALSE );
  38. }
  39.  
  40.  
  41. PULSANTE::PULSANTE( int x, int y, int w, int h, const char *titolo ) {
  42.     os      = NULL;
  43.     t       = NULL;
  44.     dimFont = h/1.5f>0 ? w/15 : 1;
  45.     wBordo  = 1;
  46.  
  47.     allinOrizz = 0;
  48.     allinVert  = 0;
  49.  
  50.     set_colori_sfondo( kColoriSfondoDflt[0], kColoriSfondoDflt[1],
  51.                        kColoriSfondoDflt[2], kColoriSfondoDflt[3],
  52.                        kColoriSfondoDflt[4], FALSE );
  53.  
  54.     set_colori_tratto( kColoriTrattoDflt[0], kColoriTrattoDflt[1],
  55.                        kColoriTrattoDflt[2], kColoriTrattoDflt[3],
  56.                        kColoriTrattoDflt[4], FALSE );
  57.  
  58.     stato = kPULSANTENormale;
  59.     staGiu = 0;
  60.  
  61.     set_rettangolo( x, y, w, h );
  62.     set_titolo( titolo,FALSE );
  63. }
  64.  
  65.  
  66. PULSANTE::~PULSANTE() {
  67.     delete[] t;
  68. }
  69.  
  70.  
  71. void PULSANTE::attiva( BOOL att, BOOL agg ) {
  72.     if( stato == kPULSANTEDisattivo && att ) {
  73.         stato = kPULSANTENormale;
  74.         if( agg ) traccia();
  75.     }
  76.     else if( stato != kPULSANTEDisattivo && !att ) {
  77.         stato = kPULSANTEDisattivo;
  78.         if( agg ) traccia();
  79.     }
  80. }
  81.  
  82.  
  83. void PULSANTE::seleziona( BOOL sel, BOOL agg ) {
  84.     if( stato != kPULSANTEDisattivo ) {
  85.         if( sel && staGiu )
  86.             stato = kPULSANTESelezionato;
  87.         else stato = kPULSANTENormale;
  88.  
  89.         if( agg ) traccia();
  90.     }
  91. }
  92.  
  93.  
  94. void PULSANTE::set_rettangolo( int x, int y, int w, int h ) {
  95.     r.left = x;     r.right  = x+w;
  96.     r.top  = y;     r.bottom = y+h;
  97. }
  98.  
  99.  
  100. void PULSANTE::set_titolo( const char *titolo, BOOL agg ) {
  101.     try {
  102.         int i, lun = lstrlen(titolo);
  103.         WCHAR *temp = new WCHAR[lun+1];
  104.  
  105.         if( titolo == NULL ) titolo = "";
  106.  
  107.         for( i=0; i<lun; i++ )
  108.             temp[i] = (unsigned char)titolo[i];
  109.         temp[i] = 0;
  110.  
  111.         delete[] t;
  112.         t = temp;
  113.  
  114.          if( agg ) traccia();
  115.     } catch( ... ) {
  116.         throw kPULSANTEErrMemoriaInsufficiente;
  117.     }
  118. }
  119.  
  120.  
  121. void PULSANTE::set_dimensione_font( REAL dim, BOOL agg ) {
  122.     dimFont = dim>=0.0f ? dim : -dim;
  123.     if( agg ) traccia();
  124. }
  125.  
  126.  
  127. void PULSANTE::set_allineamento_orizzontale( int allineamento, BOOL agg ) {
  128.     if( allineamento < 0 )
  129.         allinOrizz = -1;
  130.     else if( allineamento > 0 )
  131.         allinOrizz = 1;
  132.     else allinOrizz = 0;
  133.     if( agg ) traccia();
  134. }
  135.  
  136.  
  137. void PULSANTE::set_allineamento_verticale( int allineamento, BOOL agg ) {
  138.     if( allineamento < 0 )
  139.         allinVert = -1;
  140.     else if( allineamento > 0 )
  141.         allinVert = 1;
  142.     else allinVert = 0;
  143.     if( agg ) traccia();
  144. }
  145.  
  146.  
  147. void PULSANTE::set_spessore_bordo( unsigned int spBordo, BOOL agg ) {
  148.     wBordo = spBordo;
  149.     if( agg ) traccia();
  150. }
  151.  
  152.  
  153. void PULSANTE::set_colori_sfondo( ARGB cDisattivo, ARGB cPremuto,
  154.     ARGB cSopra, ARGB cNormale, ARGB cSelezionato, BOOL agg ) {
  155.     sfondo[0] = cDisattivo;
  156.     sfondo[1] = cSelezionato;
  157.     sfondo[2] = cPremuto;
  158.     sfondo[3] = cSopra;
  159.     sfondo[4] = cNormale;
  160.     if( agg ) traccia();
  161. }
  162.  
  163.  
  164. void PULSANTE::set_colori_tratto( ARGB cDisattivo, ARGB cPremuto,
  165.     ARGB cSopra, ARGB cNormale, ARGB cSelezionato, BOOL agg ) {
  166.     tratto[0] = cDisattivo;
  167.     tratto[1] = cSelezionato;
  168.     tratto[2] = cPremuto;
  169.     tratto[3] = cSopra;
  170.     tratto[4] = cNormale;
  171.     if( agg ) traccia();
  172. }
  173.  
  174.  
  175. void PULSANTE::set_offscreen( OFFSCREEN *offscreen ) {
  176.     os = offscreen;
  177. }
  178.  
  179.  
  180. RECT *PULSANTE::get_rettangolo( RECT *rct ) {
  181.     if( rct == NULL ) return rct;
  182.  
  183.     CopyRect( rct, &r );
  184.  
  185.     return rct;
  186. }
  187.  
  188.  
  189. Rect *PULSANTE::get_rettangolo( Rect *rct ) {
  190.     if( rct == NULL ) return rct;
  191.  
  192.     rct->X      = r.left;
  193.     rct->Y      = r.top;
  194.     rct->Width  = r.right- r.left;
  195.     rct->Height = r.bottom - r.top;
  196.  
  197.     return rct;
  198. }
  199.  
  200.  
  201. RectF *PULSANTE::get_rettangolo( RectF *rct ) {
  202.     if( rct == NULL ) return rct;
  203.  
  204.     rct->X      = r.left;
  205.     rct->Y      = r.top;
  206.     rct->Width  = r.right- r.left;
  207.     rct->Height = r.bottom - r.top;
  208.  
  209.     return rct;
  210. }
  211.  
  212.  
  213. BOOL PULSANTE::in( LONG x, LONG y ) {
  214.     POINT pt = { x, y };
  215.     return PtInRect( &r, pt );
  216. }
  217.  
  218.  
  219. BOOL PULSANTE::sopra( LONG x, LONG y ) {
  220.     if( stato > kPULSANTEPremuto ) {
  221.         short exStato = stato;
  222.         BOOL dentro = in( x, y );
  223.  
  224.         if( dentro )
  225.             stato = kPULSANTESopra;
  226.         else stato = kPULSANTENormale;
  227.  
  228.         if( stato != exStato ) traccia();
  229.  
  230.         return dentro;
  231.     }
  232.  
  233.     return FALSE;
  234. }
  235.  
  236.  
  237. BOOL PULSANTE::click( LONG x, LONG y ) {
  238.     if( stato == kPULSANTESelezionato || stato > kPULSANTEPremuto ) {
  239.         if( in(x,y) ) return SeguiMouse( x, y );
  240.     }
  241.  
  242.     return FALSE;
  243. }
  244.  
  245.  
  246. void PULSANTE::simula_click( void ) {
  247.     if( os == NULL ) return;
  248.  
  249.     if( stato == kPULSANTESelezionato || stato > kPULSANTEPremuto ) {
  250.         short exStato = stato;
  251.         stato = kPULSANTEPremuto;
  252.  
  253.         traccia();
  254.  
  255.         Sleep( 150 );
  256.  
  257.         if( !staGiu ) {
  258.             stato = exStato;
  259.         }
  260.         else {
  261.             if( exStato == kPULSANTESelezionato )
  262.                 stato = kPULSANTENormale;
  263.             else stato = kPULSANTESelezionato;
  264.         }
  265.  
  266.         traccia();
  267.     }
  268. }
  269.  
  270.  
  271. void PULSANTE::traccia( BOOL agg ) {
  272.     if( os == NULL ) return;
  273.  
  274.     RectF rf( r.left, r.top, r.right-r.left, r.bottom-r.top );
  275.  
  276.     Graphics gfx( os->get_dc() );
  277.  
  278.     SolidBrush pennello( Colore(0) );
  279.     gfx.FillRectangle( &pennello, rf );
  280.  
  281.     if( wBordo > 0 ) {
  282.         Pen penna( Colore(1), wBordo );
  283.         penna.SetAlignment( PenAlignmentInset );
  284.         gfx.DrawRectangle( &penna, rf );
  285.     }
  286.  
  287.     pennello.SetColor( Colore(1) );
  288.     TracciaTitolo( &gfx, &pennello, &rf );
  289.  
  290.     if( agg ) aggiorna();
  291. }
  292.  
  293.  
  294. void PULSANTE::aggiorna( void ) {
  295.     if( os != NULL ) {
  296.         os->invalida( &r );
  297.         os->aggiorna();
  298.     }
  299. }
  300.  
  301.  
  302. void PULSANTE::TracciaTitolo( Graphics *gfx, SolidBrush *pennello, RectF *rf ) {
  303.     FontFamily      fontFamily( L"Arial" );
  304.     Font            font( &fontFamily, dimFont, FontStyleBold, UnitPixel);
  305.     StringFormat    sf;
  306.  
  307.     if( allinOrizz < 0 )
  308.         sf.SetAlignment( StringAlignmentNear );
  309.     else if( allinOrizz > 0 )
  310.         sf.SetAlignment( StringAlignmentFar );
  311.     else sf.SetAlignment( StringAlignmentCenter );
  312.  
  313.     if( allinVert < 0 )
  314.         sf.SetLineAlignment( StringAlignmentNear );
  315.     else if( allinVert > 0 )
  316.         sf.SetLineAlignment( StringAlignmentFar );
  317.     else sf.SetLineAlignment( StringAlignmentCenter );
  318.  
  319.     gfx->SetTextRenderingHint( TextRenderingHintAntiAlias );
  320.     gfx->DrawString( t, -1, &font, *rf, &sf, pennello );
  321. }
  322.  
  323.  
  324. BOOL PULSANTE::SeguiMouse( LONG x, LONG y ) {
  325.     if( os == NULL ) return FALSE;
  326.     HWND hwnd = os->get_finestra();
  327.     int continua = 1;
  328.     MSG msg;
  329.  
  330.     ZeroMemory( &msg, sizeof(MSG) );
  331.  
  332.     short exStato = stato;
  333.     stato = kPULSANTEPremuto;
  334.     traccia();
  335.  
  336.     SetCapture( hwnd );
  337.  
  338.     do{
  339.         if( PeekMessage(&msg,hwnd,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE) ) {
  340.             switch( msg.message ) {
  341.                 case WM_LBUTTONUP:
  342.                     ScreenToClient( hwnd, &msg.pt );
  343.                     if( PtInRect(&r,msg.pt) ) {
  344.                         if( !staGiu ) {
  345.                             stato = exStato;
  346.                         }
  347.                         else {
  348.                             if( exStato == kPULSANTESelezionato )
  349.                                 stato = kPULSANTENormale;
  350.                             else stato = kPULSANTESelezionato;
  351.                         }
  352.                     }
  353.                     else {
  354.                         stato = exStato;
  355.                     }
  356.                     continua = 0;
  357.                     break;
  358.  
  359.                 case WM_MOUSEMOVE:
  360.                     ScreenToClient( hwnd, &msg.pt );
  361.                     if( PtInRect(&r,msg.pt) )
  362.                         stato = kPULSANTEPremuto;
  363.                     else stato = exStato;
  364.                     break;
  365.  
  366.                 default: break;
  367.             }
  368.  
  369.             traccia();
  370.         }
  371.     } while( continua );
  372.  
  373.     ReleaseCapture();
  374.  
  375.     return PtInRect( &r, msg.pt );
  376. }
  377.  
  378.  
  379. ARGB PULSANTE::Colore( short tipo ) {
  380.     ARGB *c;
  381.  
  382.     if( tipo == 0 ) c = sfondo; else c = tratto;
  383.  
  384.     return c[stato+1];
  385. }