Как отключить CBitmapButton? - PullRequest
2 голосов
/ 12 марта 2009

Как отключить CBitmapButton? Я пытался использовать m_bitmapbutton.EnableWindow (false); но это не работает Это все еще вызывает событие.

То, что я пытаюсь сделать, это предотвратить запуск кнопки A события A, если выполняется событие B (с кнопки B). Поэтому в событии B я хочу отключить кнопку A.

Ответы [ 2 ]

1 голос
/ 12 марта 2009

Вот список вещей, которые нужно проверить:

  • Вы определили изображение для отключенного состояния кнопки растрового изображения?
  • Вы уверены, что событие сработало?
  • Событие B не в потоке, не так ли?
  • Вы делаете m_bitmapbutton.EnableWindow (FALSE) в начале события B и m_bitmapbutton.EnableWindow (TRUE) в конце?
  • Вы делаете уведомление BN_CLICKED ()? Или это может быть другое уведомление, такое как WM_LBUTTONDOWN Notification ()?
  • Вы уверены, что переменная m_bitmapbutton правильно связана с вашей кнопкой A? Не могли бы вы попробовать с GetDlgItem (IDC_BUTTON_A) -> EnableWindow (FALSE);

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

Может быть проще использовать этот класс из CodeProject .

0 голосов
/ 13 марта 2009

Полагаю, проблема в том, что, пока вы посещаете Событие B, сообщения для этого окна не отправляются. Таким образом, они ставятся в очередь и отправляются после того, как вы закончите посещать событие B, и вы снова включили кнопку A. Примерно так:

  1. OnBnClickedButtonB
  2. buttonA.EnableWindow (FALSE) (события мыши для окна ставятся в очередь и не отправляются)
  3. buttonA.EnableWindow (TRUE)
  4. ~ OnBnClickedButtonB (приложение отправляет события в очередь, поэтому кнопка снова включается)

Это не просто проблема с CBitmapButton ... она должна происходить с любой другой кнопкой (я сам не пробовал).

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

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);
}

Надеюсь, это поможет!

Javier

...