Wie zeichne ich ein Bild in ein fremdes Fenster?



  • Hallo, ich kenn mich mit C/C++ nicht so gut aus, mache normalerweise alles in Java, deshalb brauch ich mal hilfe :).

    Ich habe nen BMP, das möchte ich in ein fremdes Fenster (andere Applikation) zeichnen. Das hwnd von dem Fenster habe ich schon...
    Ich habe schon Code gefunden, aber er zeichnet nichts.. was ist daran falsch?

    HWND hWnd = (HWND)handle; // Wird übergeben
    
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            HBITMAP hbm = (HBITMAP)LoadImage( NULL, "C:\\a.bmp" , IMAGE_BITMAP, 0,0,LR_LOADFROMFILE );
            HDC     hdcMem = CreateCompatibleDC(hdc);
            HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbm);
            BITMAP bm;
            GetObject(hbm, sizeof(bm), &bm);
            BitBlt( hdc,5,5,bm.bmWidth,bm.bmHeight,hdcMem,0,0,SRCCOPY );
            SelectObject(hdcMem, hbmOld);
            DeleteDC(hdcMem);                   
            EndPaint(hWnd, &ps);
    

    danke für die hilfe!



  • vielleicht noch wichtig:
    das ganze liegt in einer DLL die ich über Java aufrufe..



  • BeginPaint / EndPaint funktioniert nur in der "WM_PAINT" der "WinProc" der eigenen Anwendung.
    Ersetze sie mal durch GetDC / ReleaseDC :

    // HDC hdc = BeginPaint(hWnd, &ps); 
     HDC hdc = GetDC(hWnd); 
    ...
    // EndPaint(hWnd, &ps); 
     ReleaseDC (hWnd,hdc);
    


  • hey danke es funktioniert!

    kannst du mir noch sagen, wie ich das bitmap verkleinere?
    also z.B. um 50% ?



  • Schau dir dazu mal die Funktion

    BOOL StretchBlt(
      HDC hdcDest,      // handle to destination DC
      int nXOriginDest, // x-coord of destination upper-left corner
      int nYOriginDest, // y-coord of destination upper-left corner
      int nWidthDest,   // width of destination rectangle
      int nHeightDest,  // height of destination rectangle
      HDC hdcSrc,       // handle to source DC
      int nXOriginSrc,  // x-coord of source upper-left corner
      int nYOriginSrc,  // y-coord of source upper-left corner
      int nWidthSrc,    // width of source rectangle
      int nHeightSrc,   // height of source rectangle
      DWORD dwRop       // raster operation code
    );
    

    in der MSDN an



  • danke, das ist genau das was ich suche.

    Nur das verkleinerte Bild sieht nicht besonders schön aus, kann man da nich noch antialising drüberlaufen lassen oder so? 🙂



  • Wirf mal ein Blick auf die Funktion:

    int SetStretchBltMode(
      HDC hdc,           // handle to DC
      int iStretchMode   // bitmap stretching mode
    );
    

    Das sollte eventuell schon helfen.

    Über die 'normalen' GDI Funktionen gibt es meines Wissens nach kein Antialiasing (Fonts ausgenommen). Dazu müsstest du schon GDI+, OpenGl oder DirectX verwenden.



  • Eine Frame mal am Rande, wie schaff ich es denn in ein fremdes Fenster zu zeichnen, ohne dass es flimmert? 🙄



  • flimmern = Entweder Hintergrund wird gecleared (WM_ERASBKGND) und/oder die Zeichenoperationen sind zuviele bzw. dauern zu lange.

    Falls mehrere Zeichenoperationen nötig sind: Vorher in nem DC zwischenspeichern (quasi als BackBuffer benutzen) und dessen Inhalt in einem Rutsch blitten.


Anmelden zum Antworten