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

為CListBox加上智能水平滾動條

編輯:關於C語言

 

  

在MFC中,用列表框(CListBox)來顯示多個字符串是一種很方便的方法。但缺

省的列表框水平滾動條不夠智能——這裡智能的含義是:在應該出現的時候出

現,不應該出現的時候消失,而且應能自動調節自己的大小。本文通過實例說

明了存在的問題和解決辦法。

 

---- 一、問題演示

 

---- 首先用Visual Studio應用向導創建工程CustomCListBox。這是一個基於對

話框的應用,向導提供的所有可選參數均采用其缺省值。

 

---- 在資源編輯器中將對主話框字體設為宋體12,插入一個CListBox控制,設

其ID為IDC_LLISTTEST,大小為125 X 84。 請確認列表框的垂直滾動條、水平滾

動條有效,取消其排序風格。

 

---- 啟動Class Wizard,選擇Member Variables選項卡,為列表框加入對應的

成員變量m_lListTest,在Category中選擇Control。

 

---- 接下來在Workspace窗格中選擇ClassView,擴展CCustomCListBoxDlg類並

雙擊OnInitDialog(),在編輯窗格中找到注釋行“TODO: Add extra initialization here”,

在該行下面加入以下內容:

 

    m_lListTest.AddString(_T("One"));

    m_lListTest.AddString(_T("Two"));

    m_lListTest.AddString(_T("Three"));

    m_lListTest.AddString(_T("Four"));

    m_lListTest.AddString(_T("Five"));

    m_lListTest.AddString(_T("Six"));

    m_lListTest.AddString(_T("北國風光,千裡冰封,萬裡雪飄。"));

    m_lListTest.AddString(_T("Eight"));

    m_lListTest.AddString(_T("Nine"));

    m_lListTest.AddString(_T("Ten"));

 

 

---- 編譯並運行這個工程,可以發現列表框能夠正確顯示全部內容。

 

---- 如果在上述m_lListText.AddString(_T"Ten"))後面加入一行:

 

    m_lListTest.AddString(_T("Eleven"));

 

---- 重新編譯並運行該工程,可以發現出現了一個垂直滾動條。垂直滾動條的出

現使得列表框水平方向有效顯示寬度變小,第七行的內容被切割而不能完整顯

示。但此時水平滾動條並沒有自動出現,第七行被切割部分就無法看到了。

 

---- 如果我們刪除最後加入的語句,把第七行漢字加長到超出列表框顯示寬度

為止,也可以發現水平滾動條不會自動出現。被切割部分仍舊無法看到。

 

---- 由此可知,CListBox的水平滾動條並不象垂直滾動條那樣“聰明”:垂直

滾動條總是能夠在需要它的時候自動出現,並能夠自動調節自身大小,而水平

滾動條不能。

 

---- 二、解決問題

 

---- 為提高代碼的可重用性,可以創建CListBox的派生類,在派生類中實現

“智能”水平滾動條。需要考慮的主要問題包括:跟蹤最大字符串寬度(應能適

應不同場合下的字體變化),必要時計算垂直滾動條寬度,自動顯示和調節水平

滾動條的大小。

 

---- 選菜單 Insert/New Class,設新創建類的名字為CDJListBox,其基類為

CListBox,其它選項采用缺省值。單擊OK,Visual Studio自動生成

DJListBox.cpp和DJListBox.h兩個文件。

 

---- 接下來將主對話框的列表框改為CDJListBox類型,即在CLassView擴展

CCustomListBoxDlg類並雙擊m_lListTest成員,在編輯窗格,修改

 

CListBox   m_lListTest;

 

 

---- 為:

 

    CDJListBox   m_lListTest;

 

 

---- 然後,在類聲明代碼之前,插入

 <

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