程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 滾動子視圖的使用

滾動子視圖的使用

編輯:關於C語言

好幾天沒寫博客了。今天發現了一個需求,在對話框上有好多下拉框選項,一個屏幕顯示不完,需要使用到滾動條。起初並不知曉有CScrollView這個類,便嘗試了用滾動條,然後在滾動時更改屏幕上控件的坐標來實現。但是後來發現,不但經常會滾動得“不干不淨”的,還有些在初始情況下是隱藏的下拉框如何再顯示出來呢?一番糾結後,開始尋求更簡潔的方案。

以前聽說過內嵌子視圖的說法,於是靈光一現,想到了創建一個帶滾動條的子視圖,也就自然而然地尋找到了CScrollView。

這個視圖類的作用很簡單,就是創建一個視圖區域,也可以像向裡面添加控件等,超出的部分就“看不見”了,通過滾動條來查看更多的區域。

無圖無真相,來個小程序就知道是怎麼回事了。 

建立一個基於對話框的MFC程序ScrollViewTest。然後在項目上單擊右鍵,添加新的MFC類CMyScrollView,在選擇基類的時候,選擇CScrollView。

然後在ScrollViewTest.h中添加一個成員變量

  1. CMyScrollView * m_pMyView; 

接下來在CScrollViewTestDlg::OnInitDialog()中添加下面的代碼吧。

  1. m_pMyView = (CMyScrollView*)(RUNTIME_CLASS(CMyScrollView)->CreateObject()); 
  2. CCreateContext context; 
  3. context.m_pCurrentDoc = NULL; 
  4.  
  5. m_pMyView->Create(NULL, 
  6.     NULL,  
  7.     WS_BORDER, 
  8.     CRect(0, 0, 100, 100), 
  9.     this,  
  10.     WM_USER + 1,  
  11.     &context); 
  12.  
  13. ((CView*)m_pMyView)->OnInitialUpdate(); 
  14. m_pMyView->ShowWindow(SW_SHOW); 

行啦,已經可以運行了,結果如下。

可以看到這東西就像一個控件一樣嵌到對話框中了。

然後就可以為所欲為了。修改一下代碼。

  1. m_pMyView->Create(NULL,  
  2.     NULL,   
  3.     WS_BORDER,  
  4.     CRect(0, 0, 200, 200),  
  5.     this,   
  6.     WM_USER + 1,   
  7.     &context);  

再運行,你會發現,咦,滾動條們呢?

這裡需要注意一下,在Create之後,調用了CScrollView的一個虛函數OnInitialUpdate(),會設置一些基本的參數,其中一個就是“滾動區域”。很明顯運行此方法完後的“滾動區域”要比CRect(0, 0, 200, 200)小,所以子視圖認為“我沒有必要滾動了,你完全可以看得到所有的東西”。為了驗證一下,我們Debug並查看一下。如圖

m_totalDev便是“滾動區域”,m_pageDev是“滾動一頁”需要滾動的大小,m_lineDev是“滾動一行”需要滾動的大小。

解決這種情況也很簡單,增大“滾動區域”。使用SetScrollSize()方法。

  1. void SetScrollSizes(int nMapMode, 
  2.             SIZE sizeTotal, 
  3.             const SIZE& sizePage = sizeDefault, 
  4.             const SIZE& sizeLine = sizeDefault); 

第一個參數就是“滾動區域”了,一會我們把它設為長寬各為500。

第二個參數是“滾動一頁”時需要滾動的區域。

第三個參數是“滾動一行”時需要滾動的區域。

好,設置一下“滾動區域”。

  1. SIZE size; 
  2. size.cx = 500; 
  3. size.cy = 500; 
  4. m_pMyView->SetScrollSizes(MM_TEXT, size); 

注意,這幾行代碼必須要加在OnInitialUpdate()之後,否則不就前功盡棄了?

結果如下。

好,接下來在子視圖上添加控件試試。添加一個成員變量:

  1. CMFCButton * m_button; 

在構造函數中初始化之:

  1. m_button = new CMFCButton; 

在CScrollViewTestDlg::OnInitDialog()中添加如下代碼:

  1. button->Create(_T("Hello"), 
  2. WS_VISIBLE, 
  3. CRect(5, 5, 80, 250), 
  4. m_pMyView, 
  5. WM_USER + 1); 

好,只能通過拖動滾動條的方式來看到這個按鈕的全貌了。

基本的功能介紹完成了,還有些其他的方法,比如

  1. void CheckScrollBars(BOOL& bHasHorzBar, BOOL& bHasVertBar) const; 

檢查滾動條是否存在。

比如

  1. CPoint GetDeviceScrollPosition( ) const; 

返回當前滾動條的位置,一個坐標值。

再比如

  1. void SetScaleToFitSize(SIZE sizeTotal); 

可以根據視圖的內容調整視圖的大小。

諸如此類的方法,可以靈活地運用到程序中去。

 

 

 

本文出自 “正面旺得福反面泰瑞寶” 博客,請務必保留此出處http://serious.blog.51cto.com/242085/876251

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved