Pregunta

Usé una vez bitBLT para guardar una captura de pantalla en un archivo de imagen (.NET Compact Framework v3.5, Windows Mobile 2003 y posterior). Funcionó bien. Ahora quiero dibujar un mapa de bits a un formulario. Podría usar this.CreateGraphics().DrawImage(mybitmap, 0, 0), pero me preguntaba si funcionaría con bitblt como antes y simplemente intercambiaría los parámetros. Entonces escribí:

[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);

(y más abajo :)

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

Pero la forma se mantiene en blanco. ¿Porqué es eso? ¿Dónde está el error que cometí? Gracias por tus opiniones. Salud, David

¿Fue útil?

Solución

this.Handle es un Mango de la ventana No un contexto del dispositivo.

Reemplazar this.Handle con this.CreateGraphics().GetHdc()

Por supuesto que necesitarás destruir el objeto gráfico, etc.

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

Además hb es un Bitmap Handle No un device context Entonces, el fragmento anterior todavía no funcionará. Deberá crear un contexto de dispositivo desde el mapa de bits:

    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);
            }
        }
    }

Otros consejos

¿Te refieres a algo en este sentido?

    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);
    }

FYI, esto es Justo fuera del SDF.

Editar: no está muy claro en este fragmento, pero el HDC en el bitBlt es el HDC del mapa de bits de destino (en el que desea pintar).

Estás seguro que this.Handle ¿Se refiere a un contexto de dispositivo válido? ¿Ha intentado verificar el valor de retorno del BitBlt ¿función?

Prueba lo siguiente:

[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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top