Farbverlauf



  • header (wingdi.h) eingebunden? benötigt aber mind. win2000, winxp.



  • Ein unresolved external deutet eigentlich eher auf eine fehlende lib oder dll hin (Msimg32.dll). Außerdem ist die WinGDI.h schon über die windows.h mit drin. Da die Parameterliste erkannt wurde nehme ich mal an das die schon dabei ist.



  • Hallo,

    ich habe mich an einem gradientfill versucht. klappt ja auch ganz gut, jedoch möchte ich nicht nur die rgb werte erhöhen, sondern einen gradient von einer farbe zur anderen bekommen, wie gehe ich da am besten vor?

    keinen plan im moment.

    hier mein bisheriges beispiel für ein ListView:

    void __fastcall TForm1::ListView1AdvancedCustomDraw(
          TCustomListView *Sender, const TRect &ARect, TCustomDrawStage Stage,
          bool &DefaultDraw)
    {
        int myRow = 0;
        int myHeight = 0 ;
        myHeight = 1;
        for (myRow = 0; myRow < 255; myRow++)
    	{
    		Sender->Canvas->Brush->Color = (TColor) RGB(myRow / 4,myRow / 2,myRow);
    		Sender->Canvas->FillRect(Rect(0,myRow * myHeight, Sender->ClientWidth,ARect.Bottom));
    	}
    }
    

    kann mir da jemand helfen?

    nachtrag:
    mir fiel gerade auf, dass wenn man die listview scrollt, die flächen, die raus und dann wieder reinrollen nicht neu gezeichnet werden, wie kann man denn das auch noch lösen?

    gruß und dank gerd



  • Farbverläufe mache ich immer so:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int Hoehe=Height;
    int Breite=Width;
    int Farbe=0;
    for(int Nr=0;Nr<Hoehe;Nr++)
    {
    
    Farbe=255*Nr/Hoehe;
    
    Canvas->Pen->Color=RGB(0,0,Farbe);
    
    Canvas->MoveTo(0,Nr);
    Canvas->LineTo(Breite,Nr);
    }
    }
    


  • Hallo,

    Damit machst du aber nur einen Farbverlauf innerhalb einer Farbe (also dunkelblau nach hellblau oder so).
    Wie ich in diesen Thread schon einmal gesagt habe eignet sich meiner Meinung nach RGB nicht unbedingt für schöne Farbverläufe. Eine Konvertierung in ein anderes Farbmodell (wie z.Bsp. HLS) ist für meine Begriffe da geeigneter. Man kann in diesen Modell leicht einen Hell nach Dunkel-Verlauf innerhalb einer Farbe machen, indem man H und L konstant läßt und nur S ändert. Wenn man andererseits L und S konstant läßt und nur H ändert, erhält man einen Farbverlauf über mehrer Farben bei gleichbleibender Helligkeit.
    Ich find das so besser.



  • Und wie konvertiert man zu HLS?
    Und wie wendet man das an?



  • Ich hatte mal eine Quelle im Web gefunden, finde sie aber gerade nicht wieder.
    Hier ist mal eine Quelle von RGB zu HLS (aber kein C++)
    http://www.aboutvb.de/khw/artikel/khwrgbhlshsv.htm
    Falls ich meine Orginalquelle noch finde stelle ich sie hier auch noch rein.
    Meine Konvertierungsroutinen kommen jetzt

    struct THLSColor
    {
        double Hue, Sat, Lum;
    } ;
    
    void TColorToHLS(const TColor Color, THLSColor &hls)
    {
        // Konvertierung
        int rgbcol = ColorToRGB(Color);
        int rcol = (rgbcol & 0xFF0000) >> 16;
        int gcol = (rgbcol & 0x00FF00) >> 8;
        int bcol = rgbcol & 0x0000FF;
        double minval = min(rcol, min(gcol, bcol));
        double maxval = max(rcol, max(gcol, bcol));
        double mdiff  = maxval - minval;
        double msum   = maxval + minval;
    
        hls.Lum = msum / 510.0;
    
        if (maxval == minval)
        {
          hls.Sat = 0.0;
          hls.Hue = 0.0;
        }
        else
        {
          double rnorm = (maxval - rcol)*1.0 / mdiff;
          double gnorm = (maxval - gcol)*1.0 / mdiff;
          double bnorm = (maxval - bcol)*1.0 / mdiff;
    
          hls.Sat = (hls.Lum <= 0.5) ? (mdiff*1.0 / msum) : (mdiff / (510.0 - msum));
    
          if (rcol   == maxval) hls.Hue = 60.0 * (6.0 + bnorm - gnorm);
          if (gcol == maxval) hls.Hue = 60.0 * (2.0 + rnorm - bnorm);
          if (bcol  == maxval) hls.Hue = 60.0 * (4.0 + gnorm - rnorm);
          if (hls.Hue >= 360.0) hls.Hue = hls.Hue - 360.0;
        }
    }
    //---------------------------------------------------------------------------
    
    int HLSToRGB1(double rm1, double rm2, double rh)
    {
      if      (rh > 360.0) rh -= 360.0;
      else if (rh <   0.0) rh += 360.0;
    
      if      (rh <  60.0) rm1 = rm1 + (rm2 - rm1) * rh / 60.0;
      else if (rh < 180.0) rm1 = rm2;
      else if (rh < 240.0) rm1 = rm1 + (rm2 - rm1) * (240.0 - rh) / 60.0;
    
      return int(rm1 * 255);
    }
    //---------------------------------------------------------------------------
    
    TColor HLSToColor(const THLSColor hls)
    {
        int cred, cgreen, cblue;
        if (hls.Sat == 0.0) // Grauton, einfacher Fall
        {
          cred = cgreen = cblue = int(hls.Lum * 255.0);
        }
        else
        {
          double rm1, rm2;
    
          if (hls.Lum <= 0.5) rm2 = hls.Lum + hls.Lum * hls.Sat;
          else                rm2 = hls.Lum + hls.Sat - hls.Lum * hls.Sat;
          rm1 = 2.0 * hls.Lum - rm2;
          cred   = HLSToRGB1(rm1, rm2, hls.Hue + 120.0);
          cgreen = HLSToRGB1(rm1, rm2, hls.Hue);
          cblue  = HLSToRGB1(rm1, rm2, hls.Hue - 120.0);
        }
       return static_cast<TColor>(RGB(cblue,cgreen,cred));
    }
    //---------------------------------------------------------------------------
    


  • hallo,

    eine meiner wichtigsten fragen war unter anderem:

    habe ich einen Farbverlauf unter onCustomDraw eingebunden, funzt es ja auch. nur scrollt man die listview jetzt, und anschließend zurück, dann habe ich als hintergrund nur noch schwarz, wie kann man das hinbekommen, das der teil der neu gezeichnet werden muss dann auch mit farbverlauf (natürlich nur den teil davon) gezeichnet wird?

    gruß gerd



  • Hallo,

    Was passiert denn wenn du das in den OnAdvancedCustomDraw Event packst statt in OnCustomDraw.



  • hallo,

    leider klappt es auch nicht wie erwünscht, er zeichnet zwar neu, doch das mehrmals.

    noch irgendwelche ideen?

    gruß gerd


Anmelden zum Antworten