0
我想从一个非托管dll使用HIMAGELIST,它给了我一个IntPtr的结果。如何将HIMAGELIST的IntPtr转换为位图/图像
有没有办法,我把这个IntPtr的成位图或图像所以我可以用它的WinForms按钮,如:
myButton.Image = intPtrImage
我想从一个非托管dll使用HIMAGELIST,它给了我一个IntPtr的结果。如何将HIMAGELIST的IntPtr转换为位图/图像
有没有办法,我把这个IntPtr的成位图或图像所以我可以用它的WinForms按钮,如:
myButton.Image = intPtrImage
你需要调用ImageList_GetIcon
列表中的每个图像 - 这会给你一个HICON这是很容易加载到Bitmap
使用以下的功能:
private const string Gdi32Dll = @".\gdi32.dll";
[DllImport(Gdi32Dll, ExactSpelling = true)]
internal static extern int SetDIBitsToDevice(
IntPtr hdc,
int xdst,
int ydst,
int width,
int height,
int xsrc,
int ysrc,
int start,
int lines,
IntPtr bitsptr,
IntPtr bmiptr,
int color);
public static Bitmap BitmapFromDIB(IntPtr dibPtrArg)
{
Bitmapinfoheader bmiHeader;
IntPtr pixptr = IntPtr.Zero;
GetPixelInfo(dibPtrArg, out pixptr, out bmiHeader);
Bitmap bitMap = new Bitmap(bmiHeader.biWidth, bmiHeader.biHeight);
Graphics scannedImageGraphics = Graphics.FromImage(bitMap);
IntPtr hdc = scannedImageGraphics.GetHdc();
SetDIBitsToDevice(
hdc,
0, // XDest
0, // YDest
bmiHeader.biWidth,
bmiHeader.biHeight,
0, // XSrc
0, // YSrc
0, // uStartScan
bmiHeader.biHeight, // cScanLines
pixptr, // lpvBits
dibPtrArg, // lpbmi
DibRgbColors); // 0 = literal RGB values rather than palette
scannedImageGraphics.ReleaseHdc(hdc);
return bitMap;
}
private static void GetPixelInfo(IntPtr bmpptr, out IntPtr pix, out Bitmapinfoheader bmi)
{
bmi = new Bitmapinfoheader();
Marshal.PtrToStructure(bmpptr, bmi); // copy into struct.
if (bmi.biSizeImage == 0)
{
bmi.biSizeImage = ((((bmi.biWidth * bmi.biBitCount) + 31) & ~31) >> 3) * bmi.biHeight;
}
int p = bmi.biClrUsed;
if ((p == 0) && (bmi.biBitCount <= 8))
{
p = 1 << bmi.biBitCount;
}
pix = (IntPtr)((p * 2) + bmi.biSize + (int)bmpptr);
}
谢谢你,以后我怎么能加载惠康成图像?使用Bitmap.FromHbitmap?但HICON也会成为IntPtr? – 2010-07-30 18:40:56
http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.fromhicon.aspx – 2010-07-30 18:43:30
谢谢,我也卡在ImageList_GetIcon的flags参数。我怎样才能指定它?我想我需要ILD_NORMAL。 – 2010-07-30 18:49:43