2011-04-27 240 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