当前位置:C++技术网 > 资讯 > 浏览完整图片的滑动功能的小程序

浏览完整图片的滑动功能的小程序

更新时间:2015-12-30 19:34:31浏览次数:1+次

当我们浏览图片的时候,有时候对话框的长宽与图片的大小不一致,导致不能完整的看到图片。因此,我们写个程序来完善这个功能。首先创建一个对话框的工程ScrollImage,然后我们在创建一个对话框资源IDC_DIALOG_IMAGEPANEL,在这个对话框资源上,我们添加滚动轮。将这个对话框作为图片的容器。接着我们在主对话框上添加图片控件,这个图片控件将作为容器控件的父窗口,就能显示图片了。再加上一个框架控件来承接图片空间和容器控件。

我们为新建的对话框即容器控件来创建对话框类CImagePanel,同时写入代码,实现水平垂直滚动轮。对于滚动轮的实现,请看《MFC实现设置水平,垂直滚动轮》《MFC深入理解实现滚动轮》两篇文章,具体讲解了这个功能的实现。
我们这个新建的对话框的类的实现浏览图片的滑动功能。
接下来,我们为按钮控件进行消息响应:

void CScrollImageDlg::OnBrowse() 
{
	CFileDialog flDlg(TRUE, "", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
						"位图文件|*.bmp||");	//定义文件打开对话框
	CString szText;
	if (flDlg.DoModal() == IDOK)
	{
		szText = flDlg.GetPathName();
		m_FileName.SetWindowText(szText);
		if (m_pBmp != NULL)
		{
			delete m_pBmp;
			m_pBmp = NULL;
		}
		m_pBmp = Bitmap::FromFile(szText.AllocSysString());
		Color bkClr(0, 0, 255);
		HBITMAP hBmp;
		m_pBmp->GetHBITMAP(bkClr, &hBmp);
		m_Image.SetBitmap(hBmp);
		szText.ReleaseBuffer();

		CRect bmpRC,wndRC;
		m_ImagePanel.GetClientRect(wndRC);
		m_Image.GetClientRect(bmpRC);

		m_ImagePanel.OnHScroll(SB_LEFT, 1, NULL); 
		m_ImagePanel.OnVScroll(SB_LEFT, 1, NULL); 

		m_ImagePanel.SetScrollRange(SB_VERT, 0, bmpRC.Height()-wndRC.Height());
		m_ImagePanel.SetScrollRange(SB_HORZ, 0, bmpRC.Width()-wndRC.Width());
	}
}
在ScrollImageDlg的头文件中,定义变量:
CImagePanel m_ImagePanel;////新定义建对话框类的变量
	Bitmap *m_pBmp;
最后在对话框的初始化函数中,写入代码:
//创建图像容器控件
	m_ImagePanel.Create(IDD_IMAGEPANEL_DIALOG,this);
	CRect rcClient,rcFrame;
	//获取容器控件的客户区域
	m_ImagePanel.GetClientRect(rcClient);
	//获取框架控件的区域
	m_Panel.GetClientRect(rcFrame);
	m_Panel.MapWindowPoints(this,rcFrame);
	//设置容器控件显示的位置
	m_ImagePanel.MoveWindow(rcFrame);
	m_ImagePanel.ShowWindow(SW_SHOW);
	//设置图像控件的父窗口为容器控件
	m_Image.SetParent(&m_ImagePanel);
	CRect rcBmp;
	//设置图像控件的位置
	m_Image.GetClientRect(rcBmp);
	m_Image.MoveWindow(0,0,rcBmp.Width(),rcBmp.Height());
在CImagePanel.cpp中写入代码,即我们新建的对话框类:
BOOL CImagePanel::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	SCROLLINFO siInfo;
	//获取垂直滚动条的滚动信息
	GetScrollInfo(SB_VERT,&siInfo);
	int nMin,nMax,nThumbWidth;
	//获取垂直滚动条的滚动范围
	nMin = siInfo.nMin;
	nMax = siInfo.nMax;
	//获取滚动块大小
	nThumbWidth = siInfo.nPage;
	//获取垂直滚动条当前滚动位置
	int nPos = GetScrollPos(SB_VERT);
	if (zDelta > 0)	//判断鼠标滚轮的滚动距离,大于零表示向前滚动,小于零表示向后滚动
	{
		if (nPos == 0)
			return TRUE;
		//设置垂直滚动条的滚动位置
		SetScrollPos(SB_VERT,nPos-6);
		//滚动窗口
		ScrollWindow(0,6);
	}
	else		//向后滚动
	{
		if ((nPos+nThumbWidth >= nMax))
			return TRUE;
		//设置垂直滚动条的滚动位置
		SetScrollPos(SB_VERT,nPos+6);
		//滚动窗口
		ScrollWindow(0,-6);
	}
	return TRUE;//CDialog::OnMouseWheel(nFlags, zDelta, pt);	
