2010-02-22 14 views
6

Jak wymusić odświeżenie podpisu CDockablePane w pakiecie funkcji MFC? Pracuję nad przykładem z kartami graficznymi i chcę zmienić podpisy dla kart.Jak zmienić podpis CDockablePane

Te wydają się być buforowane gdzieś chociaż, że kiedy zmieni się z wartości domyślnych, używa co aplikacja używana na jego poprzednim okresie. Nie mogę znaleźć niczego w rejestrze odnoszącego się do tego.

mam modyfikując IDS_FILE_VIEW tabeli ciąg i IDS_CLASS_VIEW ustawić nowe tytuły. Przystąpiłem do metody CDockablePane :: CreateEx, a parametr lpszCaption zawiera nowy podpis, ale stary napis nadal jest używany.

Nowe napisy nie ładują się, dopóki panel nie zostanie ukryty i wyświetlony ponownie. To powinna być podpowiedź, ale nie mogę tego rozgryźć.

Dlaczego po prostu nie użyć tego, co przekazuję jako podpis do CreateEx ???

Odpowiedz

6

W skrócie, jest to błąd w MFC Feature Pack - faktycznie w bibliotece BCG Software. Błąd polega na tym, że nie możesz zmienić tych napisów dynamicznie. Ich odpowiedź brzmi "dlaczego chcesz to zrobić?"

Podpisy na kartach szyby w okienku dockable są przechowywane w rejestrze. Napisy użyte przy tworzeniu NIE są używane, jeśli podpisy już istnieją w rejestrze.

Tak, po raz pierwszy uruchomić aplikację, użyje podpisy od stołu strun. Następnie korzysta z podpisów z rejestru.

Korzystanie z ustawień stworzonych przez AppWizard ustawienia rejestru są pod adresem:

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

Wartość przechowywana w tym kluczu jest w zasadzie plik binarny, który pobiera szeregowane do szyb przy rozruchu przez kierownika dokującej. Zawartość nie jest udokumentowana, ale można zobaczyć, co robi kod w afxdockablepane.cpp.

Mam nadzieję, że pomoże to komuś innemu, kto spotka się z tym problemem.

+0

Wielka odpowiedź thx. Moja odpowiedź na pytanie "dlaczego chcesz to zrobić?" ... hmmm ... internacjonalizacja (przepraszam BCG ... angielski nie jest używany wszędzie). Śmieszny. –

+0

Wow, to jest absolutnie niedorzeczne. Szukałem powodu, dla którego nasze tafle były nieprawidłowo tłumaczone na około godzinę, dopóki nie natknąłem się na tę odpowiedź. Dziękuję Ci bardzo. – TorbenJ

2

Hmmm, baybe mi źle, ale po prostu zadzwoń 'SetWindowText' na wystąpienie CDockablePane. Podpis zmienia się w to, co przekazuję do "SetWindowText" ...

+0

Tak, działa SetWindowText, ale nie zgodnie z oczekiwaniami. Musisz wywołać SetWindowText po wywołaniu Create i nie może być następnym połączeniem po Create. Na przykład przykład VS ma funkcję o nazwie CreateDockingWindows. Dodanie wywołania SetWindowText w tej funkcji (po odpowiednim utworzeniu) nie działa. Punkt mojego oryginalnego wpisu był taki, że funkcja Utwórz przyjmuje parametr podpisu, który jest całkowicie ignorowany. – cigarman

0

Nazwa okna jest serializowana w czasie LoadState(). Usuń wszystkie informacje rejestru dotyczące pozycji okien w aplikacji. W moim przypadku było to w HKCU \ Software \ Moja nazwa aplikacji.

0

Napotkałem ten sam problem, ale ponieważ nie lubię żadnego z oferowanych tutaj rozwiązań, poszedłem dalej i odkryłem, że możesz łatwo wyłączyć ładowanie stanu z rejestru, odwołując się do CDockingManager i wywołując jego metodę DisableRestoreDockState

0

Ponieważ tekst zakładki jest przechowywany wewnątrz rejestru, a kod dla tego jest całkiem dobrze ukryty i nieudokumentowany znalazłem paskudny sposób robienia tego, co chcesz.

Zmień tabelę ciągów w swoim.Plik rc, co chcesz, na przykład Zmieniłem ClassView do LayerView tutaj:

STRINGTABLE 
BEGIN 
    IDS_CLASS_VIEW   "Layer View" 
    ... 
END 

W swojej klasy mainframe dodać to wezwanie:

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 

będzie tym sklepie na myśli, że kiedy blisko następnie Otwórz aplikację, a nazwa przechowywana w rejestrze będzie tą, którą umieścisz w pliku .rc.

Teraz możesz skomentować to wywołanie DisableRestoreDockState, ponieważ poprawny jest zapisany w rejestrze. Nowe instalacje na komputerach użytkowników również będą działać.

Nie utrzymuję DisableRestoreDockState w ostatecznej wersji, ponieważ chcę, aby inne ustawienia zostały przywrócone.

HTH

1

miałem podobny problem, że po pierwszym zamknięciu aplikacji dwie tafle dostał taką samą nazwę. Usunąłem klucze rejestru, przy pierwszym uruchomieniu wszystko było w porządku, na drugim dostałem ponownie ten sam błąd. SetWindowText ("MyPane"); w overriden OnSize panelu zrobił brudną robotę. Nie jest to najlepsze miejsce do ustawienia podpisów Windows, ale jak to określił Colerman, SetWindowsText nie działa tak, jak powinien.

W każdym razie, gdy aplikacja jest uruchomiona, proces Postulat szyba zawsze zadzwonić OnSize po stworzenie panelu jest zakończona, więc dla mnie to brudny Hack załatwiło sprawę.