Frage

Ich habe einmal Bitblt verwendet, um einen Screenshot in einer Bilddatei (.NET Compact Framework v3.5, Windows Mobile 2003 und später) zu speichern. Hat gut funktioniert. Jetzt möchte ich eine Bitmap in eine Form zeichnen. ich könnte benutzen this.CreateGraphics().DrawImage(mybitmap, 0, 0), aber ich habe mich gefragt, ob es mit Bitblt wie zuvor funktionieren würde und einfach die Parameter austauschen würde. Also schrieb ich:

[DllImport("coredll.dll")]
public static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);

(Und weiter unten :)

IntPtr hb = mybitmap.GetHbitmap();
BitBlt(this.Handle, 0, 0, mybitmap.Width, mybitmap.Height, hb, 0, 0, 0x00CC0020);

Aber die Form bleibt schlicht weiß. Warum ist das so? Wo ist der Fehler, den ich begangen habe? Vielen Dank für Ihre Meinung. Prost, David

War es hilfreich?

Lösung

this.Handle ist ein Fenstergriff kein Gerätekontext.

Ersetzen this.Handle mit this.CreateGraphics().GetHdc()

Natürlich müssen Sie das Grafikobjekt usw. zerstören ...

IntPtr hb = mybitmap.GetHbitmap(); 
using (Graphics gfx = this.CreateGraphics())
{
  BitBlt(gfx.GetHdc(), 0, 0, mybitmap.Width, mybitmap.Height, hb, 0, 0, 0x00CC0020);
}

Zusätzlich hb ist ein Bitmap Handle kein device context Das obige Snippet funktioniert also immer noch nicht. Sie müssen einen Gerätekontext aus der Bitmap erstellen:

    using (Bitmap myBitmap = new Bitmap("c:\test.bmp"))
    {
        using (Graphics gfxBitmap = Graphics.FromImage(myBitmap))
        {
            using (Graphics gfxForm = this.CreateGraphics())
            {
                IntPtr hdcForm = gfxForm.GetHdc();
                IntPtr hdcBitmap = gfxBitmap.GetHdc();
                BitBlt(hdcForm, 0, 0, myBitmap.Width, myBitmap.Height, hdcBitmap, 0, 0, 0x00CC0020);
                gfxForm.ReleaseHdc(hdcForm);
                gfxBitmap.ReleaseHdc(hdcBitmap);
            }
        }
    }

Andere Tipps

Du meinst etwas in dieser Richtung?

    public void CopyFromScreen(int sourceX, int sourceY, int destinationX, 
                               int destinationY, Size blockRegionSize, 
                               CopyPixelOperation copyPixelOperation)
    {
        IntPtr desktopHwnd = GetDesktopWindow();
        if (desktopHwnd == IntPtr.Zero)
        {
            throw new System.ComponentModel.Win32Exception();
        }
        IntPtr desktopDC = GetWindowDC(desktopHwnd);
        if (desktopDC == IntPtr.Zero)
        {
            throw new System.ComponentModel.Win32Exception();
        }
        if (!BitBlt(hDC, destinationX, destinationY, blockRegionSize.Width, 
             blockRegionSize.Height, desktopDC, sourceX, sourceY, 
             copyPixelOperation))
        {
            throw new System.ComponentModel.Win32Exception();
        }
        ReleaseDC(desktopHwnd, desktopDC);
    }

Zu Ihrer Information, das ist direkt aus der SDF.

Bearbeiten: In diesem Snippet ist es nicht wirklich klar, aber HDC im Bitblt ist der HDC der Zielbitmap (in das Sie malen möchten).

Sind Sie sicher, dass this.Handle Bezieht sich auf einen gültigen Gerätekontext? Haben Sie versucht, den Rückgabewert der Rückgabe zu überprüfen BitBlt Funktion?

Versuche Folgendes:

[DllImport("coredll.dll", EntryPoint="CreateCompatibleDC")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

[DllImport("coredll.dll", EntryPoint="GetDC")]
public static extern IntPtr GetDC(IntPtr hwnd);

IntPtr hdc     = GetDC(this.Handle);
IntPtr hdcComp = CreateCompatibleDC(hdc);

BitBlt(hdcComp, 0, 0, mybitmap.Width, mybitmap.Height, hb, 0, 0, 0x00CC0020);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top