2009-03-12 5 views
2

Comment désactiver CBitmapButton? J'ai essayé d'utiliser m_bitmapbutton.EnableWindow (false); mais ça ne marche pas. Il déclenche toujours un événement. Ce que j'essaie de faire est d'empêcher le bouton A de déclencher l'événement A si l'événement B est en cours d'exécution (à partir du bouton B). Ainsi, dans l'événement B, je veux désactiver le bouton A.Comment désactiver CBitmapButton?

Répondre

1

Voici une liste de choses à vérifier:

  • Avez-vous défini une image pour l'état désactivé du bouton bitmap?
  • Etes-vous sûr que l'événement est déclenché?
  • L'événement B n'est pas dans un thread, n'est-ce pas?
  • Faites-vous un m_bitmapbutton.EnableWindow (FALSE) au début de l'événement B et m_bitmapbutton.EnableWindow (TRUE) à la fin?
  • Effectuez-vous une notification BN_CLICKED()? Ou est-ce peut-être une notification différente comme WM_LBUTTONDOWN Notification()?
  • Etes-vous sûr que la variable m_bitmapbutton est correctement associée à votre bouton A? Pourriez-vous essayer avec GetDlgItem (IDC_BUTTON_A) -> EnableWindow (FALSE);

Vous pouvez toujours définir une variable membre booléenne pour indiquer que le bouton A est désactivé et ignorer tous les événements qui lui sont envoyés lorsque ce membre booléen est défini.

Il peut être plus facile d'utiliser this class from CodeProject.

+0

Oui aux deux questions. est-ce un bug? Y at-il d'autres options en plus d'utiliser la classe? –

+0

Je pense que vous seriez mieux avec le bouton CodeProject –

+0

L'événement B n'est pas dans un fil est-ce? Faites-vous un m_bitmapbutton.EnableWindow (FALSE) au début de l'événement B et m_bitmapbutton.EnableWindow (TRUE) à la fin? –

0

Je suppose que le problème est que pendant que vous participez à l'événement B, les messages pour cette fenêtre ne sont pas distribués. Donc, ils sont mis en file d'attente et dispathched une fois que vous avez fini d'assister à l'événement B et vous avez activé le bouton A à nouveau. Quelque chose comme ça:

  1. OnBnClickedButtonB
  2. buttonA.EnableWindow (FAUX) (événements de souris pour la fenêtre sont mises en attente et non expédié)
  3. buttonA.EnableWindow (TRUE)
  4. ~ OnBnClickedButtonB (la répartition de l'application en file d'attente des événements de sorte que le bouton est à nouveau activé)

Ce n'est pas seulement un problème avec un CBitmapButton ... il devrait être avec tout autre bouton (je ne me suis pas essayé).

Une solution possible pourrait être la distribution des événements de souris pour cette fenêtre avant d'activer à nouveau le bouton ... bien que je n'aimais pas trop faire ce genre de thigs ... peut-être quelqu'un peut vous donner une meilleure solution:

void CMyDlg::OnBnClickedButtonB() 
{ 
    m_buttonA.EnableWindow(FALSE); 

    //Process button B clicked event 

    MSG msg; 
    while(PeekMessage( &msg, 
       GetSafeHwnd(), 
       WM_MOUSEFIRST, 
       WM_MOUSELAST, 
       PM_REMOVE)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    m_buttonA.EnableWindow(TRUE); 
} 

Espérons que cette aide!

Javier

Questions connexes