Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con colorazione static in Win32
Forum - C/C++ - Problema con colorazione static in Win32

Avatar
Saf (Normal User)
Newbie


Messaggi: 13
Iscritto: 13/07/2010

Segnala al moderatore
Postato alle 15:25
Giovedì, 10/03/2011
Voglio fare un programma in grado di far visualizzare un colore ogni volta che l'utente modifica uno dei tre campi che contengono l'informazione sulle coordinate RGB del colore.
Ho creato un dialogo con 3 edit control, un bottone per aprire la finestra che permette di modificare un colore (quella di paint per intenderci) e uno static che si colora ogni volta che è necessario.

Ho un problema, riesco a colorare lo static solo all'avvio, le successive modifiche mi danno "Impossibile impostare sfondo" ovvero un errore con la funzione SetBKColor(). Inoltre non si apre la finestra di modifica dei colori, come errore da "dimensione della struct CHOOSECOLOR errata".

Qualcuno ha suggerimenti??

Codice sorgente - presumibilmente C++

  1. #include <windows.h>
  2. #include <wingdi.h>
  3. #include <iostream>
  4. #include "resource.h"
  5.  
  6. COLORREF color;   //variabile del colore, inizializzata a NERO
  7. CHOOSECOLOR Ccolor;
  8. HBRUSH hb;    //pennello del colore voluto
  9. int ed[3];    //vettore coordinate colori
  10. int cont = 0; //contatore delle volte che viene ricolorato la static
  11. HWND hwaux;   //handle ausiliaria
  12. HDC hdcaux;   //handle ausiliaria
  13. DWORD var1;
  14. DWORD var2;
  15. char var3[60];
  16.  
  17. BOOL CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  18.  
  19.  
  20.  
  21. int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,
  22.                     LPSTR lpszArgument,int nFunsterStil){
  23.     HWND hwnd;
  24.     MSG messages;
  25.    
  26.     /*Disegniamo la finestra di dialogo*/
  27.     DialogBoxParam(0,"ColoreDlg",0,WindowProcedure,0);
  28.  
  29.     while (GetMessage (&messages, NULL, 0, 0)){
  30.         TranslateMessage(&messages);
  31.         DispatchMessage(&messages);
  32.     }
  33.     return messages.wParam;
  34. }
  35.  
  36.  
  37. /*  This function is called by the Windows function DispatchMessage()  */
  38. BOOL CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
  39.   switch (message)  {
  40.     case WM_CLOSE:
  41.       //distruzione del pennello
  42.       DeleteObject((HGDIOBJ)hb);
  43.       PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
  44.       break;
  45.     case WM_INITDIALOG:
  46.       SendMessage(GetDlgItem(hwnd,1101),EM_LIMITTEXT,3,0);
  47.       SendMessage(GetDlgItem(hwnd,1102),EM_LIMITTEXT,3,0);
  48.       SendMessage(GetDlgItem(hwnd,1103),EM_LIMITTEXT,3,0);
  49.       //azzera array colore all'avvio
  50.       int i;
  51.       for(i=0;i<3;i++){
  52.         ed[i] = 0;
  53.       };
  54.       //inizializzazione del colore in NERO
  55.       color = RGB(ed[0],ed[1],ed[2]);
  56.      
  57.       //############################################################
  58.       Ccolor.lStructSize = (DWORD)1000;
  59.       Ccolor.hwndOwner = hwnd;
  60.       //Ccolor.hInstance = ;
  61.       //Ccolor.rgbResult = ;
  62.       Ccolor.lpCustColors = &color;
  63.       //Ccolor.Flag = CC_ANYCOLOR||CC_FULLOPEN;
  64.       Ccolor.lCustData = (LPARAM) var1;
  65.       //Ccolor.lpfnHook = ;
  66.       Ccolor.lpTemplateName = TEXT("Modifica colori");
  67.       //############################################################
  68.  
  69.      
  70.       break;
  71.     case WM_CTLCOLORSTATIC://se il messaggio è di tipo colora static
  72.       if(GetDlgCtrlID ((HWND)lParam)==1010){
  73.         //MessageBox(0,"Devo impostare il colore.","",MB_OK);
  74.        
  75.         if(cont==0){
  76.           //immagazziniamo l'informazione dei vari handle solo all'inizio
  77.           hwaux = (HWND) lParam;
  78.           hdcaux = (HDC) wParam;
  79.         }
  80.         else{
  81.           //distruzione del pennello
  82.           if(!DeleteObject((HGDIOBJ)hb))MessageBox(0,"Impossibile eliminare il pennello.","Errore",MB_OK);
  83.         };
  84.                                                                  
  85.         //creazione del pennello nuovo
  86.         hb = CreateSolidBrush(color);
  87.         if(hb==NULL)MessageBox(0,"Impossibile creare il pennello.","Errore",MB_OK);
  88.        
  89.         if(SetBkColor(hdcaux,color)==CLR_INVALID)MessageBox(0,"Impossibile impostare sfondo.","Errore",MB_OK);
  90.      
  91.         cont++;
  92.         return (BOOL) hb;
  93.       }
  94.       break;    
  95.     case WM_COMMAND:
  96.       /*ogni volta che si modifica un EditControl il dialogo invia un messaggio
  97.         WM_COMMAND con EN_UPDATE in HIWORD*/
  98.       if(HIWORD(wParam)==EN_UPDATE){
  99.         switch (LOWORD(wParam))  {
  100.           case 1101://valore dell'edit control del Rosso modificato
  101.             ed[0]=GetDlgItemInt(hwnd,1101,0,0);//prendi il colore dall EditControl
  102.             color = RGB(ed[0],ed[1],ed[2]);//imposta il colore
  103.             SendMessage(hwnd,WM_CTLCOLORSTATIC,(WPARAM)hdcaux,(LPARAM)hwaux);
  104.             /*char check[20];
  105.             sprintf(check,"R:%d, G:%d, B:%d",ed[0],ed[1],ed[2]);
  106.             MessageBox(0,check,"mandato messaggio",MB_OK);*/
  107.             break;
  108.           case 1102://valore dell'edit control del Verde modificato
  109.             ed[1]=GetDlgItemInt(hwnd,1102,0,0);
  110.             color = RGB(ed[0],ed[1],ed[2]);
  111.             SendMessage(hwnd,WM_CTLCOLORSTATIC,(WPARAM)hdcaux,(LPARAM)hwaux);
  112.             break;
  113.           case 1103://valore dell'edit control del Blu modificato
  114.             ed[2]=GetDlgItemInt(hwnd,1103,0,0);
  115.             color = RGB(ed[0],ed[1],ed[2]);
  116.             SendMessage(hwnd,WM_CTLCOLORSTATIC,(WPARAM)hdcaux,(LPARAM)hwaux);
  117.             break;  
  118.         }  
  119.       }  
  120.       else if(HIWORD(wParam)==BN_CLICKED&&LOWORD(wParam)==1000){//BOTTONE1
  121.         if(!ChooseColor(&Ccolor)) {
  122.         var2 = CommDlgExtendedError();
  123.         sprintf(var3,"Errore: %d", var2);
  124.         MessageBox(0,var3,"Errore",MB_OK);
  125.  
  126.         switch (var2){
  127.           case CDERR_DIALOGFAILURE:
  128.             MessageBox(0,"1","Err",MB_OK);
  129.             break;
  130.           case CDERR_INITIALIZATION:
  131.             MessageBox(0,"2","Err",MB_OK);
  132.             break;
  133.           case CDERR_STRUCTSIZE:
  134.             MessageBox(0,"3 Struct Size","Err",MB_OK);
  135.             break;
  136.           case CDERR_REGISTERMSGFAIL:
  137.             MessageBox(0,"4","Err",MB_OK);
  138.             break;
  139.           case CDERR_NOTEMPLATE:
  140.             MessageBox(0,"5","Err",MB_OK);
  141.             break;
  142.           case CDERR_NOHOOK:
  143.             MessageBox(0,"6","Err",MB_OK);
  144.             break;
  145.           }
  146.         }
  147.       }
  148.       else if(HIWORD(wParam)==BN_CLICKED&&LOWORD(wParam)==1001){//BOTTONE2
  149.        
  150.       }
  151.       break;
  152.   }
  153.   return 0;
  154. }


Ultima modifica effettuata da Saf il 10/03/2011 alle 15:29
PM Quote
Avatar
Saf (Normal User)
Newbie


Messaggi: 13
Iscritto: 13/07/2010

Segnala al moderatore
Postato alle 19:21
Giovedì, 24/03/2011
UP!!

PM Quote