首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

CGfxOutBarCtrl 控件 Bug 修正與漢化完整指南

     編輯:關於VC++

CGfxOutBarCtrl 是一款模仿 Outlook 側邊欄風格的 MFC 控件,功能強大但在實際使用中發現三個影響介面美觀的問題。本文詳細記錄問題成因、修正程式碼與右鍵選單漢化步驟,並提供完整修正後的 RemoveFolder 函式實作。

發現的三大問題

  1. 刪除非 TreeBar 目錄後畫面殘留:移除資料夾後視圖區未主動重繪,導致舊內容殘留。
  2. 刪除 TreeBar 目錄導致記憶體洩漏與顯示錯亂:RemoveFolder 僅刪除 CBarFolder 物件,未釋放其內部 CTreeCtrl* 指向的子視窗物件。
  3. 右鍵選單為英文 ("鳥語"):需將選單字串本地化為中文。

圖 1:刪除一般資料夾後視圖區顯示異常。

圖 2:刪除 TreeBar 資料夾後樹狀控件殘留。

問題 1 與 2 的根本解決:重寫 RemoveFolder

原始碼在刪除資料夾後僅被動等待 WM_PAINT,且未釋放 TreeBar 內的樹狀控件。修正策略:

  • 主動發送 WM_CLOSE 給子視窗 (pbf->pChild) 以正確銷毀視窗資源。
  • 刪除資料夾物件後,呼叫 SetSelFolder(iSelFolder) 強制切換至有效資料夾,觸發視圖區重繪。
  • 最後呼叫 Invalidate() 確保整個控件更新。

修正後的 RemoveFolder 完整程式碼 (GfxOutBarCtrl.cpp)

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(); }

問題 3:右鍵選單漢化

在 GfxOutBarCtrl.cpp 頂部的巨集定義區修改字串常數即可:

// 漢化工作 #define _ID_GFX_SMALLICON _T("小圖標風格") #define _ID_GFX_LARGEICON _T("大圖標風格") // #define _ID_GFX_REMOVEITEM _T("刪除子項") #define _ID_GFX_RENAMEITEM _T("子項重命名")

測試與驗證

修正後重新編譯專案,執行以下操作驗證:

  1. 新增、刪除一般資料夾,視圖區應即時正確更新,無殘影。
  2. 新增 TreeBar 資料夾並加入節點,刪除該資料夾後樹狀控件應完全消失,無記憶體洩漏 (可用 Debug 模式檢查 Detected memory leaks)。
  3. 右鍵點擊資料夾標籤或項目,彈出選單應顯示中文。

若後續發現其他問題,歡迎來信交流:lixiaofei@geasp.com。感謝 VC 知識庫提供分享平台!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved