2010-02-22 113 views
6

如何強制更新MFC功能包中CDockablePane的標題?我正在使用標籤式視覺工作室樣式示例,並且想要更改標籤的標題。如何更改CDockablePane標題

雖然這些似乎被緩存在某處,但當我從默認值更改時,它會使用上次運行時使用的應用程序。我無法在註冊表中找到與此相關的內容。

我正在修改字符串表IDS_FILE_VIEW和IDS_CLASS_VIEW以設置新的標題。我已經步入CDockablePane :: CreateEx方法,並且lpszCaption參數確實包含新的標題,但舊標題仍在使用中。

直到窗格隱藏並再次顯示後,新的標題纔會加載。這應該是一個暗示,但我無法弄清楚。

爲什麼不只是使用我作爲CreateEx標題傳遞的內容?

回答

6

簡而言之,這是MFC功能包中的一個錯誤 - 實際上在BCG軟件庫中。錯誤是你不能動態改變這些字幕。他們的回答是「你爲什麼要這麼做?」

可停靠窗格中選項卡式窗格的標題存儲在註冊表中。如果註冊表中已存在標題,則不會使用創建時使用的標題。

因此,第一次運行應用程序時,它將使用字符串表中的字幕。之後,它使用註冊表中的標題。

使用應用程序嚮導創建的設置,註冊表設置在:

HKEY_CURRENT_USER\Software\Local AppWizard-Generated Applications\MyApp\Workspace\DockingManager-128\DockingPaneAndPaneDividers 

存儲在這個關鍵的價值基本上是被序列化到窗格在通過對接管理器啓動的二進制文件。內容沒有記錄,但你可以看到代碼在afxdockablepane.cpp中做了什麼。

我希望這可以幫助遇到此問題的其他人。

+0

很好的迴應thx。我的答案是'你爲什麼要這麼做?'......嗯......國際化(對不起BCG ......英語不是處處可見)。荒謬。 – 2015-11-04 20:28:37

+0

哇這太絕對了。我一直在尋找我們的窗格不正確的翻譯了一個小時的原因,直到我偶然發現了這個答案。非常感謝你。 – TorbenJ 2017-11-10 08:13:29

2

嗯,baybe我誤解了,但我只是在CDockablePane的一個實例上調用'SetWindowText'。 它的標題更改爲我傳遞給「SetWindowText」的內容...

+0

是的,SetWindowText起作用,但並不像預期的那樣。您必須在調用Create之後的某個時間調用SetWindowText,並且它不能是Create之後的下一個調用。例如,VS示例有一個名爲CreateDockingWindows的函數。在該函數中添加對SetWindowText的調用(在適當的Create之後)不起作用。 我原來的帖子的一點是,創建函數需要一個完全忽略的標題參數。 – cigarman 2010-03-15 15:41:12

0

窗口的名稱在LoadState()時序列化。刪除與您的應用中窗口位置相關的所有註冊表信息。在我的情況是在HKCU \ Software \ My App Name。

0

我遇到了同樣的問題,但由於我不喜歡這裏提供的任何解決方案,我進一步發現,通過引用CDockingManager並調用它的方法,您可以輕鬆地禁用從註冊表中加載狀態DisableRestoreDockState

0

由於該選項卡的文本存儲在註冊表中,並且執行該操作的代碼隱藏得很好並且沒有記錄,所以我發現了一個做你想做的事情的骯髒方法。

更改你的字符串表。RC文件到你想要的東西,比如我改變ClassView中以LayerView這裏:

STRINGTABLE 
BEGIN 
    IDS_CLASS_VIEW   "Layer View" 
    ... 
END 

在大型機類添加此調用:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
    if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1) 
     return -1; 

    BOOL bNameValid; 

    // set the visual manager and style based on persisted value 
    OnApplicationLook(theApp.m_nAppLook); 

    GetDockingManager()->DisableRestoreDockState(TRUE); // <-- THIS CALL 

這將存儲意味着,當你接近然後打開您的應用程序存儲在註冊表中的名稱將是您放入.rc文件中的名稱。

現在你可以註釋掉對DisableRestoreDockState的調用,因爲正確的一個存儲在註冊表中。用戶計算機中的新安裝也將起作用。

我不保留DisableRestoreDockState在最終版本中,因爲我想要恢復其他設置。

HTH

1

我有類似的問題,即應用程序的第一關後兩個窗格得到了相同的名稱。我刪除了註冊表項,第一次啓動一切正常,第二次我又得到了同樣的錯誤。 SetWindowText(「MyPane」);在覆蓋窗格的OnSize做了骯髒的工作。它不是設置窗口標題的最佳位置,但正如Colerman上面所述,SetWindowsText並不總是按照它應該的那樣工作。

無論如何,當應用程序被啓動,:放置窗格進程隨時撥打篩上部分創建窗格的完成,所以對我來說這個骯髒的黑客的伎倆。