要通過捲軸顯示文檔,還必須知道文檔滾動到了什麼位置;一旦使用者拖動捲軸時要告訴視圖改變在文檔中
的位置。所有這些,由MFC的CSrollView類來完成。而程式員要做的工作是:
1、從CScrollView類中派生自己的視圖類,以支援捲軸
2、提供文檔大小,確定滾定範圍和設定初始值
3、協調文檔位置和螢幕座標
一、有CScrollView類派生視圖類
使用AppWizard建立應用程式架構時,在第6步時,可以選擇CScrollView類作為視圖類的基類。另外在程式中
也可以手工設定:在視圖類 *view的標頭檔和資源檔中,搜尋CView,將其替換為CScrollView即可。
二、確定滾動那個範圍,設定初始值
滾動視窗建立時,必須設定客戶視窗的總尺寸。使用CWnd成員函數SetScrollSizes()可以設定滾動視窗的尺
寸。該操作必須在客戶視窗建立前完成,因此需要重載視圖類的OnInitialUpdate()函數。如下代碼:
void CCh10Demo3View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
SIZE size={3000,1500};
SetScrollSizes(MM_TEXT,size);//滾動視窗的最大地區/////////////////////////////////////
}
三、協調文檔位置與螢幕座標
在Windows中,文檔座標系成為邏輯座標系,視圖座標系成為裝置座標系。在視圖滾動後,如果使用者在視圖
中單擊座標,那麼會得到滑鼠位置的裝置(視圖)座標。在使用這一個資料處理文檔(如點線)時,需要把
它轉化為文檔座標。當調用MFC繪圖函數繪圖時,Windows自動將文檔轉化為視圖座標,然後再繪圖。
CDC提供了了兩個成員函數LPToDP()和DPToLP()完成之間的轉換工作。對於本例而言,在滑鼠訊息響應
函數中,其擷取的座標是裝置座標,因此需要使用DPTOLP()轉為文檔座標。而在OnDraw()函數中文檔座標
轉為視圖座標進行繪圖是系統自動完成的。
另外,視圖座標和文檔座標還存在原點的匹配問題。如果視圖的捲軸沒有滾動則原點是重合的,如果滾動
了則不一致,這就需要我們調整視圖座標。CScrollView視圖類提供了一個函CScrollView::OnPrepareDC()
成員函數,完成視圖裝置上下文座標原點的匹配。
需要在滑鼠及按鍵訊息響應中添加如下代碼:
CClientDC dc(this);//擷取客戶視窗DC
OnPrepareDC(&dc);//進行座標原點的匹配
dc.DPtoLP(&point);//將視圖座標轉換為文檔作標