MFC单文档基于CScrollView类显示

今天看到之前老师写的一个单文档项目,看到可以在客户区依附滚动条。所以试了一下。

首先cu'aanch创建一个基于CScrollView类的MFC类。这里我们起名为CShowImage.下图代码是自动生成的。有网友说还要在构造函数声明要不然会报错,我试了一下没有问题,不声明也是可以的。

这样客户区就出现滚动条了,我想将图片在客户区显示,在没有载入图像的时候滑动滚动条报错,调试发现

if(!g_src.data==NUll)
{
....
} //在没有载入图像依然会进入循环,所以我用了
if(!g_src.empty)
{
....
}
我个人理解就是若Mat对象申请了大小,data也会视为有数据。但是empty是看图像矩形阵是否含有数据

但是发现图片在客户区显示不出来,应该是没有进行刷新。

我之前是pView->invalidate(),发现并没有调用ondraw所以用pMain->invalidate(),将整个单文档重绘,调用了ondraw。

可怕的事情发生了,就是图片虽然能显示出来,但是如果我滑动滚动条,图片就消失了,我以为是重绘了,但是调试发现,CDview类中的全局变量g_src中的数据都被清空为零,这我就不明白了,滚动条是控制CShowImage的,但为啥能勾搭上其他类的数据。 不得已我写了下边的代码实现了,图片的显示。

void CShowImage::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO:  在此添加绘制代码
	//pDC->TextOut(100, 700, _T("0度图像"));
	
	CRect rect;
	GetClientRect(&rect);

	CMainFrame *pMain = (CMainFrame*)theApp.m_pMainWnd; //m_pMainWnd 返回CWnd*
	CDview *pview = (CDview*)pMain->GetActiveView();
	int heitht, width;
 	if (!pview->g_src.empty())
 	{
 		pview->g_src.copyTo(temp);
 		
 	}
	
	heitht = temp.rows;
	width = temp.cols;
	
	if (temp.cols > 512 || temp.rows > 512)
	{
		resize(temp, temp, Size(512, 512));
		pview->MatToImage(temp, g_img);
	}
	else
	{
		pview->MatToImage(temp, g_img);
	}
	
	if (!temp.empty() )
	{
		g_img.Draw(pDC->GetSafeHdc(), 0, 0);
		g_img.Draw(pDC->GetSafeHdc(), width + 100, 0);
		//		pview->g_img.Draw(pDC->GetSafeHdc(), width + 100, 0);
	}
}

 

  • 0
    点赞
  • 2
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值