2010-02-22 40 views
6

¿Cómo fuerzo una actualización de la leyenda de un CDockablePane en el paquete de características de MFC? Estoy trabajando con el ejemplo del estilo de Visual Studio con pestañas, y quiero cambiar los títulos de las pestañas.Cómo cambiar el título de CDockablePane

Aunque parece que están en caché en alguna parte, cuando cambio de los valores predeterminados, usa lo que la aplicación utilizó en su ejecución anterior. No puedo encontrar nada en el registro relacionado con esto.

Estoy modificando la tabla de cadenas IDS_FILE_VIEW y IDS_CLASS_VIEW para establecer las nuevas leyendas. He pisado el método CDockablePane :: CreateEx y el parámetro lpszCaption contiene el nuevo título, pero el subtítulo anterior todavía se está utilizando.

Los nuevos títulos no parecen cargarse hasta que el panel se oculta y se muestra de nuevo. Eso debería ser una pista, pero no puedo resolverlo.

¿Por qué no usará lo que paso como título de CreateEx ???

Respuesta

6

En pocas palabras, esto es un error en el paquete de características de MFC, en realidad en la biblioteca de BCG Software. El error es que no puedes cambiar estos títulos dinámicamente. Su respuesta es "¿por qué querrías hacer eso?"

Los títulos de los paneles con pestañas en el panel acoplable se almacenan en el registro. Los subtítulos utilizados en la creación NO se utilizan si los subtítulos ya existen en el registro.

Por lo tanto, la primera vez que ejecute su aplicación, utilizará los títulos de la tabla de cadenas. Después de eso, usa los subtítulos del registro.

Utilizando los ajustes creados por el Asistente para aplicaciones, la configuración del registro se encuentran en:

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

El valor almacenado en esta clave es básicamente un archivo binario que consigue serializa en los paneles en el arranque por el gerente de acoplamiento. Los contenidos no están documentados, pero puede ver lo que está haciendo el código en afxdockablepane.cpp.

Espero que esto ayude a alguien más que se encuentre con este problema.

+0

Gran respuesta thx. Mi respuesta a '¿por qué querrías hacer eso?' ... hmmm ... internacionalización (lo siento BCG ... Inglés no se habla en todas partes). Ridículo. –

+0

Wow esto es tan absolutamente ridículo. Estaba buscando la razón por la que nuestros paneles se tradujeron incorrectamente durante aproximadamente una hora hasta que tropecé con esta respuesta. Muchas gracias. – TorbenJ

2

Hmmm, baybe He entendido mal, pero acabo de llamar a 'SetWindowText' en una instancia de CDockablePane. Leyenda de esto cambia a lo que paso a 'SetWindowText' ...

+0

Sí, SetWindowText funciona, pero no realmente como se esperaba. Debe llamar a SetWindowText en algún momento después de llamar a Create, y no puede ser la siguiente llamada después de Create. Por ejemplo, el ejemplo VS tiene una función llamada CreateDockingWindows. Agregar una llamada a SetWindowText en esa función (después de la creación apropiada) no funciona. El objetivo de mi publicación original fue que la función Crear toma un parámetro de subtítulos que se ignora por completo. – cigarman

0

El nombre de la ventana se serializa en LoadState() time. Elimine toda la información de registro relacionada con las posiciones de ventana en su aplicación. En mi caso, fue en HKCU \ Software \ My App Name.

0

Me encontré con el mismo problema, pero como no me gusta ninguna de las soluciones ofrecidas aquí, fui más allá y descubrí que puedes desactivar fácilmente la carga del estado desde el registro consultando el CDockingManager e invocando su método DisableRestoreDockState

0

Dado que el texto de la pestaña se almacena dentro del registro, y el código para hacerlo está bastante bien oculto e indocumentado, he encontrado una manera desagradable de hacer lo que quiera.

Cambie la tabla de cadenas en su.rc para lo que quiere, por ejemplo, me cambió ClassView a LayerView aquí:

STRINGTABLE 
BEGIN 
    IDS_CLASS_VIEW   "Layer View" 
    ... 
END 

en su tipo mainframe añadir esta llamada:

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 

Esto almacenará significa que cuando cerca continuación abra su aplicación, el nombre almacenado en el registro será el que ponga dentro del archivo .rc.

Ahora puede comentar esa llamada a DisableRestoreDockState porque la correcta se almacena en el registro. Las nuevas instalaciones en las computadoras de tus usuarios también funcionarán.

No mantengo DisableRestoreDockState en la versión final porque quiero que se restauren las otras configuraciones.

HTH

1

tuve un problema similar que después de la primera aplicación de cierre de dos paneles consiguieron mismo nombre. Eliminé las claves de registro, al principio todo estaba bien, en el segundo recibí el mismo error. SetWindowText ("MyPane"); en overriden OnSize del panel hizo el trabajo sucio. No es el mejor lugar para configurar el título de Windows, pero como declaró Colerman anteriormente, SetWindowsText no funciona siempre como debería.

De todos modos, cuando se inicia la aplicación, proceso de postulación panel siempre llaman OnSize después de que se terminó creación del panel, así que para mí este truco sucio lo hizo el truco.

Cuestiones relacionadas