2013-06-25 82 views
0

我想用gdi +绘制一个图标。当直接从磁盘加载图标文件时,我的工作正常,但如果可能,我想将图标存储在资源中。有没有一种简单的方法可以做到这一点而不会失去解决方案?Gdiplus ::图标资源图片?

// The image draws and looks exactly how I want it to 
    Gdiplus::Image indicator(L"\\Indicator.ico"); 
    graphics->DrawImage(&indicator, 7, 7); 

    // The image draws, but looks bloated and pixel-y 
    const HICON hIcon = AfxGetApp()->LoadIcon(IDI_INDICATOR); 
    if (hIcon) 
    { 
     Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromHICON(hIcon); 
     graphics->DrawImage(bitmap, 7, 7); 
    } 
+1

你只是不想使用Bitmap :: FromHICON(),它将一个糟糕的工作映射到图像。图像将只有来自预先调色板的16种颜色。只需使用DrawIcon()。 –

+0

感谢您的输入。 DrawIcon()看起来比传递一个位图到DrawImage()更好。图像仍然不如图标上的DrawImage()精确,但使用Gdiplus的重要原因是因为我还需要将图标旋转到指定的角度。为此,我相信我需要在DrawImage()之前调用graphics-> RotateTransform()。 – pates

+0

将它绘制成位图,旋转位图。 –

回答

0

我以前有位图类似的问题。如果它从磁盘加载时工作正常,那么它几乎可以肯定是因为将它作为资源嵌入以某种方式加以破坏。当您将“已知”图像类型存储为资源时,似乎会发生奇怪的事情。在位图的情况下,我发现它好像有些位图头部被剥离,这意味着如果我使用第三方图像库,则无法将其作为资源加载。

我最终发现的解决方案是通过手动编辑.rc文件创建新的资源类型,然后将该图标另存为。因此,而不是这样的:

IDR_MAINFRAME   ICON     "res\\Merckx.ico" 

你会是这样的:

IDR_MAINFRAME   USERICN     "res\\Merckx.ico" 

我不知道,如果加载它作为一个Gdiplus ::图像的资源ID,然后仍然可以工作。如果没有,您可能需要使用LoadResource()手动加载资源,然后从流中创建Gdiplus :: Image对象。关于如何做到这一点,有一篇很好的文章here

希望有所帮助。我知道这似乎有点奇怪的解决方案,但值得一试。