vc怎样在picture control中添加图片

    技术2022-05-19  22

    以下内容摘自此网址,它的主人不要介意。 http://blog.sina.com.cn/s/blog_4901f88e010005sw.html 在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(); }

    最新回复(0)