CGfxOutBarCtrl 是一款模仿 Outlook 側邊欄風格的 MFC 控件,功能強大但在實際使用中發現三個影響介面美觀的問題。本文詳細記錄問題成因、修正程式碼與右鍵選單漢化步驟,並提供完整修正後的 RemoveFolder 函式實作。
RemoveFolder 僅刪除 CBarFolder 物件,未釋放其內部 CTreeCtrl* 指向的子視窗物件。
圖 1:刪除一般資料夾後視圖區顯示異常。
圖 2:刪除 TreeBar 資料夾後樹狀控件殘留。
原始碼在刪除資料夾後僅被動等待 WM_PAINT,且未釋放 TreeBar 內的樹狀控件。修正策略:
WM_CLOSE 給子視窗 (pbf->pChild) 以正確銷毀視窗資源。SetSelFolder(iSelFolder) 強制切換至有效資料夾,觸發視圖區重繪。Invalidate() 確保整個控件更新。
void CGfxOutBarCtrl::RemoveFolder(const int index)
{
ASSERT(index >= 0 && index < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
// 【修正 2】釋放 TreeBar 內的 CTreeCtrl 子視窗
if (pbf->pChild)
{
::SendMessage(pbf->pChild->m_hWnd, WM_CLOSE, 0, 0);
// 等價於 pbf->pChild->DestroyWindow();
}
delete pbf;
arFolder.RemoveAt(index);
// 更新選取索引
if (iSelFolder >= index) iSelFolder = index - 1;
if (iSelFolder < 0 && GetFolderCount() > 0) iSelFolder = 0;
// 【修正 1】主動切換資料夾觸發重繪
SetSelFolder(iSelFolder);
Invalidate();
}
在 GfxOutBarCtrl.cpp 頂部的巨集定義區修改字串常數即可:
// 漢化工作
#define _ID_GFX_SMALLICON _T("小圖標風格")
#define _ID_GFX_LARGEICON _T("大圖標風格")
//
#define _ID_GFX_REMOVEITEM _T("刪除子項")
#define _ID_GFX_RENAMEITEM _T("子項重命名")
修正後重新編譯專案,執行以下操作驗證:
Detected memory leaks)。若後續發現其他問題,歡迎來信交流:lixiaofei@geasp.com。感謝 VC 知識庫提供分享平台!