Button mit Hintergrundbild ohne SendMessage



  • hi.
    ich wollte gern meinen button mit einem bitmap versehen,
    allerdings hab ich das handicap, dass es mit SendMessage(hWndButton,...)
    nicht geht.

    kennt ihr noch eine andere möglichkeit?



  • Nein. Das funktioniert aber auch ganz prima mit SendMessage. Du hast also noch was falsch gemacht. Da ich aber nicht Hellsehen kann ...



  • 🙂
    nein ich hab nix falsch gemacht.
    meine api unterstützt nur kein BS_BITMAP das ist alles.



  • Jetzt lass Dir doch nicht alles einzeln aus der Nase ziehen. Windows CE, oder was? Dann:

    Note Windows CE does not support the BS_BITMAP, BS_FLAT, BS_ICON, BS_PUSHBOX, BS_TEXT, or BS_USERBUTTON styles. Use the BS_OWNERDRAW style to create the effects that you would achieve otherwise by using the BS_BITMAP, BS_ICON, or BS_USERBUTTON button styles



  • ja ce.
    das hab ich jetzt gerade auch gefunden aber da kommt das nächste prob.
    SendMessage(hwndbut,BM_SETIMAGE,(WPARAM) IMAGE_BITMAP,(LPARAM)(HANDLE)hBitmap);

    ce kennt auch net BM_SETIMAGE.

    haste noch ne idee?



  • BS_OWNERDRAW
    Das steht da aber schon!



  • Warum haben die diese Sachen eigentlich unter CE nicht? Das ist ja wirklich dumm. 😡



  • wo eigentlich ne buttonmessage hinkommt kann ich ein buttonstyle hinsetzen?
    naja ich habs mal versucht
    SendMessage(hwndbut,BS_OWNERDRAW,(WPARAM) IMAGE_BITMAP,(LPARAM)(HANDLE)hBitmap);

    der compiler meckert zwar net mehr allerdings ist jetzt der ganze button wech.



  • BS_ ist ein Style und keine Message



  • hwndbut = CreateWindow (L"button", L"",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_OWNERDRAW ,13, 42, 100, 50, hWnd, (HMENU) but1,hInstance, NULL);

    hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
    if(hBitmap == NULL)
    {
    MessageBox(hWnd,L"Das Buttonbild konnte nicht geladen werden!",L"NACHRICHT",MB_OK);
    }

    SendMessage( hwndbut, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)(HANDLE) hBitmap );

    so hier is jetzt der quelltext.
    und meine frage ist jetzt warum will der compiler net das machen was ich will?



  • STM_SETIMAGE 😮 😮

    zeichne das bitmap selbst auf den button



  • Hallo.
    STM_SETIMAGE ist für Statics, das sind Steuerelemente, die nur Text oder Bitmaps anzeigen, für Beschriftungen. Man kann sie aber nicht anklicken!

    Dir scheint nicht klar zu sein, was BS_OWNERDRAW bedeutet. Ein Ownerdraw Button zeichnet nichts, deshalb siehst Du auch nichts. Er sendet nur eine WM_DRAWITEM Nachricht an sein Elternfenster. Das übernimmt die Darstellung des Buttons. Anders ausgedrückt: Du mußt den Button selbst zeichnen, Bild und Rahmen, wie Jim schon sagte.

    Beispiel, nicht unter Windows CE getestet:

    HBITMAP hBmp = LoadImage(hInst, MAKEINTRESOURCE(IDB_BKGND2), IMAGE_BITMAP, 16, 16, LR_LOADMAP3DCOLORS);
    
    ...
    
    void DrawButton(UINT idCtl, LPDRAWITEMSTRUCT di)
    {
        RECT rc;
    
        if ((di->itemAction & ODA_DRAWENTIRE) || (di->itemAction & ODA_SELECT)) {
            GetClientRect(di->hwndItem, &rc);
            DrawFrameControl(di->hDC, &rc, DFC_BUTTON,
                ((di->itemState & ODS_SELECTED) ? DFCS_PUSHED : 0) | DFCS_BUTTONPUSH | DFCS_ADJUSTRECT);
    
            if (di->itemState & ODS_SELECTED) {
                rc.top++; rc.left++;
            }
            DrawState(di->hDC, NULL, NULL, (DWORD)hBmp, 0L, rc.top, rc.left, 0, 0, DST_BITMAP);
        }
    }
    
    LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
        switch (msg) {
        case WM_DRAWITEM:
            DrawButton((UINT)wParam, (LPDRAWITEMSTRUCT)lParam);
            return 0;
        case WM_COMMAND:
        ...
    }
    

Anmelden zum Antworten