vc怎样在picture control中添加图片

本文介绍了如何在VC++的Picture Control中加载BMP图片,并实现图片的缩放显示。通过CFileDialog打开对话框选择BMP文件,然后使用CreateDIBitmap创建位图对象,最后在OnPaint事件中使用StretchBlt进行缩放绘制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在pic control中添加一幅图片,并将起缩小
void CTestbmpcontrolDlg::OnOK()
{
 // TODO: Add extra validation here
  static char BASED_CODE szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";
 CFileDialog dlg(TRUE,"BMP",NULL,  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
 if(dlg.DoModal() != IDOK)
  return;
 CString pathname = dlg.GetPathName();
 char *m_pBuffer;  //从BMP文件中读取的数据存放在此变量中
 
 //@@@@@@@@@@   读取BMP文件到m_pBuffer   @@@@@@@@@@
 CFile file;  //定义文件对象
 if( !file.Open(pathname, CFile::modeRead)) //以只读方式打开文件
 {
  MessageBox("无法打开BMP文件");
  return;
 }
 DWORD m_filelen;  //用于保存文件长度
 m_filelen = file.GetLength();  //读取文件长度
 m_pBuffer = new char[m_filelen + 1]; //根据文件长度分配数组空间
 if(!m_pBuffer)  //如果不空间不足则返回
 {
  MessageBox("无法分配足够的内存空间");
  return;
 }
 if(file.ReadHuge(m_pBuffer, m_filelen) != m_filelen)  //读取BMP文件到m_pBuffer中
 {
  MessageBox("读取BMP文件时出现错误");
  return;
 }
 
 //@@@@@@@@@@   将BMP文件数据从m_pBuffer中转换到m_hBitMap位图句柄中
 LPSTR hDIB;
 LPVOID lpDIBBits;
 BITMAPFILEHEADER bmfHeader;  //用于保存BMP文件头信息,包括类型、大小、位移量等
 DWORD bmfHeaderLen;  //保存文件头的长度
 bmfHeaderLen = sizeof(bmfHeader);  //读取文件头的长度
 //将m_pBuffer中文件头复制到bmfHeader中
 strncpy((LPSTR)&bmfHeader, (LPSTR)m_pBuffer, bmfHeaderLen);  
 if (bmfHeader.bfType != (*(WORD*)"BM"))   //如果文件类型不对,则返回
 {
  MessageBox("BMP文件格式不准确");
  return;
 }
 hDIB = m_pBuffer + bmfHeaderLen;  //将指针移至文件头后面
 //读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFOHEADER对象
 BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB;
 //读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFO对象
 BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
 //根据bfOffBits属性将指针移至文件头后
 lpDIBBits = (m_pBuffer) + ((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits;
 CClientDC dc(this);  //生成一个与当前窗口相关的CClientDC,用于管理输出设置
 //生成DIBitmap数据
 m_hBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
 
// CDialog::OnOK();
}
以上代码用于弹出一个对话框,并将读入图片,将其赋给m_hBitmap,m_hBitmap为Dialog中的
 
在OnPaint中加入如下代码:
 if(!m_hBitmap)  //如果内存中没有BMP数据,则返回
  return;
//BITMAP tmpBitmap;  //用于保存输出到屏幕的BMP数据
 ShowPicInPicControl(m_hBitmap);
 CDialog::OnPaint();
 
void CTestbmpcontrolDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting
  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;
  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
 //TODO:add code here
 if(!m_hBitmap)  //如果内存中没有BMP数据,则返回
  return;
 //HBITMAP tmpBitmap;  //用于保存输出到屏幕的BMP数据
 ShowPicInPicControl(m_hBitmap);
 CDialog::OnPaint();
 }
}
 
 
 
 ShowPicInPicControl函数的代码如下:
CTestbmpcontrolDlg::ShowPicInPicControl(HBITMAP hBmp)
{
 CWnd *pWnd = GetDlgItem(IDC_STATIC_RESULTPIC);
 CDC *pDC = pWnd->GetDC();
 CRect rect;
 pWnd->GetWindowRect(rect);
 CBitmap bmpObj;
 bmpObj.Attach(hBmp);
 CDC DCCompatible;
 DCCompatible.CreateCompatibleDC(pDC);
 CBitmap *pOldBmp = DCCompatible.SelectObject(&bmpObj);
 BITMAP bmpInfo;
 bmpObj.GetObject(sizeof(bmpInfo),&bmpInfo);
 pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &DCCompatible, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY );
 DCCompatible.SelectObject(pOldBmp);
 bmpObj.Detach();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值