bitmap als button



  • guten abend alle,

    ich habe ein kleines problem, und ich komme nicht weiter.... (die suchfunktion funktioniert bei mir nicht 😞

    ich will gerne statt normalen button z.b. ein auto nehmen.
    das auto ist als bitmap abgespeicher.

    mein problem.... ich habe no ahnung wie es geht :|

    das bsp. aus fqs hilft mir nicht weiter weil dar wird normaler button grafisch dargestellt und nicht eins aus bitmap geladen.

    big thx für eure antworten im vorraus.



  • BS_BITMAP, BM_SETIMAGE



  • genau darum gings mir nicht....

    ich will kein bild auf button zeichnen, sonder ganz neue button-form erstellen.





  • eine idee schrieb:

    http://www.flipcode.com/articles/article_win32skins.shtml

    mein freund, ich glaube das regions nicht das richtige ist was ich suche...

    Petzold hat so was änliches auf s. 360 gecodet, aber halt ohne bitmaps sondern selbst gezeichnet die buttons.

    und ich will die buttons-form selbst bestimmen und einen bitmap drauf legen.



  • BS_OWNERDRAW



  • ownerdraw schrieb:

    BS_OWNERDRAW

    so weit bin ich auch bereits 🙂

    aber wie gehts weiter?

    plz um links auf gute seiten

    thx



  • Also wenn du kein rechteckiges Fenster haben möchtest brauchst du Regions!



  • @keine idee: wo genau liegt denn dein problem? hab grad kein link zu nem kompletten tutorial, aber an sich sollte es auch nicht so schwer sein.
    du verpasst deinem button den stil BS_OWNERDRAW, und sobald du in der callback die nachricht WM_DRAWITEM bekommst, malst du deinen button.

    die msdn ist die beste hilfe die du kriegen kannst.
    gehts dir überhaupt darum, dass die buttons eine andere form als ein rechteck annehmen sollen?



  • so kann das aussehen:

    #define ID_UNSER_BUTTON 1
    
    BOOL ButtonZeichnen (LPDRAWITEMSTRUCT, HBITMAP, HBITMAP, HBITMAP, int, int, int, int) ;
    
    //in der WndProc
    LPDRAWITEMSTRUCT lpItem ;
    HINSTANCE	    hInstance ;
    HBITMAP          hBitmapButtonAus,
                     hBitmapButtonAn,
                     hBitmapButtonFokus ;
    
    case WM_CREATE :
        hInstance = ((LPCREATESTRUCT) lParam) -> hInstance ;
        CreateWindowEx (NULL, "button", 
    		         "", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 
    		         10, 10, 
    		     	80, 25, 
    			     hwnd, (HMENU) ID_UNSER_BUTTON, hInstance, NULL) ;
        // Die Bitmaps aus den Resourcen laden
        hBitmapButtonAus = LoadBitmap (hInstance, MAKEINTRESOURCE(IDB_BITMAP1)) ;
        hBitmapButtonAn = LoadBitmap (hInstance, MAKEINTRESOURCE(IDB_BITMAP2)) ;
        hBitmapButtonFokus = LoadBitmap (hInstance, MAKEINTRESOURCE(IDB_BITMAP3)) ;
    return 0 ;
    
    case WM_DRAWITEM :
    	lpItem = (LPDRAWITEMSTRUCT) lParam ;
    	switch (lpItem->CtlID){
    		case ID_UNSER_BUTTON :
    			ButtonZeichnen (lpItem, hBitmapButtonAus, hBitmapButtonAn, hBitmapButtonFokus, 0, 0, 0, 0) ;
    			break ;
    return 0 ;
    
    case WM_DESTROY :
        DeleteObject (hBitmapButtonAus) ;
        DeleteObject (hBitmapButtonAn) ;
        DeleteObject (hBitmapButtonFokus) ;
        PostQuitMessage (0) ;
    return 0 ;
    // Ende WinProc
    
    /* Unsere Funktion die Buttons zeichnen
    lpItemS - muss übergeben werden
    hBitmapAus - Bitmap wenn Button aus ist, muss übergeben werden
    hBitmapAn - Bitmap wenn Button gedrückt ist, kann NULL sein, wird dann aber hBitmapAus verwendet
    hBitmapFokus - Bitmap wenn Button den Fokus hat, kann NULL sein, wird dann aber hBitmapAus verwendet
    xPos - x-Koordinaten, Statndartwert 0
    yPos - y-Koordinaten, Statndartwert 0
    iBreite - Breite des Controls, kann 0 sein, wird dann aus dem lpItemS ausgelesen
    iHoche - Hoche des Controls, kann 0 sein, wird dann aus dem lpItemS ausgelesen
    */
    BOOL ButtonZeichnen (LPDRAWITEMSTRUCT lpItemS, HBITMAP hBitmapAus, HBITMAP hBitmapAn, HBITMAP hBitmapFokus, int xPos, int yPos, int iBreite, int iHoche){
    	HBRUSH    hbr,
    			  hbrPrevious ;
    	switch (lpItemS->itemAction){
    		case ODA_DRAWENTIRE:
    			if (!hBitmapAus){
    				return FALSE ;
    			}
    			hbr = CreatePatternBrush (hBitmapAus) ;
    			break ;
    		case ODA_FOCUS :
    			if (hBitmapFokus){
    				hbr = CreatePatternBrush (hBitmapFokus) ;
    			}
    			else{
    				hbr = CreatePatternBrush (hBitmapAus) ;
    			}
    			break ;
    		case ODA_SELECT:
    			if (lpItemS->itemState & ODS_SELECTED){
    				if (hBitmapAn){
    					hbr = CreatePatternBrush (hBitmapAn) ;
    				}
    				else{
    					hbr = CreatePatternBrush (hBitmapAus) ;
    				}
    			}
    			else{
    				hbr = CreatePatternBrush (hBitmapAus) ;
    			}
    			break ;
    	}
    	if ((hBitmapAus) || (hBitmapAn) || (hBitmapFokus)){
    		if (iBreite == 0){
    			iBreite = lpItemS->rcItem.right ;
    		}
    		if (iHoche == 0){
    			iHoche = lpItemS->rcItem.bottom ;
    		}
    		hbrPrevious = (HBRUSH) SelectObject (lpItemS->hDC, hbr) ;
    		PatBlt (lpItemS->hDC, xPos, yPos, iBreite, iHoche, PATCOPY) ;
    		SelectObject (lpItemS->hDC, hbrPrevious) ;
    		DeleteObject (hbr) ;
    		return TRUE ;
    	}
    	return FALSE ;
    }
    

    ich glaube das ist alles...
    kann in die FAQs


Anmelden zum Antworten