QQ登录

只需一步,快速开始

126上位机VC MFC两种实现图片的自由缩放效果

[ 复制链接 ]

126上位机VC MFC两种实现图片的自由缩放效果

126上位机VC MFC两种实现图片的自由缩放效果

126上位机VC MFC两种实现图片的自由缩放效果


功能展示

一般电脑打开一幅图上都可以进行放大与缩小,我们当前例程通过两种方法也来实现图片的放大与缩小,点击打开位图成功打开后,可以拖拽滑块进行图片的放大与缩小操作,编辑框为缩放的比例,效果如图;
要点提示
图片的放大缩小第种方法是通过设备上下文类CDC的函数StretchBlt()来实现的,前面众多例程都使用了此函数,函数的使用可以参考前面例程;第二种方法是通过GDI+实现的,GDI+实现图片缩放非常方法,具体使用可以参考例程;这里要知道的是滑块再没有关联变量时,它的默认滑动范围是0—100,它的当前值可以通过它的ID来获取,如GetDlgItem(IDC_SLIDER1)->GetPos();





实现功能
1.新建基于对话框的应用程序
2.插入一对话框资源关联一对话框类class CDlg : public Cdialog,再拖拽一图片控件修改其ID为IDC_BMP,关联变量  HBITMAPm_hBitmap;用于显示打开的位图;
添加自定义函数LoadBmp()ResizeBmp()用于打开和缩放位图;

添加水平垂直滚动条消息,用于滚动已打开的大图片OnHScroll() OnVScroll(),下面是函数体
  1. void CDlg::LoadBmp()
  2. {
  3.         CFileDialog dlg (true,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp||",this);
  4.         if (dlg.DoModal()==IDOK)
  5.         {
  6.                 CString sPath;
  7.                 sPath = dlg.GetPathName();
  8.                 m_hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),sPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE);
  9.                 if (m_hBitmap)
  10.                 {
  11.                         m_Bmp.SetBitmap(m_hBitmap);
  12.                         m_Bmp.CenterWindow();
  13.                 }
  14. //><                                
  15.                 BITMAP bmp;
  16.                 GetObject(m_hBitmap,sizeof(bmp),&bmp);
  17.                 CRect rect;
  18.                 GetClientRect(rect);        
  19.                 int xpos = GetScrollPos(SB_HORZ);
  20.                 if (xpos != 0)
  21.                         ScrollWindow(xpos,0); //水平滚动条归零
  22.                
复制代码
  1. int ypos = dlg.GetScrollPos(SB_VERT);
  2.                 if (ypos != 0)
  3.                         ScrollWindow(0,ypos);
  4. //><设置垂直滚动条信息               
  5.                 SCROLLINFO vinfo;        
  6.                 vinfo.cbSize = sizeof(vinfo);
  7.                 vinfo.fMask = SIF_ALL;
  8.                 vinfo.nPage = bmp.bmHeight/10;
  9.                 vinfo.nMax= bmp.bmHeight-rect.Height()+10;
  10.                 vinfo.nMin = 0;
  11.                 vinfo.nTrackPos = 0;
  12.                 vinfo.nPos = 0;        
  13.                 SetScrollInfo(SB_VERT,&vinfo);
  14. //><设置水平滚动条信息
  15.                 vinfo.fMask = SIF_ALL;
  16.                 vinfo.nPage = bmp.bmWidth/10;
  17.                 vinfo.nMax= bmp.bmWidth-rect.Width()+10;
  18.                 vinfo.nMin = 0;
  19.                 vinfo.nPos  = 0;
  20.                 vinfo.nTrackPos = 0;
  21.                 vinfo.cbSize = sizeof(vinfo);
  22.                 SetScrollInfo(SB_HORZ,&vinfo);
  23.         }
  24. }
  25. void CDlg::ResizeBmp(double fXRate,double fYRate)
  26. {
  27.         if(!m_hBitmap)return;
  28.         int xpos = GetScrollPos(SB_HORZ);
  29.         if (xpos != 0)
  30.                 ScrollWindow(xpos,0); //水平滚动条归零
  31.         int ypos = GetScrollPos(SB_VERT);
  32.         if (ypos != 0)
  33.                 ScrollWindow(0,ypos);  
  34. //><
  35.         CRect rect;
  36.         GetClientRect(rect);
  37.         CDC* pDC = m_Bmp.GetDC();

  38.         
复制代码
  1. CDC memdc;        
  2.         memdc.CreateCompatibleDC( pDC );
  3.         memdc.SelectObject(m_hBitmap);
  4.         BITMAP bmp;
  5.         GetObject(m_hBitmap,sizeof(bmp),&bmp);
  6.         int nCX= bmp.bmWidth*fXRate;
  7.         int nCY= bmp.bmHeight*fYRate;
  8.         m_Bmp.MoveWindow(rect.left,rect.top,nCX,nCY,true);
  9.         pDC->StretchBlt(rect.left,rect.top,nCX,nCY,&memdc,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY);        
  10.         memdc.DeleteDC();
  11.         m_Bmp.ReleaseDC(pDC);
  12.         
  13. //设置垂直滚动条信息        
  14.         SCROLLINFO vinfo;        
  15.         vinfo.cbSize = sizeof(vinfo);
  16.         vinfo.fMask = SIF_ALL;
  17.         vinfo.nPage = nCY/10;
  18.         vinfo.nMax= nCY-rect.Height()+10;
  19.         vinfo.nMin = 0;
  20.         vinfo.nTrackPos = 0;
  21.         vinfo.nPos = 0;        
  22.         SetScrollInfo(SB_VERT,&vinfo);
  23.         
  24. //设置水平滚动条信息
  25.         vinfo.fMask = SIF_ALL;
  26.         vinfo.nPage = nCX/10;
  27.         vinfo.nMax= nCX-rect.Width()+10;
  28.         vinfo.nMin = 0;
  29.         vinfo.nPos  = 0;
  30.         vinfo.nTrackPos = 0;
  31.         vinfo.cbSize = sizeof(vinfo);
  32.         SetScrollInfo(SB_HORZ,&vinfo);
  33. }
