当我们浏览图片的时候,有时候对话框的长宽与图片的大小不一致,导致不能完整的看到图片。因此,我们写个程序来完善这个功能。首先创建一个对话框的工程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);
}
代码实现:
可能你看的还是比较模糊,有不懂得,我们可以讨论,欢迎哦!