现在的位置: 首页 > 综合 > 正文

vc怎样在picture control中添加图片

2013年10月03日 ⁄ 综合 ⁄ 共 3005字 ⁄ 字号 评论关闭
在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();
}

抱歉!评论已关闭.