void CPreviewStatic::OnPaint()
{
CPaintDC dc(this); CRect rect = 0;
GetClientRect(rect); CDC DCMem;
CBitmap MemBitmap;
DCMem.CreateCompatibleDC(&dc);
MemBitmap.CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
DCMem.SelectObject(&MemBitmap);
int rcWidth = rect.Width()-GetSystemMetrics(SM_CXVSCROLL); //去除垂直滚动条后的绘图区宽度
int rcHigth = rect.Height()-GetSystemMetrics(SM_CXHSCROLL); //去除水平滚动条后的绘图区高度
m_imgBk.Draw(DCMem, 0, 0, rcWidth, rcHigth,0, 0, rcWidth, rcHigth); if (m_ImagePre && m_PNGSource)
{
m_PreHorizList = m_PNGSource->GetHorizPointList();//获取编辑区的水平点链表
m_PreVertList = m_PNGSource->GetVertPointList();//竖直链表 DrawOnePreView(DCMem.GetSafeHdc()); //绘制第一幅预览图,
DrawTwoPreView(DCMem.GetSafeHdc()); //第二幅,
DrawThreePreView(DCMem.GetSafeHdc());//第三幅,
}
dc.BitBlt( 0, 0, rcWidth,rcHigth,&DCMem, m_xpAdd, m_ypAdd,SRCCOPY);//????????????????
MemBitmap.DeleteObject();
DCMem.DeleteDC();
}其中m_xpAdd, m_ypAdd,为水平滚动条和竖直滚动条的当前位置。三幅图的相对位置固定
我用这种方式来响应拖动滚动条时的重绘,但有问题,拖动滚动条时新出现的区域为已显示部分的重影。我想知道在显示内存DC时可以选择源的起始位置吗?还是只能从(0,0)开始?
如果不能,有没有什么好的方法可以让三幅图一起随滚动条的移动而显示?
{
CPaintDC dc(this); CRect rect = 0;
GetClientRect(rect); CDC DCMem;
CBitmap MemBitmap;
DCMem.CreateCompatibleDC(&dc);
MemBitmap.CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
DCMem.SelectObject(&MemBitmap);
int rcWidth = rect.Width()-GetSystemMetrics(SM_CXVSCROLL); //去除垂直滚动条后的绘图区宽度
int rcHigth = rect.Height()-GetSystemMetrics(SM_CXHSCROLL); //去除水平滚动条后的绘图区高度
m_imgBk.Draw(DCMem, 0, 0, rcWidth, rcHigth,0, 0, rcWidth, rcHigth); if (m_ImagePre && m_PNGSource)
{
m_PreHorizList = m_PNGSource->GetHorizPointList();//获取编辑区的水平点链表
m_PreVertList = m_PNGSource->GetVertPointList();//竖直链表 DrawOnePreView(DCMem.GetSafeHdc()); //绘制第一幅预览图,
DrawTwoPreView(DCMem.GetSafeHdc()); //第二幅,
DrawThreePreView(DCMem.GetSafeHdc());//第三幅,
}
dc.BitBlt( 0, 0, rcWidth,rcHigth,&DCMem, m_xpAdd, m_ypAdd,SRCCOPY);//????????????????
MemBitmap.DeleteObject();
DCMem.DeleteDC();
}其中m_xpAdd, m_ypAdd,为水平滚动条和竖直滚动条的当前位置。三幅图的相对位置固定
我用这种方式来响应拖动滚动条时的重绘,但有问题,拖动滚动条时新出现的区域为已显示部分的重影。我想知道在显示内存DC时可以选择源的起始位置吗?还是只能从(0,0)开始?
如果不能,有没有什么好的方法可以让三幅图一起随滚动条的移动而显示?
解决方案 »
- bstr的问题
- MFCO42D.DLL 今天看了几个例程都因为这个搞不定!高手帮忙
- 如何给列表框添加水平滚动条
- 有关List Control 控件的问题
- 一个大问题,牛人帮我啊,在线等!!!!!!!!!!!!!!!!!!!(100)
- VC2012建立ATL工程,如何设置组件注册给所有的用户?
- 哪位能借个www.driverdevelop.com的账号给我用一下吗?我想去那里down书.那里注册真麻烦,还要审批.
- 再问一遍!有人回答么?
- 各位高手如何控制电影碟或者卡拉OK碟的左右声道?
- 为什么这些类的够着函数都是私有的?
- 刚接触OpenCV,请教几个问题。
- WriteFile写入不了文件内容...
void CPreviewStatic::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CRect rc = GetImagesRect(); int minpos;
int maxpos;
pScrollBar->GetScrollRange(&minpos, &maxpos);
maxpos = pScrollBar->GetScrollLimit(); int curpos = pScrollBar->GetScrollPos();
int line = max(1, (maxpos-minpos)/10); switch (nSBCode)
{
case SB_LEFT:
curpos = minpos;
break; case SB_RIGHT:
curpos = maxpos;
break; case SB_ENDSCROLL:
break; case SB_LINELEFT:
if (curpos > minpos)
curpos = max(minpos, curpos - line);
break; case SB_LINERIGHT:
if (curpos < maxpos)
curpos = min(maxpos, curpos + line);
break; case SB_PAGELEFT:
if (curpos > minpos)
curpos = max(minpos, curpos - rc.Width());
break; case SB_PAGERIGHT:
if (curpos < maxpos)
curpos = min(maxpos, curpos + rc.Width());
break; case SB_THUMBPOSITION:
curpos = nPos;
break; case SB_THUMBTRACK:
curpos = nPos;
break;
}
pScrollBar->SetScrollPos(curpos);
CStatic::OnHScroll(nSBCode, nPos, pScrollBar);
m_xpAdd = curpos - minpos;
Invalidate();
}这个应该没问题,主要是刷新显示图片的时候有问题,我想直接从内存DC中不停地刷新滚动条变化后的新区域,但好像不行,不知道有没有什么好方法或技巧?