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

CGfxOutBarCtrl之BUG篇

編輯:關於VC++

我是一位VC++的初學者,算起來時間還不到四個月,但是我幾乎每天都會光臨VC知識庫網站,我是位界面發燒友,對網站上的新控件都是一一不捨的感覺。VC知識庫網站近日刊登的一個仿OutLook的界面類CGfxOutBarCtrl我下載後發現了一些問題,覺得這些小問題有點影響界面整體的美觀,大方,所以我想貢獻出改進後的CGfxOutBarCtrl全部代碼。

一、問題的提出

現在先讓我們列出CGfxOutBarCtrl存在的所有問題,然後我們再一一解決:

1. 如果刪除某個非TreeBar目錄後會出現如下圖所示的情況:

2. 刪除TreeBar目錄會出現如下圖所示的情況:

3. 另外CgfxOutBarCtrl為我們提供的右鍵菜單是“鳥語”,我們必須進行“漢化”工作。

那麼接下來就讓我們來一一解決這些問題吧。

二、問題的解決

1. 出現問題1的情況是因為在移除了目錄(Folder)之後CgfxOutBarCtrl視圖區域沒有被刷新的原因,查看文件GfxOutBarCtrl.cpp中的RemoveFolder函數才知道它在刪除完目錄後沒有進行主動刷新操作,而是被動的等待Windows的刷新通知。那麼就讓我們來主動發通知消息來讓視圖區域進行刷新(重畫)操作吧!本人剛開始用SendMessage給CgfxOutBarCtrl發送WM_SIZE消息來讓視圖區刷新,但是後來我運行了N多次突然又發現了原來的情況又出現了,所以我又研究了CgfxOutBarCtrl類的結構,發現當用戶變換了當前目錄(Folder)後,CgfxOutBarCtrl類都會主動的去刷新重繪視圖區,既然如此我們就無須再寫多余的代碼只須主動的去調用函數:SetSelFolder()即可。

2. 出現問題2的情況是因為CgfxOutBarCtrl類在RemoveFolder函數中僅僅刪除了CBarFolder類成員對象,而沒有刪除掉CBarFolder類中的CTreeCtrl類指針所指向的CTreeCtrl類成員對象。所以才會造成目錄被刪除了但實際的CtreeCtrl類對象還存在的情況。那麼我們只須在RemoveFolder函數中加入釋放CTreeCtrl對象的代碼即可。

那麼修改後的RemoveFolder函數代碼如下:(加黑部分為本人添加的代碼)

void CGfxOutBarCtrl::RemoveFolder(const int index)
{
   ASSERT(index >= 0 && index < GetFolderCount());
   CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
   //Modified By Blue Sky WorkRoom
   //Author:LiXiaoFei Date:2003Y-01M-14D::11:15
   //原程序未釋放Folder中的子窗體空間造成顯示混亂.
   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;
   //Modified By Blue Sky WorkRoom
   //Author:LiXiaoFei Date:2003Y-01M-14D::11:35
   //原程序在刪除子窗體後沒有更新視圖區,造成目錄顯示混亂.
   //解決辦法:
   //    手工設置當前頁面:SetSelFolder(iSelFolder);
   SetSelFolder(iSelFolder);    
   Invalidate();
}

3. CGfxOutBarCtrl右鍵菜單的漢化問題其實只需要修改GfxOutBarCtrl.cpp文件中的幾個#define即可。修改如下:

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

好了,關於CGfxOutBarCtrl類中存在的問題我就先說到這裡吧,如果大家在以後的使用過程中也發現了CGfxOutBarCtrl的BUG,可以寫信到[email protected]告訴我,感謝了!再次謝謝VC知識庫為我們提供的交流機會。

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