MFC讓文檔/視圖結構程式支援捲軸

來源:互聯網
上載者:User

要通過捲軸顯示文檔,還必須知道文檔滾動到了什麼位置;一旦使用者拖動捲軸時要告訴視圖改變在文檔中

的位置。所有這些,由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);//將視圖座標轉換為文檔作標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.