C# Bitblit от растрового картера для управления (Compact Framework)
-
20-09-2019 - |
Вопрос
Я использовал один раз BitBlt, чтобы сохранить скриншот в файл изображения (.net Compact Framework v3.5, Windows Mobile 2003 и позже). Работал нормально. Теперь я хочу привлечь расидную карту в форму. Я мог бы использовать this.CreateGraphics().DrawImage(mybitmap, 0, 0)
, но мне было интересно, будет ли это работать с Bitblt, как раньше, и просто обмениваться параметрами. Итак, я написал:
[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);
(и дальше вниз :)
IntPtr hb = mybitmap.GetHbitmap();
BitBlt(this.Handle, 0, 0, mybitmap.Width, mybitmap.Height, hb, 0, 0, 0x00CC0020);
Но форма остается простой белой. Почему это? Где ошибка, которую я совершил? Спасибо за ваше мнение. Ура, Дэвид
Решение
this.Handle
это Оконная ручка не контекст устройства.
Заменять this.Handle
с this.CreateGraphics().GetHdc()
Конечно, вам нужно уничтожить графический объект и т. Д.
IntPtr hb = mybitmap.GetHbitmap();
using (Graphics gfx = this.CreateGraphics())
{
BitBlt(gfx.GetHdc(), 0, 0, mybitmap.Width, mybitmap.Height, hb, 0, 0, 0x00CC0020);
}
Кроме того hb
это Bitmap Handle
не device context
Так что приведенный выше фрагмент все еще не будет работать. Вам нужно будет создать контекст устройства из растрового изображения:
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);
}
}
}
Другие советы
Вы имеете в виду что -то в этом роде?
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);
}
К вашему сведению, это прямо из SDF.
РЕДАКТИРОВАТЬ: В этом фрагменте не очень четко, но HDC в BitBlt - это HDC целевого растрового изображения (в который вы хотите рисовать).
Вы уверены, что this.Handle
относится к действующему контексту устройства? Вы пробовали проверить возвращаемое значение BitBlt
функция?
Попробуйте следующее:
[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);