图像平滑滚动效果的VC实现
前言:
在图像的编程中,经常会遇到这样一种情况,在有限的区域中显示了一幅大图,这时要浏览图像的各个部分,这就需要用到图像的滚动。关于它的实现,许多书都有提及,但其中的关键点和难点,即拖动中的刷新和闪烁问题,却讲述的不多,这也是我写本文的目的所在,下面我将详细分析实现方法。
实现效果及实现方法:
在图像区域中按下鼠标左键,可拖动图像在某一有限区域中任意滚动。
方法为 :拖动时计算上次与本次的偏移,然后将图像显示的起始点进行变化并刷新图像区域。
实现部分:
第一步:响应WM_LBUTTONDOWN 消息,记录按下开始拖动的起始位置。
void CWingImgDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_lPicOldLeft = point.x;
m_lPicOldTop = point.y;
CDialog::OnLButtonDown(nFlags, point);
}
第二步:响应WM_MOUSEMOVE 消息,实现滚动。
void CWingImgDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//如果鼠标按下
if( (nFlags & MK_LBUTTON) == MK_LBUTTON )
{
m_lPicNewLeft = point.x;
m_lPicNewTop = point.y;
DWORD dwLRShift = m_lPicNewLeft - m_lPicOldLeft;
DWORD dwTBShift = m_lPicNewTop - m_lPicOldTop;
//改变图像显示的起始点
m_lPicLeft = m_lPicLeft - dwLRShift;
m_lPicTop = m_lPicTop - dwTBShift;
//判断边界的语句,省去。
m_lPicOldLeft = m_lPicNewLeft;
m_lPicOldTop = m_lPicNewTop;