我想在我在窗口中创建的图片框中加载BitMap图像...使用以下机制创建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楼 票数:5 已采纳

您误解了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. 选择hBitmaporiginalMemDc
  3. 为调整大小的位图创建兼容的DC,例如resizedMemDc
  4. 为调整大小的位图创建所需大小的兼容位图,例如hResizedBitmap
  5. 选择hResizedBitmapresizedMemDc
  6. originalMemDcresizedMemDc Stretch-blit。
  7. 取消选择位图。
  8. 使用STM_SETIMAGEhResizedBitmap设置为标签图像

应该管用!

#2楼 票数:2

静态控件不会将图像拉伸到其大小。 您可以使用SS_CENTERIMAGE,但它会使用左上角像素的颜色剪切或填充空白区域(请参阅http://msdn.microsoft.com/en-US/library/b7w5x74z.aspx )。 在将位图发送到静态控件之前,您必须自己拉伸位图。

#3楼 票数: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 );

  ask by Amit translate from so

未解决问题?本站智能推荐:

2回复

如何使用visual studio c在win32中拉伸背景图像

我正在尝试使用c ++在Win32 api中创建一个应用程序,我想在没有任何条形码的情况下使其成为FullScreen,我成功但我仍然在背景图像中有问题。 图像重复但我希望它被拉伸。 你知道吗? 以下部分来自代码: } 谢谢
4回复

如何在win32中更改窗口的背景图像?

在WIN32中如何在运行时更改窗口的背景图像? 我已经使用CreateWindow()创建了窗口。 然后,我有一个LoadImage按钮,它会打开一个模型对话框(打开文件对话框)...现在,我想将此对话框返回的文件名用作窗口的图像。
1回复

Win32中的RedrawWindow和UpdateWindow有什么区别?

Win32中的RedrawWindow和UpdateWindow有什么区别? 由于它们似乎有相同的目的刷新窗口,有什么区别?
1回复

VC ++ win32 API编程:如何从剪贴板中获取图像并将其显示在Windows中?

在内存DC上使用SelectObject()来选择位图。 这让我感到困惑。 我读了msdn但仍然不知道如何填充SelectObject()的第二个参数。
1回复

为什么窗口没有加载? [Win32] [重复]

这个问题在这里已经有了答案: Win32 API - RegisterClassEx 错误(1 个回答) 10 个月前关闭。
7回复

Win32:将窗口置于顶部

我有一个 Windows 程序,其中有两个 2 个窗口: 当我双击hwnd时,我需要hwnd2弹出并显示一些数据,所以我使用这个函数将hwnd2带到顶部: hwnd2 被带到了顶部,但有一点很奇怪。 当我再次点击 hwnd2 时,hwnd(主界面)再次自动弹出。 我尝试使用以下函数来解决这
2回复

如何使用WIN32核心和VC ++将位图图像拉伸到某些特定的Co Ordinates?

我只想创建一个程序来裁剪图像并将裁剪后的图像发送到某个远程位置。 我已经使用BitBlt()加载了图像。 我不知道,如何统一显示所有图像? 都一样大小。 允许拉伸。 我已经创建了一个静态控件,现在我只想显示该静态控件中的所有图像... 我可以使用STM_SETIMAGE显示图
1回复

VS 2010中Win32应用程序中的文件夹复制

我正在下面的代码 上面的功能成功地将文件夹和子文件夹复制到目标路径,当文件夹在目标路径不存在时,我得到的唯一问题是Windows提示,Windows提示“您是否要创建此文件夹”,我该如何绕过它提示和Windows显示的Windows进度栏。