WIN32显示图片,为啥不显示?
Posted
技术标签:
【中文标题】WIN32显示图片,为啥不显示?【英文标题】:Displaying image in WIN32, Why its not displayed?WIN32显示图片,为什么不显示? 【发布时间】:2011-04-27 06:15:21 【问题描述】:我想将位图图像加载到我在窗口中创建的图片框中...picBoxDisp 是使用以下机制创建的..
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);
我就是不明白,为什么上面的代码不起作用?
提前致谢,
【问题讨论】:
【参考方案1】:您误解了 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);
编辑:如果您想在将位图设置为标签图像之前调整其大小,请遵循此方案以获得最简单的方法(调整后的图像质量次优。 ..):
-
为原始大小的位图创建一个兼容的 DC,例如
originalMemDc
。
在originalMemDc
中选择hBitmap
。
为调整大小的位图创建兼容的 DC,例如 resizedMemDc
。
为调整大小的位图创建所需大小的兼容位图,例如hResizedBitmap
。
在resizedMemDc
中选择hResizedBitmap
。
从originalMemDc
拉伸到resizedMemDc
。
取消选择位图。
将hResizedBitmap
设置为带有STM_SETIMAGE
的标签图像
应该可以!
【讨论】:
感谢@Johann Gerell ..我尝试了上面的代码,但问题是所有图像都以不同的尺寸显示...有些看起来更大更好,而另一些则显示在角落(较小的图像)...我只是想将所有图像拉伸到相同的大小。 @ArtsitOfProgramming:请参阅我更新的位图调整逻辑答案。 谢谢@Johann Gerell,请您在第 4 步和第 7 步中帮助我。对于 resizedMemDC 我使用了以下代码,请让我知道这是否是错误的 HDC picBoxDC = GetDC(picBoxDisp); //picBoxDisp为静态控件HDC的句柄 resizedMemDC = CreateCompatibleDC(picBoxDC); @James Gerell,我不知道如何进行第 4 步和第 7 步...我想要与 picBoxDisp Control 完全一样大小的新...谢谢哥们的帮助, @ArtsitOfProgramming:我已经写了如何做到这一点:为调整大小的位图创建所需大小的兼容位图,如下所示:hResizedBitmap = ::CreateCompatibleBitmap(picBoxDC, 250, 300)
。您可以使用::SelectObject
选择/取消将位图输入/输出 DC。【参考方案2】:
静态控件不会将图像拉伸到它的大小。您可以使用 SS_CENTERIMAGE 但它可以使用左上角像素的颜色剪辑或填充空白空间(请参阅http://msdn.microsoft.com/en-US/library/b7w5x74z.aspx)。在将位图发送到静态控件之前,您必须自己拉伸位图。
【讨论】:
感谢@Marius Bancila ...这就是为什么我尝试使用 StretcBlt() 拉伸图像但我想我迷路了... 对,但是您没有将拉伸的位图发送到控件,或者至少您没有显示该代码。你有这个调用 CreateCompatibleDC(hdc);那里有什么hdc?为什么不从 hpicBoxDc 创建一个兼容的内存设备上下文? 请查看编辑后的代码,我尝试了该线程中建议的所有内容..但程序仍然无法运行,也没有显示任何错误..【参考方案3】:您正在尝试将图像分配给静态控件,因此您无需绘制图像而是在其上设置图像。
// set the image
HBITMAP hold = (HBITMAP)SendMessage(hpicBoxDc, STM_SETIMAGE, IMAGE_BITMAP, LPARAM(hBitmap));
// clear the old image
if(hold && hold != hBitmap)
DeleteObject(hold );
【讨论】:
感谢@cbx ..我尝试了上面的代码,但问题是所有图像都以不同的尺寸显示......有些看起来更大更好,而另一些则显示在角落(较小的图像) ...我只是想将所有图像拉伸到相同的大小。 @ArtsitOfProgramming 静态控件无法在不调整自身大小的情况下为您动态调整位图大小。您必须在 memoryDC 上使用 create 它并将其拉伸到控件上。 这就是我想要实现的,尝试了一切,但代码仍然无法正常工作......(请参阅编辑后的代码)。以上是关于WIN32显示图片,为啥不显示?的主要内容,如果未能解决你的问题,请参考以下文章