2010-07-30 65 views

回答

1

你需要调用ImageList_GetIcon列表中的每个图像 - 这会给你一个HICON这是很容易加载到Bitmap

+0

谢谢你,以后我怎么能加载惠康成图像?使用Bitmap.FromHbitmap?但HICON也会成为IntPtr? – 2010-07-30 18:40:56

+0

http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.fromhicon.aspx – 2010-07-30 18:43:30

+0

谢谢,我也卡在ImageList_GetIcon的flags参数。我怎样才能指定它?我想我需要ILD_NORMAL。 – 2010-07-30 18:49:43

1

使用以下的功能:

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