2013-01-03 36 views
0

我的目標是在內存中創建一個位圖,並使用它的句柄作爲BM_SETIMAGE消息(設置按鈕的位圖的消息)的參數。在內存中創建一個位圖並使用它

下面是我的代碼:

........ 

     HDC hdc = GetDC(hwnd); 
     HDC memDC = CreateCompatibleDC(hdc); 
     HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, 100, 100); 
     HBITMAP hOldBmp = (HBITMAP)SelectObject(memDC, hMemBmp); 
     Rectangle(memDC, 0, 0, 100, 100); 

     HBRUSH brush = CreateSolidBrush(RGB(0xff, 0xff, 0x00)); 

     RECT rc; 
     rc.left = 0; 
     rc.top = 0; 
     rc.right = 100; 
     rc.bottom = 100; 
     FillRect(memDC, &rc, brush); 

     SendMessage(GetDlgItem(hDlg, IDC_SET_START_PAGE_BG), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hMemBmp); 

........ 

,但它不工作對我的按鈕,我剛剛得到黑色。

問題:

  1. 是否FillRect(memDC, &rc, brush)修改hMemBmp的內容?如果不是,那麼SelectObject(memDC, hMemBmp)爲這兩個對象做了什麼?

  2. 我應該用CreateBitmap而不是CreateCompatibleBitmap來完成我的任務嗎?

回答

2

您應該在發送消息之前將舊位圖選回存儲器DC。 According to MSDN一次只能在一個DC中選擇一個位圖。

+0

謝謝,它的工作原理。所以在SelectObject(memDC,hOldBmp)之後,hMemBmp被選入hdc並且hOldBmp被選入memDC,對嗎? – user565739

+2

@ user565739:不,沒有人選擇「hdc」。在該行之後'hMemBmp'將與任何DC分離並且具有內部圖像 - 這正是'BM_SETIMAGE'期望的內容 - 包含圖像的未附加位圖。 –

相關問題