滚动条设置有关问题的解决_第1页
滚动条设置有关问题的解决_第2页
滚动条设置有关问题的解决_第3页
滚动条设置有关问题的解决_第4页
滚动条设置有关问题的解决_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计划完成介绍本周计划完成工作【1】项,实际完成【1】项,月计划进度比例【80%】。本周出勤【4】天。下周计划【1】项。(11月)月目标 NO.计划内容完成情况自评老师评价第1周11月2-8日1VC的对话框显示拼接后的图像(不使用opencv的imshow函数显示图像),并提供旋转按钮、缩放按钮完成B(是否达到预期)2逐步了解MFC框架,并了解Windows GDI绘图的基本原理。完成B第2周11月9-15日1在MFC对话框中实现图片的旋转,并解决无法旋转尺寸过大图像的情况完成B2 解决图片放大超出图片控件的问题完成(但存在问题)B3为图片显示空间增添滚动条,实现图片不压扁显示完成B4

2、优化程序,排除内存泄漏完成B第3周11月16-22日1图像上画方框,方框可调整大小和位置并抠取图像完成 B2工作展示1. SetScrollRange()、SetScrollPos()、GetScrollRange()、GetScrollPos()和SetScrollInfo()、GetScrollInfo()两种思路实现窗口滚动显示图片代码实现及其两者优劣比较总是出现的错误SetScrollRange()、SetScrollPos()、GetScrollRange()、GetScrollPos()的代码实现设置滚动条的滚动范围和初始位置m_MinHeight = 0;m_MaxHeight

