Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Assegnare valori RGB ad una struttura.

    Ciao a tutti,
    problemino.
    Io leggo un file ,all'interno ci sono vari parametri che vengono utilizzati per la gestione e la stampa di immagini. Praticamente devo leggere questo file , mettere i valori in strutture dati e poi mandarlo in stampa.
    Ora per apertura e lettura parametri fin quando si tratta di interi o di stringhe nessun problema.
    Il problema arriva quando devo leggere una riga del file che contiene i valori del colore di background.:
    Nel file che leggo è scritto BkColor=(255,0,0).
    Ho definito una struttura dove ho dichiarato una variabile bckground come tipo COLORRREF.
    Nel ciclo di lettura ho scritto il seguente codice:

    codice:
    esito = wcsstr(riga, L"BkColor=");
                        if (esito != NULL) 
                        {
                            lunghezza = wcslen(riga);
                            riga [lunghezza-3] = 0;
                            lettura= wcsstr(riga, L"(") + 1;
                            token = wcstok(lettura, L",");
                            rgb1 = _wtoi(token) ; /* setto le 4 variabili della struttura rettangolo*/
                            token = wcstok(NULL, L",");
                            rgb2 = _wtoi(token) ;
                            token = wcstok(NULL, L",");
                            rgb3 = _wtoi(token );
                            //FormaRect.bckground = RGB( (COLORREF) rgb1, (COLORREF)rgb2, (COLORREF)rgb3 ); /* setto la variabile colore del rettangolo*/
                            FormaRect.bckground = (COLORREF)rgb1 + (COLORREF)rgb2 + (COLORREF)rgb3 ; /* setto la variabile colore del rettangolo*/
                        }
    ma il risultato è che FormaRect.bckground vale solo 255 , io mi aspetto 255,0,0.
    Devo utilizzare 3 variabili che contengano i 3 valori?
    Grazie.
    Ultima modifica di LeleFT; 12-05-2016 a 15:06 Motivo: Sistemati i tag CODE

  2. #2
    Di che linguaggio stiamo parlando? C? C++?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Scusami , ho qualche problema con il PC, si spegne .....
    C++

  4. #4
    1. Per il parsing, fai molto prima con una wscanf;
    2. per costruire un COLORREF usa la macro RGB, come commentato nel tuo codice:
    codice:
    int r, g, b;
    if(wscanf(riga, L"BkColor = ( %d , %d , %d )", &r, &g, &b)==3) {
        FormaRect.bckground = RGB(r, g, b);
    }
    ma il risultato è che FormaRect.bckground vale solo 255 , io mi aspetto 255,0,0.
    Anche facendo le cose correttamente (con la macro RGB), ti verrà fuori un unico numero, dato che COLORREF è semplicemente un intero a 32 bit, in cui vengono "impaccati" i tre colori nei tre byte bassi. Il formato di un COLORREF è 0x00bbggrr, dove bb gg e rr sono (in esadecimale) i valori corrispondenti a blu, verde e rosso, per cui ad un RGB(10, 20, 30) corrisponde il valore 1971210. Infatti:
    R = 10 => 0x0a
    G = 20 => 0x14
    B = 30 => 0x1e
    e 1971210 == 0x1e140a
    (o anche, 1971210 == 30*65536 + 20*256 + 10)
    Ultima modifica di MItaly; 12-05-2016 a 14:53
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Ok , quando però richiamo la funzione che mi permetterà di colorare il rettangolo, avevo fatto una parte di codice :
    pennello = CreateSolidBrush(QUI PASSERò IL MIO FormaRect.bckground);
    if( FillRect(hdcPrint, &rettangolo,pennello) == 0)
    {
    nErrore = GetLastError ();
    }
    SelectObject(hdcPrint,pennello);

  6. #6
    Uhm qual è la domanda? Il COLORREF creato con la macro RGB va bene da passare alla CreateSolidBrush.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    eh oggi con il PC ho seri problemi ... .
    grazie ancora!

  8. #8
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.