//	return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}

void CImagePanel::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int nCurpos,nMin,nMax,nThumbWidth;
	SCROLLINFO siInfo;
	GetScrollInfo(SB_VERT,&siInfo);
	nCurpos = siInfo.nPos;
	nMin = siInfo.nMin;
	nMax = siInfo.nMax;
	nThumbWidth = siInfo.nPage;
	switch (nSBCode)
	{
	case SB_THUMBTRACK:
		nCurpos = GetScrollPos(SB_VERT);
		ScrollWindow(0,-(nPos-nCurpos));
		SetScrollPos(SB_VERT,nPos);	
	break;

	case SB_LINELEFT:
		nCurpos = GetScrollPos(SB_VERT);
		SetScrollPos(SB_VERT,nCurpos-1);
		if (nCurpos !=0)
			ScrollWindow(0,1);
	break;
	case SB_LINERIGHT:
		nCurpos = GetScrollPos(SB_VERT);
		SetScrollPos(SB_VERT,nCurpos+1);
		if (nCurpos+nThumbWidth < nMax)
			ScrollWindow(0,-1);	
	break;
	case SB_PAGELEFT: //在滚动块的上方空白滚动区域单击,增量为6
		SetScrollPos(SB_VERT,nCurpos-6);
		if (nCurpos+nThumbWidth >0)
			ScrollWindow(0,6);
	break;
	case SB_PAGERIGHT: //在滚动块的下方空白滚动区域单击,增量为6
		SetScrollPos(SB_VERT,nCurpos+6);
		if (nCurpos+nThumbWidth < nMax)
			ScrollWindow(0,-6);
	break;
	case SB_LEFT:	
		SetScrollPos(SB_VERT,0);
		ScrollWindow(0,nCurpos);
	break;
	}	
	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CImagePanel::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int nCurpos,nMin,nMax,nThumbWidth;
	//定义滚动信息
	SCROLLINFO siInfo;
	//获取水平滚动条的滚动信息
	GetScrollInfo(SB_HORZ,&siInfo);
	//获取当前的滚动位置
	nCurpos = siInfo.nPos;
	//获取滚动范围
	nMin = siInfo.nMin;
	nMax = siInfo.nMax;
	//获取滚动块大小
	nThumbWidth = siInfo.nPage;
	switch (nSBCode)
	{
	break;
	case SB_THUMBTRACK:		//拖动滚动块
		//滚动窗口到指定的位置
		ScrollWindow(-(nPos-nCurpos),0);
		//设置滚动条新的位置
		SetScrollPos(SB_HORZ,nPos);	
	break;
	case SB_LINELEFT : //单击左箭头
		SetScrollPos(SB_HORZ,nCurpos-1);
		if (nCurpos != 0)
			ScrollWindow(1,0);
	break;
	case SB_LINERIGHT: //单击右箭头
		SetScrollPos(SB_HORZ,nCurpos+1);
		if (nCurpos+nThumbWidth < nMax)
			ScrollWindow(-1,0);	
	break;
	case SB_PAGELEFT: //在滚动块的左方空白滚动区域单击,增量为6
		SetScrollPos(SB_HORZ,nCurpos-6);
		if (nCurpos+nThumbWidth >0)
			ScrollWindow(6,0);
	break;
	case SB_PAGERIGHT: //在滚动块的右方空白滚动区域单击,增量为6
		SetScrollPos(SB_HORZ,nCurpos+6);
		if (nCurpos+nThumbWidth <nMax)
			ScrollWindow(-6,0);
	break;
	case SB_LEFT:	
		SetScrollPos(SB_HORZ,0);
		ScrollWindow(nCurpos,0);
	break;
	}	
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
代码实现:

可能你看的还是比较模糊,有不懂得,我们可以讨论,欢迎哦!