2011-04-27 187 views
3

我想在我的窗口中創建一個PIC盒加載一個位圖圖像... picBoxDisp使用以下機制創建..在WIN32中顯示圖像,爲什麼不顯示圖像?

picBoxDisp = CreateWindow("STATIC", "image box", 
         WS_VISIBLE |WS_CHILD | SS_BITMAP |WS_TABSTOP | WS_BORDER, 
         50, 50, 250, 300, hwnd , (HMENU)10000, NULL, NULL); 

現在接下來,我創建了一個HBITMAP對象,並在加載圖像以它...

hBitmap = (HBITMAP) LoadImage(NULL,szFileName,IMAGE_BITMAP,0,0, 
           LR_LOADFROMFILE| LR_DEFAULTSIZE); 

SendMessage(picBoxDisp,STM_SETIMAGE,(WPARAM) IMAGE_BITMAP,(LPARAM) NULL); 
//now assign the new image 

//Create a compatible DC for the original size bitmap, for example originalMemDc. 
HDC originalDC = GetDC((HWND)hBitmap); 
HDC originalMemDC = CreateCompatibleDC(originalDC); 
if(originalMemDC==NULL){ 
    MessageBox(NULL,"Problem while creating DC.","Error",MB_OK); 
} 
//Select hBitmap into originalMemDc. 
SelectObject(originalMemDC,hBitmap); 

//Create a compatible DC for the resized bitmap, for example resizedMemDc. 
HDC picBoxDC = GetDC(picBoxDisp); 
HDC resizedMemDC = CreateCompatibleDC(picBoxDC); 

//Create a compatible bitmap of the wanted size for the resized bitmap, 
HBITMAP hResizedBitmap = CreateCompatibleBitmap(picBoxDC,250,300); 

//Select hResizedBitmap into resizedMemDc. 
SelectObject(resizedMemDC,hResizedBitmap); 

//Stretch-blit from originalMemDc to resizedMemDc. 
//BitBlt(resizedMemDC,0,0,250,300,originalMemDC,0,0,SRCCOPY); 

BITMAP bmp_old,bmp_new; 
GetObject(hBitmap,sizeof(bmp_old),&bmp_old); 
GetObject(hResizedBitmap,sizeof(bmp_new),&bmp_new); 

StretchBlt (resizedMemDC,0,0,bmp_new.bmWidth,bmp_new.bmHeight, 
      originalMemDC,0,0,bmp_old.bmWidth,bmp_new.bmHeight, 
      SRCCOPY); 
////De-select the bitmaps. 

if((resizedMemDC==NULL)||(hResizedBitmap == NULL)) { 
    MessageBox(NULL,"Something is NULL","Error",MB_OK); 
} 
else 
    //Set hResizedBitmap as the label image with STM_SETIMAGE 
    SendMessage(picBoxDisp,STM_SETIMAGE, (WPARAM) IMAGE_BITMAP,(LPARAM) hResizedBitmap); 

我只是不明白,爲什麼上面的代碼不工作?

由於提前,

回答

4

你誤會了STM_SETIMAGE使用。這樣做:

hBitmap = (HBITMAP)::LoadImage(NULL, szFileName, IMAGE_BITMAP, 
           0, 0, LR_LOADFROMFILE| LR_DEFAULTSIZE); 

if (hBitmap != NULL) 
{ 
    ::SendMessage(picBoxDisp, STM_SETIMAGE, 
        (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap); 
} 

編輯:如果你想將它設置爲標籤圖像之前調整位圖,然後按照該方案爲最簡單的方式做到這一點(與在調整次優品質圖片...):

  1. 爲原始大小的位圖創建兼容的DC,例如originalMemDc
  2. 選擇hBitmap轉換成originalMemDc
  3. 爲調整大小的位圖創建兼容的DC,例如resizedMemDc
  4. 爲調整大小的位圖創建所需大小的兼容位圖,例如hResizedBitmap
  5. 選擇hResizedBitmapresizedMemDc
  6. Stretch-blit從originalMemDcresizedMemDc
  7. 取消選擇位圖。
  8. 設置hResizedBitmap作爲標籤圖像與STM_SETIMAGE

應該努力!

+0

感謝@Johann Gerell ..我嘗試了上面的代碼,但問題是所有的圖像都顯示不同的尺寸......有些看起來越來越大,而有些則顯示在一個角落(較小的圖像)...我只是想將所有圖像拉伸至相同的尺寸。 – aProgrammer 2011-04-27 07:25:01

+0

@ArtsitOfProgramming:請參閱我的更新答案與位圖大小調整邏輯。 – 2011-04-27 07:50:20

+0

Thanks @Johann Gerell,你可以在第4步和第7步中幫助我。對於resizedMemDC我已經使用下面的代碼,請讓我知道如果這是錯誤的HDC picBoxDC = GetDC(picBoxDisp); // picBoxDisp是靜態控制的手柄 \t \t \t \t \t \t \t \t \t \t \t \t \t HDC resizedMemDC = CreateCompatibleDC(picBoxDC); – aProgrammer 2011-04-27 09:49:26

1

您正在嘗試將圖像分配給靜態控件,因此您不需要繪製圖像,只需在其上設置圖像即可。

// set the image 
HBITMAP hold = (HBITMAP)SendMessage(hpicBoxDc, STM_SETIMAGE, IMAGE_BITMAP, LPARAM(hBitmap)); 

// clear the old image 
if(hold && hold != hBitmap) 
    DeleteObject(hold); 
+0

謝謝@ cbx ..我試着上面的代碼,但問題是,所有的圖像顯示不同的大小......有些看起來越來越大,而有些則顯示在一個角落(較小的圖像)...我只是想將所有圖像拉伸至相同的尺寸。 – aProgrammer 2011-04-27 07:26:06

+2

@ArtsitOfProgramming靜態控件將無法動態調整位圖的大小,而無需調整其自身大小。你將不得不使用在內存DC上創建它並將其擴展到控件上。 – cpx 2011-04-27 08:03:31

+0

這就是我想要實現的,嘗試了一切,但代碼仍然不工作...(請參閱編輯的代碼)。 – aProgrammer 2011-04-27 13:36:53

2

靜態控件不會將圖像拉伸到其大小。您可以使用SS_CENTERIMAGE,但它可以使用左上像素的顏色剪裁或填充空白空間(請參閱http://msdn.microsoft.com/en-US/library/b7w5x74z.aspx)。在將它發送給靜態控件之前,您必須自己拉伸位圖。

+0

謝謝@Marius Bancila ...這就是爲什麼我試圖使用StretcBlt()來拉伸圖像,但我認爲我迷失在某處... – aProgrammer 2011-04-27 07:46:53

+0

正確,但是您沒有將拉伸的位圖發送到控件或leas你沒有顯示該代碼。你有這個對CreateCompatibleDC(hdc)的調用;什麼是HDC?爲什麼不從hpicBoxDc創建兼容的內存設備上下文? – 2011-04-27 09:04:22

+0

請參閱編輯的代碼,我嘗試了一切建議在這個線程..但程序仍然無法正常工作,也沒有顯示任何錯誤.. – aProgrammer 2011-04-27 13:47:12