Как изменить заголовок CDockablePane - PullRequest
6 голосов
/ 22 февраля 2010

Как принудительно обновить заголовок CDockablePane в пакете функций MFC? Я работаю с примером стиля студии Visual с вкладками, и я хочу изменить подписи для вкладок.

Кажется, они где-то кешируются, хотя, когда я изменяю настройки по умолчанию, оно использует то, что приложение использовало при предыдущем запуске. Я не могу найти ничего в реестре, касающемся этого.

Я изменяю таблицу строк IDS_FILE_VIEW и IDS_CLASS_VIEW, чтобы установить новые подписи. Я перешел к методу CDockablePane :: CreateEx, и параметр lpszCaption содержит новый заголовок, но старый заголовок все еще используется.

Новые подписи не загружаются, пока панель не будет скрыта и снова показана. Это должно быть подсказкой, но я не могу понять это.

Почему он не использует то, что я передаю в качестве заголовка для CreateEx ???

Ответы [ 6 ]

6 голосов
/ 24 февраля 2010

В двух словах, это ошибка в пакете функций MFC - фактически в библиотеке программного обеспечения BCG. Ошибка в том, что вы не можете изменить эти заголовки динамически. Их ответ: «Зачем тебе это делать?»

Подписи для панелей с вкладками в закрепляемой панели хранятся в реестре. Подписи, используемые при создании, НЕ используются, если подписи уже существуют в реестре.

Итак, при первом запуске приложения оно будет использовать заголовки из таблицы строк. После этого он использует подписи из реестра.

Используя настройки, созданные AppWizard, настройки реестра:

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

Значение, хранящееся в этом ключе, является в основном двоичным файлом, который сериализуется в панели при запуске менеджером стыковки. Содержимое не документировано, но вы можете увидеть, что код делает в afxdockablepane.cpp.

Надеюсь, это поможет кому-то еще, кто сталкивался с этой проблемой.

2 голосов
/ 09 марта 2010

Хммм, Baybe, я неправильно понял, но я просто вызываю 'SetWindowText' на экземпляре CDockablePane. Подпись к ней меняется на то, что я передаю в «SetWindowText» ...

1 голос
/ 12 декабря 2013

У меня была похожая проблема, что после первого закрытия приложения две панели получили одно и то же имя. Я удалил ключи реестра, при первом запуске все было в порядке, на втором я снова получил ту же ошибку. SetWindowText ( "MyPane"); в переопределенных OnSize панели сделали грязную работу. Это не лучшее место для установки заголовка окна, но, как сказал выше Colerman, SetWindowsText не всегда работает должным образом.

В любом случае, когда приложение запускается, процесс размещения панели всегда вызывает OnSize после Создание панели завершено, поэтому для меня этот грязный хак сделал свое дело.

0 голосов
/ 09 декабря 2013

Поскольку текст для вкладки хранится в реестре, а код для выполнения этого довольно хорошо скрыт и недокументирован, я нашел мерзкий способ делать то, что вы хотите.

Измените таблицу строк в вашем файле .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 в окончательном выпуске, потому что я хочу, чтобы другие настройки были восстановлены.

НТН

0 голосов
/ 06 июня 2013

Я столкнулся с той же проблемой, но, поскольку мне не нравятся какие-либо предлагаемые здесь решения, я пошел дальше и обнаружил, что можно легко отключить загрузку состояния из реестра, обратившись к CDockingManager и вызвав его. метод DisableRestoreDockState

0 голосов
/ 19 ноября 2010

Имя окна сериализуется во время LoadState (). Удалите всю информацию реестра, связанную с позициями окна в вашем приложении. В моем случае это было в HKCU \ Software \ My App Name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...