BitBlt kopiert lediglich schwarz auf den Ziel-DC

  • C#
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ichduersie.

    BitBlt kopiert lediglich schwarz auf den Ziel-DC

    Guten Nachmittag.

    Ich habe derzeit ein Problem mit der Funktion BitBlt(). Ich habe sie wie auf pinvoke.net beschrieben implementiert. Ich habe den Code trotzdem noch einmal angehängt. Zusätzlich habe ich auch noch die GetDC-Funktion drin, damit ich an den DC der Form komme. Nun rufe ich die Funktion wie folgt auf:

    C#-Quellcode

    1. Bitmap bmp = new Bitmap("test.jpg");
    2. Graphics g = Graphics.FromImage(bmp);
    3. BitBlt(GetDC(Handle), 0, 0, bmp.Width, bmp.Height, g.GetHdc(), 0, 0, TernaryRasterOperations.SRCCOPY);


    BitBlt + TernaryRasterOperations & GetDC

    C#-Quellcode

    1. [DllImport("gdi32.dll", EntryPoint = "BitBlt", SetLastError = true)]
    2. [return: MarshalAs(UnmanagedType.Bool)]
    3. static extern bool BitBlt([In] IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, [In] IntPtr hdcSrc, int nXSrc, int nYSrc, TernaryRasterOperations dwRop);
    4. [DllImport("user32.dll", SetLastError = true)]
    5. static extern IntPtr GetDC(IntPtr hwnd);
    6. enum TernaryRasterOperations : uint
    7. {
    8. /// <summary>dest = source</summary>
    9. SRCCOPY = 0x00CC0020,
    10. /// <summary>dest = source OR dest</summary>
    11. SRCPAINT = 0x00EE0086,
    12. /// <summary>dest = source AND dest</summary>
    13. SRCAND = 0x008800C6,
    14. /// <summary>dest = source XOR dest</summary>
    15. SRCINVERT = 0x00660046,
    16. /// <summary>dest = source AND (NOT dest)</summary>
    17. SRCERASE = 0x00440328,
    18. /// <summary>dest = (NOT source)</summary>
    19. NOTSRCCOPY = 0x00330008,
    20. /// <summary>dest = (NOT src) AND (NOT dest)</summary>
    21. NOTSRCERASE = 0x001100A6,
    22. /// <summary>dest = (source AND pattern)</summary>
    23. MERGECOPY = 0x00C000CA,
    24. /// <summary>dest = (NOT source) OR dest</summary>
    25. MERGEPAINT = 0x00BB0226,
    26. /// <summary>dest = pattern</summary>
    27. PATCOPY = 0x00F00021,
    28. /// <summary>dest = DPSnoo</summary>
    29. PATPAINT = 0x00FB0A09,
    30. /// <summary>dest = pattern XOR dest</summary>
    31. PATINVERT = 0x005A0049,
    32. /// <summary>dest = (NOT dest)</summary>
    33. DSTINVERT = 0x00550009,
    34. /// <summary>dest = BLACK</summary>
    35. BLACKNESS = 0x00000042,
    36. /// <summary>dest = WHITE</summary>
    37. WHITENESS = 0x00FF0062,
    38. /// <summary>
    39. /// Capture window as seen on screen. This includes layered windows
    40. /// such as WPF windows with AllowsTransparency="true"
    41. /// </summary>
    42. CAPTUREBLT = 0x40000000
    43. }



    Auf der Form erscheint jedoch leider nicht das Bild, sondern nur ein schwarzes Rechteck mit der Größe des Bildes. Dies geschieht auch, wenn ich z.B. vorher mit dem Grafikobjekt das Bitmap mit einer Farbe fülle, d.h. an der Datei kann es nicht liegen. Habe mir auch mal die MSDN-Dokumentation durchgelesen und sämtliche TernaryRasterOperations durchprobiert. Leider hat keine Funktioniert.

    Ich hoffe, ihr könnt mir dabei helfen :)

    LG

    ~ides

    ichduersie schrieb:

    das selbe Ergebnis.
    Hier findest Du eine funktionierende Lösung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!