Unkompliziertester Weg, einen Button mittels Bitmap darzustellen



  • LPDRAWITEMSTRUCT lpdis;
    static HDC hdcMem;
    .
    .
    .
    case WM_CREATE:
        hButton = CreateWindow ("Button", "", WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 20, 20, 50, 30, hWnd1, (HMENU) ID_BUTTON, GetModuleHandle (NULL),  0);
    return 0;
    
    case WM_DRAWITEM:
        lpdis = (LPDRAWITEMSTRUCT) lParam;
        hdcMem = CreateCompatibleDC (lpdis->hDC);
    
    	if (lpdis->CtlID == ID_BUTTON)
            SelectObject (hdcMem, LoadImage (GetModuleHandle (NULL), "bitmap1.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE));
    
        StretchBlt (lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right - lpdis->rcItem.left, lpdis->rcItem.bottom - lpdis->rcItem.top, hdcMem, 0, 0, 20, 20, SRCCOPY);
        DeleteDC (hdcMem);
    return 0;
    .
    .
    .
    


  • Alles klar 🙂

    EDIT: Was ich noch vergessen hatte zu erwähnen, ist, dass ich es möglichst übersichtlich auf alle Buttons in meinem Prgramm anwenden können sollte.



  • Um mehrere Button zu "verwalten, füge einfach noch ein paar hiervon hinzu:

    if (lpdis->CtlID == ID_BUTTON)
            SelectObject (hdcMem, LoadImage (GetModuleHandle (NULL), "bitmap1.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE));
    

    einfach ID_BUTTON und "bitmap1.bmp" ersetzen.



  • Die Buttons sollten dafür aber ownderdrawn sein oder?

    EDIT: Steht ja da. Danke 🙂



  • SelectObject(hdcMem, LoadImage (hInst, (LPCSTR) IDB_BTT_ADD_N, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE));
    

    Hier bekomme ich leider eine Zugriffsverletzung....



  • Vergiß auch ned das Handle, was LoadImage zurückgibt, mit DeleteObject wieder freizugeben.



  • Hallo tenchou,

    entschuldige diese vielleicht etwas unangenehme Frage, aber wie alt bist du? Manche Leute in diesem Forum stellen die Vermutung an, dass sich dein Alter im Bereich 15-7 Jahre bewegt. Ist das wahr?



  • CodeOriginator schrieb:

    Hallo tenchou,

    entschuldige diese vielleicht etwas unangenehme Frage, aber wie alt bist du? Manche Leute in diesem Forum stellen die Vermutung an, dass sich dein Alter im Bereich 15-7 Jahre bewegt. Ist das wahr?

    Was hat das denn mit seiner Frage oder mit WinAPI zu tun??! Aber ich kann dich beruhigen, mein Alter bewegt sich nicht im Bereich 15-7 Jahre!!!



  • Verstehe gerade auch nicht was das soll, aber okay. Der Code läuft jedenfalls gut.



  • wenn du zum Beispiel das hier machst (in WM_DRAWITEM):

    if (lpdis->itemState & ODS_SELECTED)
    {
        if (lpdis->CtlID == ID_BUTTON)
            SelectObject (hdcMem, LoadImage (GetModuleHandle (NULL), "bitmap_sel.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE));
    }
    else
    {
        if (lpdis->CtlID == ID_BUTTON)
            SelectObject (hdcMem, LoadImage (GetModuleHandle (NULL), "bitmap.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE));
    }
    

    kannst du auch noch verschiedene Bilder für einen Button einstellen, wenn dieser gerade gedrückt wird. Also 2 Bilder: 1 wenn der Buton gedrückt wurde und 1 wenn irgend etwas anderes mit dem Button ist.



  • Danke für den Tip, das wäre der nächste Schritt gewesen 🙂



  • Dachte ich mir schon und deshalb habe ich das einfach mal vorausschauend gepostet 😉


Anmelden zum Antworten