【问题标题】: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);

我就是不明白,为什么上面的代码不起作用?

提前致谢,

【问题讨论】:

    标签: c++ winapi visual-c++


    【解决方案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); 
    }
    

    编辑:如果您想在将位图设置为标签图像之前调整其大小,请遵循此方案以获得最简单的方法(调整后的图像质量次优。 ..):

    1. 为原始大小的位图创建一个兼容的 DC,例如 originalMemDc
    2. originalMemDc中选择hBitmap
    3. 为调整大小的位图创建兼容的 DC,例如 resizedMemDc
    4. 为调整大小的位图创建所需大小的兼容位图,例如hResizedBitmap
    5. resizedMemDc中选择hResizedBitmap
    6. originalMemDc 拉伸到resizedMemDc
    7. 取消选择位图。
    8. 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 它并将其拉伸到控件上。
    • 这就是我想要实现的,尝试了一切,但代码仍然无法正常工作......(请参阅编辑后的代码)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多