捲軸的作用在於當繪製的圖形超過客戶區的大小的時候,通過捲軸的移動來觀測整個圖形,VC中提供了CScrollView類來完成捲軸的繪製,在建立工程的時候的第六步,將基類選擇為CSrollView。如果之前已經選擇CView為基類,請將你的程式進行如下改動:(1)將CXXXView.cpp和CXXXView.h中的CView全部替換為CSrollView(XXX為工程名稱)(2)通過ClassWizard為CXXXView添加響應函數OnInitialUpdate(),並添加一下代碼:
CSize sizeTotal;
sizeTotal.cx=sizeTotal.cy=0;
SetScrollSizes(MM_TEXT,SizeTotal);
這段代碼的作用在於完成捲軸的初始化,如果不添加編譯時間沒有問題但運行時出錯,SetScrollSizes( int nMapMode, SIZE sizeTotal, const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault )四個參數的含義分別是:nMapMode指映射模式,sizeTotal代表捲軸的範圍,sizePage代表點擊捲軸空白處時捲軸移動的距離,sizeLine代表點擊端點處捲軸移動的距離。
設定完成後,在OnDraw中把你繪圖使用的參數傳遞給SetScrollSizes(),確定捲軸的範圍,此處有一注意事項:在繪圖的過程中使用CDC *pDC直接調用繪製,不要使用CClientDC dc(this)的dc來進行繪製,否則將導致捲軸的移動時圖形沒有任何變化(曾經花了兩天時間才發現這個問題的解決方案,笨啊!)
建議最好添加如下代碼:
//這個很重要
void CProgramView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
CScrollView::OnPrepareDC(pDC, pInfo);
}
void CProgramView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CProgramView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}