复制代码
  1. void CDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  2. {
  3.         // TODO: Add your message handler code here and/or call default
  4.         int pos,min,max,thumbwidth;

  5.         SCROLLINFO vinfo;
  6.         GetScrollInfo(SB_HORZ,&vinfo);
  7.         
  8.         pos = vinfo.nPos;
  9.         min = vinfo.nMin;
  10.         max = vinfo.nMax;
  11.         thumbwidth = vinfo.nPage;

  12.         switch (nSBCode)
  13.         {
  14.                 case SB_THUMBTRACK: //拖动滚动块
  15.                         ScrollWindow(-(nPos-pos),0);
  16.                         SetScrollPos(SB_HORZ,nPos);
  17.                         break;
  18.                 case SB_LINELEFT : //单击左箭头
  19.                         if (pos != 0)
  20.                         {
  21.                                 ScrollWindow(1,0);
  22.                                 SetScrollPos(SB_HORZ,pos-1);
  23.                         }
  24.                         break;
  25.                 case SB_LINERIGHT: //单击右箭头
  26.                         if (pos+thumbwidth <= max)
  27.                         {
  28.                                 SetScrollPos(SB_HORZ,pos+1);
  29.                                 ScrollWindow(-1,0);        
  30.                         }
  31.                         break;
  32.                 case SB_PAGELEFT: //在滚动块的左方空白滚动区域单击
  33.                         if (pos >= thumbwidth)
  34.                         {
  35.                                 ScrollWindow(thumbwidth,0);
  36.                                 SetScrollPos(SB_HORZ,pos-thumbwidth);
  37.                         }
复制代码
  1. else
  2.                         {
  3.                                 ScrollWindow(pos,0);
  4.                                 SetScrollPos(SB_HORZ,0);
  5.                         }
  6.                         break;
  7.                 case SB_PAGERIGHT: //在滚动块的右方空白滚动区域单击
  8.                         if (pos+thumbwidth <= max-thumbwidth)
  9.                         {
  10.                                 ScrollWindow(-thumbwidth,0);
  11.                                 SetScrollPos(SB_HORZ,pos+thumbwidth);
  12.                         }
  13.                         else
  14.                         {
  15.                                 ScrollWindow(-(max-(pos+thumbwidth)),0);
  16.                                 SetScrollPos(SB_HORZ,max-thumbwidth);
  17.                         }
  18.                         break;
  19.         }
  20.         CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
  21. }
复制代码
篇幅有限更多的的函数体可从例程复制
4.最后是自定义类的使用,在主对话框中添加变量CDlg m_Dlg;拖拽按钮控件IDC_OPEN,滑块控件IDC_SLIDER1,编辑框控件IDC_EDIT1,图片控件IDC_RECT
初始化变量m_Dlg.Create(IDD_DIALOG1,this); CRect rc;GetDlgItem(IDC_RECT)->GetWindowRect(rc);
m_Dlg.MoveWindow(rc);m_Dlg.ShowWindow(SW_SHOW); GetDlgItem(IDC_RECT)->ShowWindow(SW_HIDE);

按钮调用m_Dlg.LoadBmp();实现图片的打开;添加水平滚动条消息OnHScroll()实现图片的缩放;

代码段为
  1. void CGkbc8Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  2. {
  3.         CSliderCtrl *pSlider = (CSliderCtrl *)pScrollBar;
  4.         if(pSlider->GetDlgCtrlID() == IDC_SLIDER1)
  5.         {
  6.                 double fRate = pSlider->GetPos();//默认值为0--100
  7.                 fRate=fRate/10;
  8.                 fRate=fRate==0?0.01:fRate;
  9.                 m_Dlg.ResizeBmp(fRate,fRate);

  10.                 CString s;
  11.                 s.Format("%f",fRate);
  12.                 SetDlgItemText(IDC_EDIT1,s);
  13.         }
  14.         CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
  15. }
复制代码
我们来演示整个功能实现过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:126.上位机VC MFC两种实现图片的自由缩放效果.rar 
文件大小:1.22 MB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索