Ho una finestra di dialogo MFC in cui sono presenti due pulsanti di opzione. Li ho messi in un bel gruppo, i loro IDC sono uno dopo l'altro (RB_LEFT, RB_RIGHT
).Pulsanti radio MFC - Comportamento DDX_Radio e DDX_Control
voglio usare DDX_Radio
modo posso accedere ai pulsanti usando un valore intero nel modo DoDataExchange funzione chiamo:
DDX_Radio(pDX, RB_LEFT, mRBLeftRight);
dove mRBLeftRight è una variabile membro di tipo intero. Ho anche bisogno di modificare i tasti di proprietà così ho voluto usare un DDX_Control
per mappare loro su variabili membro mRBLeft e mRBRight (CButton):
DDX_Control(pDX, RB_LEFT, mRBLeft);
DDX_Control(pDX, RB_RIGHT, mRBRight);
Ora, se faccio la chiamata a DDX_Control
, ogni volta che DoDataExchange viene chiamato, il l'applicazione si blocca perché DDX_Control
forza RB_LEFT
per gestire un messaggio che DDX_Radio
non può gestire. Questa parte capisco.
Ho deciso di non utilizzare DDX_Control
(rimosso le chiamate in DoDataExchange) e di mantenere un puntatore ai miei pulsanti di opzione (CButton *) nelle mie classi. Quindi, nella mia funzione OnInitDialog, faccio le seguenti chiamate:
mRBLeft= ((CButton*)GetDlgItem(RB_LEFT));
mRBRight = ((CButton*)GetDlgItem(RB_RIGHT));
Ora finché io non uso mRBLeft sta andando bene, ma se lo faccio, bam, crash su DoDataExchange. La cosa che mi imbarazza davvero è che se cambio il mio pulsante radio sinistro utilizzando funzionerà. Così, qual è la differenza?
(lo so che è un sacco di problemi per poco, ma voglio solo capire la meccanica)
Ho letto da qualche parte che non dovrei memorizzare un puntatore restituito da GetDlgItem, che probabilmente ha ragione, forse questa è la causa del mio problema? – levesque