使用C#,我試圖繪製一個控件的實例,說一個面板或按鈕,在我的Pocket PC應用程序中的位圖。 .NET控件具有漂亮的DrawToBitmap函數,但它在.NET Compact Framework中不存在。掌上電腦:繪製控制位圖
我該如何將控件繪製到Pocket PC應用程序中的圖像上?
使用C#,我試圖繪製一個控件的實例,說一個面板或按鈕,在我的Pocket PC應用程序中的位圖。 .NET控件具有漂亮的DrawToBitmap函數,但它在.NET Compact Framework中不存在。掌上電腦:繪製控制位圖
我該如何將控件繪製到Pocket PC應用程序中的圖像上?
DrawToBitmap
在完整框架中通過發送WM_PRINT
消息到控件以及要打印的位圖的設備上下文來工作。 Windows CE不包括WM_PRINT
,所以這種技術將無法工作。
如果正在顯示控件,則可以從屏幕上覆制控件的圖像。下面的代碼使用這種方法來兼容DrawToBitmap
方法添加到Control
:
public static class ControlExtensions
{
[DllImport("coredll.dll")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("coredll.dll")]
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("coredll.dll")]
private static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest,
int nWidth, int nHeight, IntPtr hdcSrc,
int nXSrc, int nYSrc, uint dwRop);
private const uint SRCCOPY = 0xCC0020;
public static void DrawToBitmap(this Control control, Bitmap bitmap,
Rectangle targetBounds)
{
var width = Math.Min(control.Width, targetBounds.Width);
var height = Math.Min(control.Height, targetBounds.Height);
var hdcControl = GetWindowDC(control.Handle);
if (hdcControl == IntPtr.Zero)
{
throw new InvalidOperationException(
"Could not get a device context for the control.");
}
try
{
using (var graphics = Graphics.FromImage(bitmap))
{
var hdc = graphics.GetHdc();
try
{
BitBlt(hdc, targetBounds.Left, targetBounds.Top,
width, height, hdcControl, 0, 0, SRCCOPY);
}
finally
{
graphics.ReleaseHdc(hdc);
}
}
}
finally
{
ReleaseDC(control.Handle, hdcControl);
}
}
}
工程就像一個魅力,謝謝你先生 – Patrick 2010-02-21 19:40:09
你使用的是Windows CE或Windows Mobile? 正確更改標籤或更改問題標題。 – Shaihi 2010-02-21 07:57:26
我對我的錯誤表示歉意。一直以爲Windows CE和Windows mobile在哪裏一樣,但是現在維基百科給了我啓示。 – Patrick 2010-02-21 19:39:14