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显示图片,为啥不显示?的主要内容,如果未能解决你的问题,请参考以下文章

复制粘贴到word里的图片为啥不显示?

为啥 imageArray 中只显示一张图片?

为啥word文档插入图片不显示

word为啥不能显示图片

zabbix图片下为啥不显示字

我的wordpress里上传图片为啥显示成功,但是无法显示?