MFC用CButton实现带滚动条的图片显示控件,无须用CScrollBar辅助实现。
2011-06-23 21:33
1406 查看
我们知道MFC种的Picture控件基本上就是CStatic,而CStatic控件通过ShowScrollBar函数只可以使滚动条现实出来,但是不可以拖动,所以想只用CStatic控件实现大图片的现实并带有进度条是不容易实现的,然而我们又知道CButton控件的滚动条是可以拖动的,所以我们可以只通过CButton控件来实现我们这种想法,而不用另外添加CScrollBar控件。
要想实现在CButton上实现带滚动条的图片显示控件,首先要重载CButton类,我用的重载类名字是CButtonPic,在DrawItem函数当中我们实现在CButton上画图操作即可,我做出来的效果图如下所示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/30/3be6b87ba83fd843518dd093ccf2e55a.gif)
另外滚动条的实现直接调用ShowScrollBar函数来显示滚动条,通过SetScrollRange来设置最大和最小可以滚动到的位置,通过SetScrollInfo函数来设置滚动条的长度。
拖动滚动条的实现图片的区域显示,通过在OnVScroll和OnHScroll消息函数当中实现。
CButtonPic类中主要的实现代码如下:
(1) 图片显示函数:
void CButtonPic::DarwPic()
{
CDC* pDC = this->GetDC();
CRect rc;
this->GetClientRect(&rc);
CBitmap cbmp;
BITMAP bm;
cbmp.LoadBitmap(m_uiSourcePic);
cbmp.GetBitmap(&bm);
CDC dcImage;
dcImage.CreateCompatibleDC(pDC);
dcImage.SelectObject(&cbmp);
pDC->StretchBlt(0,0,rc.Width(),rc.Height(), &dcImage,m_nHorzPos ,m_nVertPos,rc.Width),rc.Height),SRCCOPY);
}
(2) 滚动条消息函数:
void CButtonPic::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch(nSBCode)
{
case SB_LEFT:
m_nVertPos = 0;
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
case SB_LINELEFT:
case SB_PAGELEFT:
m_nVertPos -= m_nOneStep;
if(m_nVertPos<0)
{
m_nVertPos = 0;
}
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
case SB_LINERIGHT:
case SB_PAGERIGHT:
m_nVertPos += m_nOneStep;
if(m_nVertPos>m_nVertMaxSize)
{
m_nVertPos = m_nVertMaxSize;
}
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
case SB_RIGHT:
m_nVertPos = m_nVertMaxSize;
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
m_nVertPos = nPos;
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
default:
break;
}
CButton::OnVScroll(nSBCode, nPos, pScrollBar);
}
(3)CButton初始化函数
void CButtonPic::InitPic(int nStep,UINT nSourcePic)
{
CBitmap cbmp;
BITMAP bm;
CRect rc;
LPSCROLLINFO lpsi;
lpsi = new SCROLLINFO;
this->GetClientRect(&rc);
cbmp.LoadBitmap(nSourcePic);
cbmp.GetBitmap(&bm);
m_nHorzMaxSize = bm.bmWidth;
m_nVertMaxSize = bm.bmHeight;
m_nHorzPageSize = rc.Width();
m_nVertPageSize = rc.Height();
m_nOneStep = nStep;
m_nHorzPos = 0;
m_nVertPos = 0;
this->SetScrollRange( SB_HORZ,0,m_nHorzMaxSize);
this->SetScrollRange( SB_VERT,0,m_nVertMaxSize);
this->GetScrollInfo(SB_HORZ,lpsi);
lpsi->nPage = m_nHorzPageSize;
this->SetScrollInfo(SB_HORZ,lpsi);
this->GetScrollInfo(SB_VERT,lpsi);
lpsi->nPage = m_nVertPageSize;
this->SetScrollInfo(SB_VERT,lpsi);
m_uiSourcePic = nSourcePic;
}
另外,有时候我们想让滚动条一直显示,但是,我们将进度条的长度设置到最大值时,滚动条会自动消失,此时我们可以通过 SetScrollInfo(SB_VERT,lpsi)函数将lpsi中的nPage设置为10000(一个很大的值),再通过SetScrollRange函数将最小可拖动值设置为0,最大值设置为10000,这样滚动条就可以实现一直显示了。
我的工程文件我已经传到资源库上了,在http://download.csdn.net/source/3390229可以下载到。
要想实现在CButton上实现带滚动条的图片显示控件,首先要重载CButton类,我用的重载类名字是CButtonPic,在DrawItem函数当中我们实现在CButton上画图操作即可,我做出来的效果图如下所示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/30/3be6b87ba83fd843518dd093ccf2e55a.gif)
另外滚动条的实现直接调用ShowScrollBar函数来显示滚动条,通过SetScrollRange来设置最大和最小可以滚动到的位置,通过SetScrollInfo函数来设置滚动条的长度。
拖动滚动条的实现图片的区域显示,通过在OnVScroll和OnHScroll消息函数当中实现。
CButtonPic类中主要的实现代码如下:
(1) 图片显示函数:
void CButtonPic::DarwPic()
{
CDC* pDC = this->GetDC();
CRect rc;
this->GetClientRect(&rc);
CBitmap cbmp;
BITMAP bm;
cbmp.LoadBitmap(m_uiSourcePic);
cbmp.GetBitmap(&bm);
CDC dcImage;
dcImage.CreateCompatibleDC(pDC);
dcImage.SelectObject(&cbmp);
pDC->StretchBlt(0,0,rc.Width(),rc.Height(), &dcImage,m_nHorzPos ,m_nVertPos,rc.Width),rc.Height),SRCCOPY);
}
(2) 滚动条消息函数:
void CButtonPic::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch(nSBCode)
{
case SB_LEFT:
m_nVertPos = 0;
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
case SB_LINELEFT:
case SB_PAGELEFT:
m_nVertPos -= m_nOneStep;
if(m_nVertPos<0)
{
m_nVertPos = 0;
}
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
case SB_LINERIGHT:
case SB_PAGERIGHT:
m_nVertPos += m_nOneStep;
if(m_nVertPos>m_nVertMaxSize)
{
m_nVertPos = m_nVertMaxSize;
}
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
case SB_RIGHT:
m_nVertPos = m_nVertMaxSize;
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
m_nVertPos = nPos;
this->SetScrollPos(SB_VERT,m_nVertPos);
DarwPic();
break;
default:
break;
}
CButton::OnVScroll(nSBCode, nPos, pScrollBar);
}
(3)CButton初始化函数
void CButtonPic::InitPic(int nStep,UINT nSourcePic)
{
CBitmap cbmp;
BITMAP bm;
CRect rc;
LPSCROLLINFO lpsi;
lpsi = new SCROLLINFO;
this->GetClientRect(&rc);
cbmp.LoadBitmap(nSourcePic);
cbmp.GetBitmap(&bm);
m_nHorzMaxSize = bm.bmWidth;
m_nVertMaxSize = bm.bmHeight;
m_nHorzPageSize = rc.Width();
m_nVertPageSize = rc.Height();
m_nOneStep = nStep;
m_nHorzPos = 0;
m_nVertPos = 0;
this->SetScrollRange( SB_HORZ,0,m_nHorzMaxSize);
this->SetScrollRange( SB_VERT,0,m_nVertMaxSize);
this->GetScrollInfo(SB_HORZ,lpsi);
lpsi->nPage = m_nHorzPageSize;
this->SetScrollInfo(SB_HORZ,lpsi);
this->GetScrollInfo(SB_VERT,lpsi);
lpsi->nPage = m_nVertPageSize;
this->SetScrollInfo(SB_VERT,lpsi);
m_uiSourcePic = nSourcePic;
}
另外,有时候我们想让滚动条一直显示,但是,我们将进度条的长度设置到最大值时,滚动条会自动消失,此时我们可以通过 SetScrollInfo(SB_VERT,lpsi)函数将lpsi中的nPage设置为10000(一个很大的值),再通过SetScrollRange函数将最小可拖动值设置为0,最大值设置为10000,这样滚动条就可以实现一直显示了。
我的工程文件我已经传到资源库上了,在http://download.csdn.net/source/3390229可以下载到。
相关文章推荐
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- opencv学习笔记(二)vs2010+opencv2.3.1 mfc的实现---利用图片控件显示
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- MFC实现picture控件显示jpg图片文件
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- VC/MFC加滚动条显示大图片SetScrollRange()、SetScrollInfo()两种思路实现及其两者优劣比较
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- CButton控件:mfc自绘按钮类,1张图片显示多种状态的方法
- MFC利用CImage类将图片显示到Picture控件上