MFC让文档/视图结构程序支持滚动条
??????
MFC讓文檔/視圖結(jié)構(gòu)程序支持滾動條
2009-06-30 09:26要通過滾動條顯示文檔,還必須知道文檔滾動到了什么位置;一旦用戶拖動滾動條時要告訴視圖改變在文檔中
的位置。所有這些,由MFC的CSrollView類來完成。而程序員要做的工作是:
1、從CScrollView類中派生自己的視圖類,以支持滾動條
2、提供文檔大小,確定滾定范圍和設(shè)置初始值
3、協(xié)調(diào)文檔位置和屏幕坐標(biāo)
一、有CScrollView類派生視圖類
使用AppWizard創(chuàng)建應(yīng)用程序框架時,在第6步時,可以選擇CScrollView類作為視圖類的基類。另外在程序中
也可以手工設(shè)置:在視圖類 *view的頭文件和資源文件中,搜索CView,將其替換為CScrollView即可。
二、確定滾動那個范圍,設(shè)置初始值
滾動窗口創(chuàng)建時,必須設(shè)置客戶窗口的總尺寸。使用CWnd成員函數(shù)SetScrollSizes()可以設(shè)置滾動窗口的尺
寸。該操作必須在客戶窗口創(chuàng)建前完成,因此需要重載視圖類的OnInitialUpdate()函數(shù)。如下代碼:
void CCh10Demo3View::OnInitialUpdate()
{
?CScrollView::OnInitialUpdate();
?SIZE size={3000,1500};
?SetScrollSizes(MM_TEXT,size);//滾動窗口的最大區(qū)域/
}
三、協(xié)調(diào)文檔位置與屏幕坐標(biāo)
在Windows中,文檔坐標(biāo)系成為邏輯坐標(biāo)系,視圖坐標(biāo)系成為設(shè)備坐標(biāo)系。在視圖滾動后,如果用戶在視圖
中單擊坐標(biāo),那么會得到鼠標(biāo)位置的設(shè)備(視圖)坐標(biāo)。在使用這一個數(shù)據(jù)處理文檔(如點線)時,需要把
它轉(zhuǎn)化為文檔坐標(biāo)。當(dāng)調(diào)用MFC繪圖函數(shù)繪圖時,Windows自動將文檔轉(zhuǎn)化為視圖坐標(biāo),然后再繪圖。
CDC提供了了兩個成員函數(shù)LPToDP()和DPToLP()完成之間的轉(zhuǎn)換工作。對于本例而言,在鼠標(biāo)消息響應(yīng)
函數(shù)中,其獲取的坐標(biāo)是設(shè)備坐標(biāo),因此需要使用DPTOLP()轉(zhuǎn)為文檔坐標(biāo)。而在OnDraw()函數(shù)中文檔坐標(biāo)
轉(zhuǎn)為視圖坐標(biāo)進行繪圖是系統(tǒng)自動完成的。
另外,視圖坐標(biāo)和文檔坐標(biāo)還存在原點的匹配問題。如果視圖的滾動條沒有滾動則原點是重合的,如果滾動
了則不一致,這就需要我們調(diào)整視圖坐標(biāo)。CScrollView視圖類提供了一個函CScrollView::OnPrepareDC()
成員函數(shù),完成視圖設(shè)備上下文坐標(biāo)原點的匹配。
需要在鼠標(biāo)及按鍵消息響應(yīng)中添加如下代碼:
?CClientDC dc(this);//獲取客戶窗口DC
?OnPrepareDC(&dc);//進行坐標(biāo)原點的匹配
?dc.DPtoLP(&point);//將視圖坐標(biāo)轉(zhuǎn)換為文檔作標(biāo)
?
類別:c++學(xué)習(xí) | 添加到搜藏 | 瀏覽(296) | 評論 (1)
上一篇:MFC中指定對話框中的文件類型 下一篇:VC++應(yīng)用程序類之間的關(guān)系
總結(jié)
以上是生活随笔為你收集整理的MFC让文档/视图结构程序支持滚动条的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习强制删除正在运行的文件
- 下一篇: 无边框对话框改变大小