Dieser Rand um die Buttons



  • Danke, so hat es funktioniert. Natürlich musste ich noch "gdi32" einfügen

    static HBRUSH hbr=NULL;
    case WM_CREATE: {
    
       HWND hButton = CreateWindow(_T("BUTTON"), _T(""),
            WS_VISIBLE|WS_CHILD|BS_FLAT|BS_PUSHBUTTON| BS_OWNERDRAW,
            20, 525, 400, 69, hwnd, (HMENU) IDC_BUTTON, NULL, NULL);
    
       hbr = CreateSolidBrush(RGB(255, 0, 255));
       }
       break;
    
    case WM_CTLCOLORBTN:
      return (LRESULT)hbr;
    

    Vielen dankt merano!!!

    Allerdings habe ich noch eine Frage. Wie bekomme ich jetzt die Bitmap ins Bild?



  • Die Bemerkung mit gdi32 verstehe ich zwar nicht, aber wenns hilft ...

    Ist Dein "Goggle" kaputt ?

    Na ja, siehe hier:

    drawing on pushbutton with bitblt
    http://forums.codeguru.com/showthread.php?407939-drawing-on-pushbutton-with-bitblt



  • Ich hab mir das alles durchgelesen und habe mich daran probiert. Auch habe ich alnge rumgegoogelt, aber ich krieg es einfach nicht auf die Reihe.
    Ich bitte nun doch nochmal ein Beispiel zu machen.
    Also es sieht so aus

    static HBRUSH hbr=NULL;
    case WM_CREATE: {
    
       HWND hButton = CreateWindow(_T("BUTTON"), _T(""),
            WS_VISIBLE|WS_CHILD|BS_FLAT|BS_PUSHBUTTON| BS_OWNERDRAW,
            20, 525, 400, 69, hwnd, (HMENU) IDC_BUTTON, NULL, NULL);
    
       hbr = CreateSolidBrush(RGB(255, 0, 255));
       }
       break;
    
    case WM_CTLCOLORBTN:
      return (LRESULT)hbr;
    

    Im Programm sieht das so aus:

    _________________
    ||
    |
    |
    ||
    |_farbige Fläche_____|
    |
    (ohne_Rand)____|
    |
    |
    |
    |
    |
    ___|

    Wäre echt nett wenn jemand mal ein Beispiel macht. Ich komme so nicht weiter.





  • Der Compiler sagt mir jetzt noch,

    In function 'LRESULT WndProc(HWND, UINT, WPARAM, LPARAM)':|
    error: 'pdis' was not declared in this scope|
    error: 'rapo1' was not declared in this scope|
    error: 'rapo2' was not declared in this scope|
    ||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    


  • Aaron3219 schrieb:

    Der Compiler sagt mir jetzt noch, ...

    In function 'LRESULT WndProc(HWND, UINT, WPARAM, LPARAM)':|
    error: 'pdis' was not declared in this scope|
    error: 'rapo1' was not declared in this scope|
    error: 'rapo2' was not declared in this scope|
    ||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    

    Ist Dir das eigentlich nicht peinlich ?

    Ja, klar nicht deklarierte Variablen mit zugegeben seltsamen Namen ...

    Üblicherweise wird etwas Eigenleistung erwartet, und zum Abschluss als Feedback eine funktionierende Lösung
    vom Fragesteller.

    Es sollte eigentlich so sein, das sich der Fragesteller soweit damit befasst, das er zum Schluss
    weiss was da passiert.

    Diese Chancen hast Du nun bisher leider alle verpasst ...

    Um hier mal zum Schluss zu kommen nun alles "am Stück".

    static HWND hButton;
    static HBITMAP hBitmap=NULL;
    static BITMAP bmpbut;
    static HBRUSH hbr=NULL;
    
    switch (message)
    {
    case WM_CREATE: {
      hBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), _T("Button4.3.bmp"),
    	                       IMAGE_BITMAP,0, 0,LR_DEFAULTCOLOR | LR_LOADFROMFILE);
    
      GetObject(hBitmap, sizeof(BITMAP), &bmpbut);
    
      hButton = CreateWindow(_T("BUTTON"), _T("Test"), WS_VISIBLE|WS_CHILD|BS_FLAT|BS_PUSHBUTTON|BS_OWNERDRAW, 
                             20, 20, bmpbut.bmWidth+2, bmpbut.bmHeight+2, hWnd, (HMENU)IDC_BUTTON1, NULL, NULL);
    
      // Bitmap auf Button plazieren (nur bei BS_BITMAP)
      // SendMessage (hButton, BM_SETIMAGE, (WPARAM) IMAGE_BITMAP,(LPARAM)(HANDLE) hBitmap);
    
      hbr = CreateSolidBrush(RGB(255, 0, 255)); 	   // Background Brush
      }
      break;
    
    case WM_DRAWITEM: {
      LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT) lParam;
      switch (pdis->CtlID){
         case IDC_BUTTON1:
              HDC hDC = GetDC(hButton); 
              HDC hComDC = CreateCompatibleDC(hDC); 
              SelectObject(hComDC, hBitmap); 
              BitBlt(hDC, 1, 1, bmpbut.bmWidth, bmpbut.bmHeight, hComDC, 0, 0, SRCCOPY); 
              DeleteObject(hComDC);
              ReleaseDC(hButton, hDC);
              break;
    
              // case XXXX: // Hier evtl. weitere Buttons
              //      break;
        }
    
        if(pdis->itemState & ODS_SELECTED) 
           InvertRect (pdis->hDC, &pdis->rcItem); // wenn Button gedrückt invertieren
      }
      break;
    
    case WM_CTLCOLORBTN:
      return (LRESULT)hbr; 
    
    ...
    

    Fehlerabfragen und das Freigeben der unter WM_CREATE angeforderten Resourcen sind nicht dabei ...



  • In dem Link, den ich angegeben habe, wird gesagt, dass man die Bitmap nicht auf den Button blitten sollte, weil dann wieder ein Rand drumherum bleibt.
    Stattdessen sollte man die Bitmap ins Parentfenster des Buttons blitten ...

    Ich habs selbst nicht ausprobiert.



  • Belli schrieb:

    Ich habs selbst nicht ausprobiert.

    Solltest Du vielleicht mal.

    Habs ausprobiert und dieses Problem nicht gesehen, aber auch nicht umfassend danach gesucht ...



  • Wenn man ohnehin GDI+ verwendet kann man die Laderoutine noch verbessern um z.B. auch jpg oder png anzeigen zu können:

    HBITMAP LoadImg(WCHAR *szFilename)
    {
       HBITMAP result=NULL;
    
       Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(szFilename,false);
       bitmap->GetHBITMAP(NULL, &result);
       delete bitmap;
       return result;
    }
    


  • Mmmh ich habe das Problem auch nicht gesehen.

    Es hat funktioniert.
    Vielen dank merano.

    LG Aaron


Anmelden zum Antworten