MFC让文档/视图结构程序支持滚动条
??????
MFC讓文檔/視圖結構程序支持滾動條
2009-06-30 09:26要通過滾動條顯示文檔,還必須知道文檔滾動到了什么位置;一旦用戶拖動滾動條時要告訴視圖改變在文檔中
的位置。所有這些,由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);//將視圖坐標轉換為文檔作標
?
類別:c++學習 | 添加到搜藏 | 瀏覽(296) | 評論 (1)
上一篇:MFC中指定對話框中的文件類型 下一篇:VC++應用程序類之間的關系
總結
以上是生活随笔為你收集整理的MFC让文档/视图结构程序支持滚动条的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习强制删除正在运行的文件
- 下一篇: 无边框对话框改变大小