今天看到之前老师写的一个单文档项目,看到可以在客户区依附滚动条。所以试了一下。
首先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);
}
}