2009-07-22 18 views
8

Tengo un cuadro de diálogo MFC en el que hay dos botones de opción. Los puse en un grupo agradable, sus IDCs son uno después del otro (RB_LEFT, RB_RIGHT).Botones de radio MFC - Comportamiento DDX_Radio y DDX_Control

Quiero usar DDX_Radio para que pueda acceder a los botones de un valor de número entero por lo que en la DoDataExchange función que llamo:

DDX_Radio(pDX, RB_LEFT, mRBLeftRight); 

donde mRBLeftRight es una variable miembro de tipo entero. También necesito para editar los botones de propiedades, así que quería utilizar un DDX_Control mapearlos en variables miembro mRBLeft y mRBRight (CButton):

DDX_Control(pDX, RB_LEFT, mRBLeft); 
    DDX_Control(pDX, RB_RIGHT, mRBRight); 

ahora si hago el llamado a DDX_Control, siempre DoDataExchange se llama, el la aplicación se bloquea porque DDX_Control fuerza RB_LEFT para manejar un mensaje que DDX_Radio no puede controlar. Esta parte lo entiendo

Decidí no usar DDX_Control (eliminé las llamadas en DoDataExchange) y simplemente mantener un puntero a mis botones de radio (CButton *) en mis clases. Así que en mi función OnInitDialog, hago las siguientes llamadas:

mRBLeft= ((CButton*)GetDlgItem(RB_LEFT)); 
    mRBRight = ((CButton*)GetDlgItem(RB_RIGHT)); 

Ahora, siempre y cuando no uso mRBLeft que va a estar bien, pero si lo hago, bam, accidente en DoDataExchange. Lo que realmente me desconcierta es que si cambio mi botón de radio izquierdo usando ((CButton*)GetDlgItem(RB_LEFT)->SetCheck(true) , va a funcionar. Entonces, ¿cuál es la diferencia?

(Sé que es un montón de problemas para poco, pero sólo quiero entender la mecánica)

+0

Leí en alguna parte que no debería almacenar un puntero devuelto por GetDlgItem, que probablemente sea correcto, ¿quizás esta es la causa de mi problema? – levesque

Respuesta

7

TBH Es incluso más fácil que la publicación de JC lo hace creer.

DDX_Control(pDX, IDC_RADIO3, m_r3); 
DDX_Control(pDX, IDC_RADIO4, m_r4); 

m_Val = 0; 
DDX_Radio(pDX, IDC_RADIO3, m_Val); 

Usted necesidad de marcar el botón de radio por primera vez en el grupo con WS GROUP (En este caso IDC_RADIO3). Ahora está listo y seleccionará automáticamente IDC_RADIO3).

Ahora, para mantener actualizado a m_Val, probablemente valga la pena colocar un controlador de clics en todos los botones de opción del grupo. Dentro de esa función, simplemente, llame a UpdateData (TRUE); m_Val ahora apuntará al índice del botón de opción en el grupo.

+0

Marqué el primer botón de radio con 'WS_GROUP' ... – levesque

+0

Hice exactamente esto ... créame, se bloqueará si usa m_r3. – levesque

+2

Extraño ... acuñar una frase, "Funciona en mi máquina" ... – Goz

1

Hay un error en sus instalaciones. Usted puede usar DDX_Radio y DDX_Control para el mismo control, de lo contrario sería bastante inútil. ¿Puede elaborar en

? Ahora si realizo la llamada a DDX_Control, cada vez que se llama a DoDataExchange, la aplicación falla porque DDX_Control obliga a RB_LEFT a manejar un mensaje que DDX_Radio no puede manejar. Esta parte lo entiendo. "

porque creo que esto ya es un síntoma del problema subyacente.

+0

He encontrado la respuesta, si te importa :) – levesque

3

he encontrado la respuesta aquí: http://www.flounder.com/getdlgitem.htm

hay un problema con el uso de DDX_Control y DDX_Radio al mismo tiempo :) Este es un pequeño truco para evitar el problema.

las variables del botón de radio

Otro problema intrínseco, que representa una especie de extraña punto de vista filosófico de Microsoft, es que no se debe permitir crear variables de control para la radio botones. Esto no tiene sentido. Ellos tienen alguna extraña idea de que la única forma en que manipulará los botones de radio es a través de un índice. Esto es irremediablemente inadecuado.Por lo tanto, tiene que ir al mediante algunas contorsiones serias para obtener variables de control para sus botones de radio .

Lo primero que debe hacer es ir a y marcar todos los botones de opción como con el estilo WS_GROUP. Solo los botones de radio con WS_GROUP estilo pueden tener una variable de control. Sin embargo, si marca todos ellos con WS_GROUP, crear el control las variables, y luego quitar el atributo WS_GROUP, todo funciona muy bien, gracias. ¿Por qué tenemos que seguir estos pasos extra no hace sentido en absoluto, pero al igual que el problema clases derivadas, me he estado quejando sobre esto durante años sin ningún efecto. Mi problema es que me olvido de que volver atrás y deshacer todos los WS_GROUP atributos, por lo que la primera vez que ejecute el programa después de este encuentro que todos mis botones de radio son de un solo botón grupos. Whoops. ps Fix, y recompile/relink.

+1

Hmm Todavía no lo entiendo, esto siempre ha funcionado como esperaba. Como se menciona a continuación, debe establecer el primer estilo de control en WS_GROUP y luego simplemente funciona. Ah, bueno, al menos tienes tu problema resuelto. – Roel

+1

FYI, acabo de tropezar con esta pregunta y pensé que le dejaría saber, no tengo este problema, y ​​el consejo estándar de Goz es lo que uso. Podría indicar un problema más profundo para usted. –

+0

@ Mark, por una extraña coincidencia me encontré con esto hoy también. Esta respuesta es un mal consejo, representa un malentendido del funcionamiento de DDX_Radio. Te abres a mucho dolor cuando vas en contra de lo que Microsoft espera. Hubo otro problema subyacente en el código que nunca fue diagnosticado, y con una solución en su lugar nunca lo será. –

Cuestiones relacionadas