2013-06-25 80 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

希望有所幫助。我知道這似乎有點奇怪的解決方案,但值得一試。