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