在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;
---- 然後,在類聲明代碼之前,插入
<