3、= m_img->height-Sheight;m_MinWidth = 0;m_MaxWidth = m_img->width - Swidth;/因为nPos其实返回的是顶部的坐标所以要减去一辈控件的高度或宽度m_ScrollbarCtl.SetScrollRange(m_MinHeight, m_MaxHeight);m_ScrollbarCtl.SetScrollPos(m_MinHeight);m_ScrollbarHor.SetScrollRange(m_MinWidth, m_MaxWidth);m_ScrollbarHor.SetScrollPos(m_MinWid

4、th);显示图片的函数void CgunDlg:PicShow() IplImage* dstImg = cvCreateImage(cvSize(Swidth, Sheight),IPL_DEPTH_8U, 3);cvSetImageROI(m_img, cvRect(m_pointx, m_pointy, Swidth, Sheight);/cvCopy(m_img, dstImg);cvResetImageROI(m_img);CvvImage cimg;cimg.CopyOf(dstImg);cimg.DrawToHDC(hDC, &rect);滚动响应函数声明void Cgu

5、nDlg:OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)/ TODO: 在此添加消息处理程序代码和/或调用默认值/ TODO: Add your message handler code here and/or call defaultif (NULL=hDC)MessageBox(_T("请加载图片");elseint iNowPos;switch (nSBCode)case SB_THUMBTRACK: /拖动滑块m_ScrollbarCtl.SetScrollPos(nPos);/重新加载图片m_p

6、ointy = nPos;PicShow();case SB_LINEDOWN: /单击滚动条向下的箭头iNowPos = m_ScrollbarCtl.GetScrollPos();iNowPos = iNowPos + 1;if (iNowPos > m_MaxHeight)iNowPos = m_MaxHeight;m_ScrollbarCtl.SetScrollPos(iNowPos);m_pointy = iNowPos;/重新加载图片PicShow();break;case SB_LINEUP: /单击滚动条向上的箭头iNowPos = m_ScrollbarCtl.GetS

7、crollPos();iNowPos = iNowPos - 1;if (iNowPos < m_MinHeight)iNowPos = m_MinHeight;m_ScrollbarCtl.SetScrollPos(iNowPos);m_pointy = iNowPos;/重新加载图片PicShow();break;case SB_PAGEDOWN: /单击箭头与滚块之间的区域iNowPos = m_ScrollbarCtl.GetScrollPos();iNowPos = iNowPos + 3;if (iNowPos > m_MaxHeight)iNowPos = m_Max

8、Height;m_ScrollbarCtl.SetScrollPos(iNowPos);m_pointy = iNowPos;/重新加载图片PicShow();break;case SB_PAGEUP: /单击箭头与滚块之间的区域iNowPos = m_ScrollbarCtl.GetScrollPos();iNowPos = iNowPos - 3;if (iNowPos < m_MinHeight)iNowPos = m_MinHeight;m_ScrollbarCtl.SetScrollPos(iNowPos);m_pointy = iNowPos;/重新加载图片PicShow()

9、;break; CDialogEx:OnVScroll(nSBCode, nPos, pScrollBar);SetScrollInfo()、GetScrollInfo()代码实现初始化SCROLLINFO ver;/设置垂向的滚动条ZeroMemory(&ver, sizeof(ver);/0填充的地址和大小ver.cbSize = sizeof(ver);ver.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;ver.nMax = m_MaxHeight;ver.nMin = 0;ver.nPage = (m_MaxHeight+Sheight) /

10、100;ver.nPos = 0;m_ScrollbarCtl.SetScrollInfo(&ver);/设置水平的滚动条ZeroMemory(&ver, sizeof(ver);/0填充的地址和大小ver.cbSize = sizeof(ver);ver.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;ver.nMax = m_MaxWidth;ver.nMin = 0;ver.nPage = (m_MaxWidth+Swidth) / 100;ver.nPos = 0;m_ScrollbarHor.SetScrollInfo(&ver)

11、;PicShow();显示函数不变滚动响应函数void CgunDlg:OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)/ TODO: 在此添加消息处理程序代码和/或调用默认值/ TODO: Add your message handler code here and/or call defaultif (NULL=hDC)MessageBox(_T("请加载图片");elseint iNowPos;switch (nSBCode)SCROLLINFO ver;case SB_THUMBTRACK: /拖动

12、滑块/m_ScrollbarCtl.SetScrollPos(nPos);ZeroMemory(&ver, sizeof(ver);ver.cbSize = sizeof(ver);ver.fMask = SIF_POS;ver.nPos = nPos;m_ScrollbarCtl.SetScrollInfo(&ver);/重新加载图片m_pointy = nPos;PicShow();case SB_LINEDOWN: /单击滚动条向下的箭头ZeroMemory(&ver, sizeof(ver);ver.cbSize = sizeof(ver);m_Scrollba

13、rCtl.GetScrollInfo(&ver, SIF_POS);iNowPos = ver.nPos;iNowPos = iNowPos + 1;if (iNowPos > m_MaxHeight)iNowPos = m_MaxHeight;m_ScrollbarCtl.SetScrollPos(iNowPos);m_pointy = iNowPos;/重新加载图片PicShow();break;case SB_LINEUP: /单击滚动条向上的箭头ZeroMemory(&ver, sizeof(ver);ver.cbSize = sizeof(ver);m_Scro

14、llbarCtl.GetScrollInfo(&ver, SIF_POS);iNowPos = ver.nPos;iNowPos = iNowPos - 1;if (iNowPos < m_MinHeight)iNowPos = m_MinHeight;m_ScrollbarCtl.SetScrollPos(iNowPos);m_pointy = iNowPos;/重新加载图片PicShow();break;case SB_PAGEDOWN: /单击箭头与滚块之间的区域ZeroMemory(&ver, sizeof(ver);ver.cbSize = sizeof(ver

15、);m_ScrollbarCtl.GetScrollInfo(&ver, SIF_POS);iNowPos = ver.nPos;iNowPos = iNowPos + 3;if (iNowPos > m_MaxHeight)iNowPos = m_MaxHeight;m_ScrollbarCtl.SetScrollPos(iNowPos);m_pointy = iNowPos;/重新加载图片PicShow();break;case SB_PAGEUP: /单击箭头与滚块之间的区域ZeroMemory(&ver, sizeof(ver);ver.cbSize = size

16、of(ver);m_ScrollbarCtl.GetScrollInfo(&ver, SIF_POS);iNowPos = ver.nPos;iNowPos = iNowPos - 3;if (iNowPos < m_MinHeight)iNowPos = m_MinHeight;m_ScrollbarCtl.SetScrollPos(iNowPos);m_pointy = iNowPos;/重新加载图片PicShow();break; CDialogEx:OnVScroll(nSBCode, nPos, pScrollBar);case SB_THUMBTRACK: /拖动滑块

17、ZeroMemory(&ver, sizeof(ver);ver.cbSize = sizeof(ver);ver.fMask = SIF_TRACKPOS;m_Scrh.GetScrollInfo(&ver);m_pointx =ver.nTrackPos;ZeroMemory(&ver, sizeof(ver);ver.cbSize = sizeof(ver);ver.fMask = SIF_POS;ver.nPos = m_pointx;m_Scrh.SetScrollInfo(&ver);/重新加载图片PicShow();区别:OnHScroll和OnV

18、Scroll只提供16位的位置数据。GetScrollInfo和SetScrollInfo提供32位的滚动条位置数据。因此,一个应用程序在处理GetScrollInfo或SetScrollInfo时,可以调用GetScrollInfo来获取32位的滚动条位置数据。用GetScrollInfo支持长整数,弃用GetScrollPos,这是MSDN中对32程序的建议,所以尽量运用后者。否则当你显示超大图片时就会遇到错误问题的解决关于滚动条设置的研究滚动条的设置看似简单其实还是很需要琢磨的,首先需要了解到滚动条的页尺寸nPage(为什么用SCROLLINFO结构来实现我的上篇博客已经说明白了)的含义

19、,它就是指你的PIC空间的大小,这里假设空间大小为100*200,你应该设置垂直滚动条的nPage=200;然后需要明白滚动范围,这点不要异想天开。当然说到范围脑子一闪而过的肯定是图片的大小,假设图片的大小为1000*2000,那垂直滚动条的滚动范围是否就是02000呢?错!别忘记当滚动条位置nPos为0时,他显示了图片0200的大小,所以显示到18002000的部分nPos只需设为1800,即滚动范围的最大值为图片尺寸-控件尺寸,需要注意的是图片尺寸很少是规规矩矩的整数,所以难免会有些小问题,所以这里最好设置滚动范围的最大值为图片尺寸-控件尺寸-1,否则会产生R6010的错误但是请不要忘记我

20、们设置了滚动条的大小为一倍的图片控件大小所以上面的方法在SetScrollRange()、SetScrollPos()、GetScrollRange()、GetScrollPos()是没问题但是用了SetScrollInfo()、GetScrollInfo(就会出现问题,这就是因为这时候滚动条的大小为一倍的图片控件大小,所以滚动条在滚动范围的最大值=图片尺寸-控件尺寸-滚动条尺寸=,=图片尺寸-2*控件尺寸,所以为了能显示图片的全部必须将滚动范围设为图片尺寸,这样问题就解决了,但是对于拖动滚动条使这个样子,对于点击向下向上按键可不能这样,因为它主要是受nPos限制的,所以,nPos还是应该小于

21、图片尺寸-控件尺寸示意图滚动范围0到图片大小减去一倍控件大小0到图片大小减去二倍控件大小滚动条终止位置滚动条起始位置代码如下初始化ZeroMemory(&ver, sizeof(ver);/0填充的地址和大小ver.cbSize = sizeof(ver);ver.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;ver.nMax = m_maxv-1;ver.nMin = 0;ver.nPage = Sheight;ver.nPos = 0;m_Scrv.SetScrollInfo(&ver); 响应函数SCROLLINFO ver;case SB

22、_THUMBTRACK: /拖动滑块ZeroMemory(&ver, sizeof(ver);ver.cbSize = sizeof(ver);ver.fMask = SIF_TRACKPOS;m_Scrh.GetScrollInfo(&ver);m_pointx =ver.nTrackPos;ZeroMemory(&ver, sizeof(ver);ver.cbSize = sizeof(ver);ver.fMask = SIF_POS;ver.nPos = m_pointx;m_Scrh.SetScrollInfo(&ver);PicShow();case

23、SB_LINEDOWN: /单击滚动条向下的箭头ZeroMemory(&ver, sizeof(ver);ver.cbSize = sizeof(ver);m_Scrh.GetScrollInfo(&ver, SIF_POS);iNowPos = ver.nPos;iNowPos = iNowPos + 10;if (iNowPos > m_maxh - Swidth)iNowPos = m_maxh - Swidth;m_Scrh.SetScrollPos(iNowPos);m_pointx = iNowPos;/重新加载图片PicShow();break;第一个算法的

24、研究程序实现float fSrcX1, fSrcY1, fSrcX2, fSrcY2, fSrcX3, fSrcY3, fSrcX4, fSrcY4;fSrcX1 = (float)(-(oldWidth) / 2);fSrcY1 = (float)(oldHeight) / 2);/第二象限fSrcX2 = (float)(oldWidth ) / 2);fSrcY2 = (float)(oldHeight) / 2);/第一象限fSrcX3 = (float)(-(oldWidth) / 2);fSrcY3 = (float)(-(oldHeight) / 2);/第四象限fSrcX4 =

25、 (float)(oldWidth) / 2);fSrcY4 = (float)(-(oldHeight) / 2);/第三象限/ 旋转后四个角的坐标(以图像中心为坐标系原点) float fDstX1, fDstY1, fDstX2, fDstY2, fDstX3, fDstY3, fDstX4, fDstY4;float theta = 0.5*CV_PI*direction;fDstX1 = cos(theta) * fSrcX1 + sin(theta) * fSrcY1;fDstY1 = -sin(theta) * fSrcX1 + cos(theta) * fSrcY1;fDstX

26、2 = cos(theta) * fSrcX2 + sin(theta) * fSrcY2;fDstY2 = -sin(theta) * fSrcX2 + cos(theta) * fSrcY2;fDstX3 = cos(theta) * fSrcX3 + sin(theta) * fSrcY3;fDstY3 = -sin(theta) * fSrcX3 + cos(theta) * fSrcY3;fDstX4 = cos(theta) * fSrcX4 + sin(theta) * fSrcY4;fDstY4 = -sin(theta) * fSrcX4 + cos(theta) * fSr

27、cY4;/新的宽度和高度int newWidth = (max(fabs(fDstX4 - fDstX1), fabs(fDstX3 - fDstX2) );int newHeight = (max(fabs(fDstY4 - fDstY1), fabs(fDstY3 - fDstY2) );IplImage*dst = cvCreateImage(cvSize(newWidth, newHeight), m_img->depth, m_img->nChannels);/见旋转原理,行列式中第三行第一二列float dx = -0.5*newWidth*cos(theta) - 0

28、.5*newHeight*sin(theta) + 0.5*oldWidth;float dy = 0.5*newWidth*sin(theta) - 0.5*newHeight*cos(theta) + 0.5*oldHeight;/读取新图片每一个点for (int height = 0; height<newHeight; height+)uchar*ptrNow = (uchar*)(dst->imageData + height*dst->widthStep);/指向图片的第height行第0列for (int width = 0; width<newWidt

29、h; width+)int x = float(width)*cos(theta) + float(height)*sin(theta) + dx;int y = float(-width)*sin(theta) + float(height)*cos(theta) + dy;/对应原始图像的点uchar*ptrOld = (uchar*)(m_img->imageData + y*m_img->widthStep);/指向原始图像的第y行第0列if (x<0) | (x >= oldWidth) | (y<0) | (y >= oldHeight)/判断是否是没有图像的区域if (m_img->nChannels = 3)/判断图像是几通道图像ptrNow3 * width + 1 = 0;ptrNow3 * width + 2 = 0;ptrNow3 * width + 3 = 0;else if (m_img->nChannels = 1)ptrNowwidth = 0;elseif (m_img->nChannels = 3)ptrNow3 * width + 1 = ptrOld3 * x + 1;ptrNow3 * width + 2 = pt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论