2012-11-16 86 views
0

我試圖呈現在我的對話框(Visual Studio 2010的專業版)的按鈕控制一個PNG。之後做一些研究,我發現下面的方法,其適用於BMP文件:與按鈕使用PNG圖像控件

HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, L"test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 

SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap); 

這不會PNG文件的工作,雖然。一些研究之後,我發現有一個簡單的方法來做到這一點使用GDI +:

HBITMAP hBitmap; 
Gdiplus::Bitmap b(L"a.png"); 
b.GetHBITMAP(NULL, &hBitmap); 

SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap); 

我不會在我的程序中使用GDI +其他地方,但我仍然需要包括標題,鏈接庫,初始化它只是爲了完成這個簡單的任務。這是否值得所有這些麻煩?有沒有更標準的方法來做到這一點?

我打算渲染上的單個按鈕的多個PNG圖像(一些透明的)。

編輯:(略有修改)CreateDIBSectionFromBitmapSource()函數,我用來創建HBITMAP可以在這裏找到:

http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=win7wicsamples&DownloadId=7549

回答

0

你能成爲一個更具體一點關於你所說的「渲染意思「上的一個按鈕控制一個PNG ...

如果你的意思是你想堅持一個按鈕的PNG圖片,然後是有一個更簡單的方法。只需點擊按鈕,然後轉到「屬性」菜單中的「外觀」。點擊'BackgroundImage',選擇本地資源,然後瀏覽圖片並加載它。完成。

如果這不是你的意思做,那麼我可能會建議研究

System.Drawing.Image對象和使用GDI +

其實我坐在這裏學習GDI +,因爲我們說話。預先警告,學習一段時間。

+0

是啊,我的意思是一個按鈕堅持一個PNG圖像。我在屬性菜單中看不到外觀下的BackgroundImage。這是否適用於使用VS資源編輯器的C++應用程序? – user974967

+0

顯然,System.Drawing.Image是.net的東西,但你想要本地的C++,對吧? – zdd

+0

完全是我的錯。我在問題中看到了VS2010和GDI +,並假定他使用的是C#。 –

0

GDI +是用於讀取和呈現圖像以不同的格式的標準方法。其他方法是創建PNG解碼器組件,並從中獲取流,並將其傳遞給LoadImage函數,這正是GDI +在後臺爲您做的。圖像格式編碼器和解碼器是窗口成像組件的一部分。

在解碼和渲染如何將多個圖像執行的條款取決於你在找什麼,我不知道這件事。讓我留下一些評論。你現在正在做的事(通過按鈕的背景圖像選項)是將圖像解碼一次並保存爲位圖,因此當完成繪製時位圖已準備就緒,無需進行解碼。這就是按鈕的背景圖像繪畫所做的,按鈕組件保留了您傳遞它的位圖句柄,並且只需要重繪即可。我認爲你不需要擔心繪製位圖的性能,因爲它是直接使用Bitblt完成顯示設備的。

+0

我得到了使用WIC在按鈕上顯示的PNG。具體來說,我使用MSDN示例項目中的CreateDIBSectionFromBitmapSource()函數來創建HBITMAP。我唯一的問題是,如何使用透明度在按鈕上顯示多個PNG圖像?我想循環瀏覽一些PNG以在啓用透明度的按鈕上顯示。這可能嗎?請記住,我對這個特定的編程領域頗爲陌生。 :) – user974967

+0

編輯我原來的帖子,包括一個鏈接到我用來創建位圖的CreateDIBSectionFromBitmapSource()函數的MSDN項目。 – user974967