怎样在picture控件中显示jpg、bmp格式的图片

yxq123 2006-11-15 04:02:23
怎样在picture控件中显示jpg、bmp格式的图片。
有一个按钮,单击后,打开一个对话框,里面是文件列表
选择一个jpg格式的图片,点击确定后,在picture控件中显示该图片。
打开对话框我已经实现了,就是不知道怎样吧图片显示在
picture控件中。
...全文
420 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxq123 2006-11-20
  • 打赏
  • 举报
回复
问题依然没有解决,结贴先!!!
zwlzwlzwl 2006-11-15
  • 打赏
  • 举报
回复
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, strFileName, IMAGE_BITMAP, 0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);


CStatic * sta = (CStatic*)GetDlgItem(IDC_STATIC);

sta->SetBitmap(m_pBmp);
laolaoliu2002 2006-11-15
  • 打赏
  • 举报
回复
include "windows.h"
#include "ocidl.h"
#include "olectl.h"

typedef struct tagImgInfo {
IPicture *Ipic;
SIZE sizeInHiMetric;
SIZE sizeInPix;
char *Path;
} IMG_INFO;

static IMG_INFO ImageInfo;

void *OpenGraphic(char *name)
{
IPicture *Ipic = NULL;
SIZE sizeInHiMetric,sizeInPix;
const int HIMETRIC_PER_INCH = 2540;
HDC hDCScreen = GetDC(NULL);
HRESULT hr;
int nPixelsPerInchX = GetDeviceCaps(hDCScreen, LOGPIXELSX);
int nPixelsPerInchY = GetDeviceCaps(hDCScreen, LOGPIXELSY);
unsigned short OlePathName[512];

ReleaseDC(NULL,hDCScreen);
mbstowcs(OlePathName,name,strlen(name)+1);
hr = OleLoadPicturePath(OlePathName,
NULL,
0,
0,
&IID_IPicture,
(void *)(&Ipic));
if (hr)
return 0;
if (Ipic) {
// get width and height of picture
hr = Ipic->lpVtbl->get_Width(Ipic,&sizeInHiMetric.cx);
if (!SUCCEEDED(hr))
goto err;
Ipic->lpVtbl->get_Height(Ipic,&sizeInHiMetric.cy);
if (!SUCCEEDED(hr))
goto err;

// convert himetric to pixels
sizeInPix.cx = (nPixelsPerInchX * sizeInHiMetric.cx +
HIMETRIC_PER_INCH / 2) / HIMETRIC_PER_INCH;
sizeInPix.cy = (nPixelsPerInchY * sizeInHiMetric.cy +
HIMETRIC_PER_INCH / 2) / HIMETRIC_PER_INCH;
ImageInfo.sizeInPix = sizeInPix;
ImageInfo.sizeInHiMetric = sizeInHiMetric;
ImageInfo.Ipic = Ipic;
ImageInfo.Path = name;
return Ipic;

}
err:
return 0;
}
void DisplayGraphic(HWND hwnd,HDC pDC)
{
IPicture *Ipic = ImageInfo.Ipic;
DWORD dwAttr = 0;
HBITMAP Bmp,BmpOld;
RECT rc;
HRESULT hr;
HPALETTE pPalMemOld;

if (Ipic != NULL)
{
// get palette
OLE_HANDLE hPal = 0;
HPALETTE hPalOld=NULL,hPalMemOld=NULL;
hr = Ipic->lpVtbl->get_hPal(Ipic,&hPal);

if (!SUCCEEDED(hr))
return;
if (hPal != 0)
{
hPalOld = SelectPalette(pDC,(HPALETTE)hPal,FALSE);
RealizePalette(pDC);
}

// Fit the image to the size of the client area. Change this
// For more sophisticated scaling
GetClientRect(hwnd,&rc);
// transparent?
if (SUCCEEDED(Ipic->lpVtbl->get_Attributes(Ipic,&dwAttr)) ||
(dwAttr & PICTURE_TRANSPARENT))
{
// use an off-screen DC to prevent flickering
HDC MemDC = CreateCompatibleDC(pDC);
Bmp =
CreateCompatibleBitmap(pDC,ImageInfo.sizeInPix.cx,ImageInfo.sizeInPix.cy);

BmpOld = SelectObject(MemDC,Bmp);
pPalMemOld = NULL;
if (hPal != 0)
{
hPalMemOld = SelectPalette(MemDC,(HPALETTE)hPal, FALSE);
RealizePalette(MemDC);
}
/* Use this to show the left corner
rc.left = rc.top = 0;
rc.right = ImageInfo.sizeInPix.cx;
rc.bottom = ImageInfo.sizeInPix.cy;
*/
// display picture using IPicture::Render
hr = Ipic->lpVtbl->Render(Ipic,MemDC,
0,
0,
rc.right,
rc.bottom,
0,
ImageInfo.sizeInHiMetric.cy,
ImageInfo.sizeInHiMetric.cx,
-ImageInfo.sizeInHiMetric.cy,
&rc);

BitBlt(pDC,0, 0, ImageInfo.sizeInPix.cx,
ImageInfo.sizeInPix.cy,
MemDC, 0, 0, SRCCOPY);

SelectObject(MemDC,BmpOld);

if (pPalMemOld) SelectPalette(MemDC,pPalMemOld, FALSE);
DeleteObject(Bmp);
DeleteDC(MemDC);

}
else
{
// display picture using IPicture::Render
Ipic->lpVtbl->Render(Ipic,pDC,
0,
0,
rc.right,
rc.bottom,
0,
ImageInfo.sizeInHiMetric.cy,
ImageInfo.sizeInHiMetric.cx,
-ImageInfo.sizeInHiMetric.cy,
&rc);
}

if (hPalOld != NULL) SelectPalette(pDC,hPalOld, FALSE);
if (hPal) DeleteObject((HPALETTE)hPal);
}
}

void CloseImage(void *Ipict)
{
IPicture *ip = (IPicture *)Ipict;

if (ip == NULL)
ip = ImageInfo.Ipic;
if (ip == NULL)
return;
ip->lpVtbl->Release(ip);
memset(&ImageInfo,0,sizeof(ImageInfo));
}
laolaoliu2002 2006-11-15
  • 打赏
  • 举报
回复
http://www.codeproject.com/bitmap
yxq123 2006-11-15
  • 打赏
  • 举报
回复
我要的不是这种方式,这样只能打开固定的图片,而且不能是jpg格式的图片
我要得是有选择的打开图片。
neosu 2006-11-15
  • 打赏
  • 举报
回复
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, strFileName, IMAGE_BITMAP, 0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
((CStatic *)GetDlgItem(IDC_STATIC_IMAGE))->SetBitmap(hBitmap);
zwlzwlzwl 2006-11-15
  • 打赏
  • 举报
回复
把控件的Type改成Bitmap,然后Image中选择图片

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