Button einfärben?

Robertico

Mitglied
Suche schon seit geraumer Zeit eine einfache Form um den Hintergrund eines Buttons zu färben.

Mit
Code:
m_Button_Control.SetBitmap((HBITMAP)LoadImage(NULL, "Weis.bmp", IMAGE_BITMAP, 100 , 100, LR_LOADFROMFILE | LR_CREATEDIBSECTION ));
geht das, aber da muß ich immer eine Bitmap mit einem Punkt weiß haben.


Hat jemand eine bessere Lösung? :google:
 
Ich will nur einen ganz normalen Button, der eine andere Farbe als grau hat.
Wie oben funktioniert das, mich stören nur die 16 Bitmaps im Verzeichnis.

Schön wäre irgendwas wie
Code:
m_Button_Control.SetBkColor(RGB(255,255,255))

Dat geit aber nich. :(
 
Die Funiktion gibt es aber nicht von Haus aus, daher selber machen. ist nicht wirklich wild. Gibt hier einige Links unter denen man genug Sourcen findet um das ganze zügig fertig zu kriegen...
 
Das Einfärben von Buttons ist leider mit etwas Aufwand verbunden. Du hast da schon eine recht einfache Variante gefunden. :)

Der folgende Link zeigt ein Beispiel für eine entsprechende CButton-Klasse:
http://www.codeguru.com/Cpp/controls/buttonctrl/article.php/c5169/
Es wird ein Owner-Draw-Button verwendet, bei dem dann halt alles selber gezeichnet werden muss.

Wenn du dein schon verwendetes Verfahren beibehalten willst, könntest du die nötigen Bitmaps auch programmtechnisch erzeugen und dir damit die zusätzlichen Dateien ersparen.
 
Wenn du dein schon verwendetes Verfahren beibehalten willst, könntest du die nötigen Bitmaps auch programmtechnisch erzeugen und dir damit die zusätzlichen Dateien ersparen.

Das hört sich Seeehr interressant an. Wo kann ich da etwas drüber lesen wie ich diese programmtechnisch erzeuge? Habe die Bitmaps mit dem Programm erstellt, aber das legt sie in den Pfad.

Oder ist das einfach um es hier zu erklären?

^^ Gruß Robert
 
Der nachstehende Code zeigt eine Funktion zum Erzeugen einer einfarbigen Bitmap. Als Parameter übergibst du die gewünschten Abmessungen (uiWidth, uiHeight) und die Farbe (crColor).
Den Rückgabewert speicherst du am besten in einer Member-Variablen (oder Array), da die Bitmap am Ende, also bei Beendigung des Dialoges, mit ::DeleteObject(HBITMAP) wieder zerstört werden sollte. Ansonsten gibt's GDI-Speicherlöcher.

Code:
HBITMAP CreateColoredBitmap(UINT uiWidth, UINT uiHeight, COLORREF crColor)
{
    // Bitmap erzeugen    
    
    HDC hdc = ::CreateCompatibleDC(NULL);

    BITMAPINFO bi;
    ::ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER) );

    bi.bmiHeader.biWidth        = uiWidth;
    bi.bmiHeader.biHeight       = uiHeight;
    bi.bmiHeader.biPlanes       = 1;
    bi.bmiHeader.biBitCount     = 24;
    bi.bmiHeader.biSizeImage    = 0;
    bi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
    bi.bmiHeader.biClrUsed      = 0;
    bi.bmiHeader.biClrImportant = 0;

    void *pvBits;
    
    HBITMAP hbm = ::CreateDIBSection( hdc,
                                      &bi,
                                      DIB_RGB_COLORS,
                                      &pvBits,
                                      NULL,
                                      0 );
             
    // und einfärben
                                                                   
    if( hbm )                                      
    {
        BITMAP bm;
        ::GetObject(hbm, sizeof(BITMAP), &bm);
    
        RGBTRIPLE *lpRgb = (RGBTRIPLE *)bm.bmBits;
    
        int       nX     = sizeof(RGBTRIPLE) * bm.bmWidth;
        int       nY     = sizeof(LONG);
        int       iAdd   = ((nX + (nY - 1)) / nY) * nY;
    
        for( int nRow = 0; nRow < bm.bmHeight; nRow++ )
        {
            for( int nCol = 0; nCol < bm.bmWidth; nCol++ )
            {
                lpRgb[nCol].rgbtRed   = GetRValue(crColor);
                lpRgb[nCol].rgbtGreen = GetGValue(crColor);
                lpRgb[nCol].rgbtBlue  = GetBValue(crColor);
            }
    
            lpRgb = (RGBTRIPLE *)((LPBYTE)lpRgb + iAdd);
        }
    }       

    ::DeleteDC(hdc);

    return hbm;
}
 
Zuletzt bearbeitet:
@MCoder

Ich danke Dir recht recht herzlich.
War dem ganzen zwar schon auf der Spur, aber das hätte noch lange gedauert. Funktionieren tuts. Jetzt schau ich mir die Zusammenhänge genau an.

Nochmals danke :) :suspekt: :) :suspekt: :)

Robert
 

Neue Beiträge

Zurück