CFormView滚动的时候将如何影响View的重绘? 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 当你的窗口滚动后,SetViewportOrg会被调用,从而导致你窗口的视图的座标原点被移动简单的说视图类的Window是个大矩形,而其view是一个在大矩形上移动的小矩形,只有在小矩形内部的图像才能被看见。滚动视窗,就是移动那个小矩形 那如何在发生滚动之前截获滚动消息,然后将view画成黑色呢? 正解。响应WM_HSCROLL或者WM_VSCROLL 响应WM_HSCROLL或者WM_VSCROLL这两个事件 void CPreView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default si.cbSize = sizeof(si); //SCROLLINFO si; si.fMask = SIF_ALL; GetScrollInfo(SB_HORZ, &si) ; int iHorzPos = si.nPos ; switch(nSBCode) { case SB_LINELEFT: si.nPos -= 15; break; case SB_LINERIGHT: si.nPos += 15; break; case SB_PAGELEFT: si.nPos -= si.nPage; break; case SB_PAGERIGHT: si.nPos += si.nPage; break; case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; } si.fMask = SIF_POS ; SetScrollInfo(SB_HORZ, &si, TRUE); GetScrollInfo(SB_HORZ, &si); if (si.nPos != iHorzPos) { xPt += si.nPos - iHorzPos; //int xPt; ScrollWindow(iHorzPos - si.nPos, 0, NULL, NULL); UpdateWindow(); } CDialog::OnHScroll(nSBCode, nPos, pScrollBar);}void CPreView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default si.cbSize = sizeof (si) ; si.fMask = SIF_ALL ; GetScrollInfo(SB_VERT, &si); int iVertPos = si.nPos ; switch(nSBCode) { case SB_TOP: si.nPos = si.nMin; break; case SB_BOTTOM: si.nPos = si.nMax; break; case SB_LINEUP: si.nPos -= 15; break; case SB_LINEDOWN: si.nPos += 15; break; case SB_PAGEUP: si.nPos -= si.nPage; break; case SB_PAGEDOWN: si.nPos += si.nPage; break; case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; } si.fMask = SIF_POS ; SetScrollInfo(SB_VERT, &si, TRUE) ; GetScrollInfo(SB_VERT, &si) ; if(si.nPos != iVertPos) { yPt += si.nPos - iVertPos; ScrollWindow(0, iVertPos - si.nPos, NULL, NULL); UpdateWindow(); ::UpdateWindow(GetParent()->m_hWnd); } CDialog::OnVScroll(nSBCode, nPos, pScrollBar);} 如何将电脑屏幕保存为一张图片? VC6.0 MFC 建立多文档显示图像程序,如何在新窗口打开图像 mfc对话框程序,假如有50个CHECK box 控件,如何统一管理她们的click事件? vc QQ群 迄今最难的问题::如何重载CSplitterWnd类,实现分割栏上有铵钮的功能? 打开文件的对话框有哪些实现方法? nurbs源代码(vc) 怎么让EDIT BOX自动滚到最后一行呀?通宵在线等。 问一个关于抓包的问题 如何正确设置滚动条范围?困扰了3天了???? 请教程序按钮响应--当按下按钮时激活IE地址栏并全选网址 打开图片和关闭图片的问题
简单的说视图类的Window是个大矩形,而其view是一个在大矩形上移动的小矩形,只有在小矩形内部的图像才能被看见。滚动视窗,就是移动那个小矩形
正解。响应WM_HSCROLL或者WM_VSCROLL
{
// TODO: Add your message handler code here and/or call default
si.cbSize = sizeof(si); //SCROLLINFO si;
si.fMask = SIF_ALL;
GetScrollInfo(SB_HORZ, &si) ;
int iHorzPos = si.nPos ;
switch(nSBCode)
{
case SB_LINELEFT:
si.nPos -= 15; break;
case SB_LINERIGHT:
si.nPos += 15; break;
case SB_PAGELEFT:
si.nPos -= si.nPage; break;
case SB_PAGERIGHT:
si.nPos += si.nPage; break;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos; break;
}
si.fMask = SIF_POS ;
SetScrollInfo(SB_HORZ, &si, TRUE);
GetScrollInfo(SB_HORZ, &si);
if (si.nPos != iHorzPos)
{
xPt += si.nPos - iHorzPos; //int xPt;
ScrollWindow(iHorzPos - si.nPos, 0, NULL, NULL);
UpdateWindow();
} CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CPreView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
si.cbSize = sizeof (si) ;
si.fMask = SIF_ALL ;
GetScrollInfo(SB_VERT, &si);
int iVertPos = si.nPos ;
switch(nSBCode)
{
case SB_TOP:
si.nPos = si.nMin; break;
case SB_BOTTOM:
si.nPos = si.nMax; break;
case SB_LINEUP:
si.nPos -= 15; break;
case SB_LINEDOWN:
si.nPos += 15; break;
case SB_PAGEUP:
si.nPos -= si.nPage; break;
case SB_PAGEDOWN:
si.nPos += si.nPage; break;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos; break;
}
si.fMask = SIF_POS ;
SetScrollInfo(SB_VERT, &si, TRUE) ;
GetScrollInfo(SB_VERT, &si) ;
if(si.nPos != iVertPos)
{
yPt += si.nPos - iVertPos;
ScrollWindow(0, iVertPos - si.nPos, NULL, NULL);
UpdateWindow();
::UpdateWindow(GetParent()->m_hWnd);
} CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}