2016-02-26 3 views

ответ

3

Хотя ответ был принят, я хотел бы предложить другое решение.

Во-первых, предлагаемая компоновка кнопок сломается, как только вы решите, что нажатие кнопки ButtonB должно вызвать щелчок на ButtonA.

Я бы отделить все, что щелчки от базовой функциональности, и вызывать его по мере необходимости:

void MyDialog::Button_A_Action() 
{ 
} 

void MyDialog::Button_B_Action() 
{ 
} 

void MyDialog::OnButton_A_Clicked() 
{ 
    Button_A_Action(); 
    Button_B_Action(); 
} 

void MyDialog::OnButton_B_Clicked() 
{ 
    Button_B_Action(); 
} 
4

Вызовите обратный вызов для ButtonB явно из обратного вызова ButtonA.

 
 
BOOL MyDialog::OnButton_A_Clicked() 
{ 
    ... 
    OnButton_B_Clicked(); 
} 
 

Как уже упоминалось в this comment, вызывая обработчик может непосредственно вызвать тонкие проблемы, я хотел бы предложить следующее решение из того же комментария:

кнопку Отправить сообщение нажмите на кнопку B.

BOOL MyDialog::OnButton_A_Clicked() 
{ 
    ... 
    CWnd *pBtnB = GetDlgItem(IDC_BUTTONB); 
    ASSERT(pBtnB != NULL); // You can use MFC 
    pBtnB->SendMessage(BN_CLICKED); 
} 
+1

Хотя это может работать, как и ожидалось, я видел случаи, когда прямого вызова обработчика из другого обработчика может привести к некоторые тонкие проблемы. Я бы предпочел опубликовать/отправить соответствующее сообщение, чтобы избежать возможных проблем. – rrirower

+0

@rrirower Спасибо за ваш комментарий. Я отредактировал свой ответ. Не могли бы вы рассказать, какие возможные проблемы могут возникнуть, если вы вызываете обработчика из другого? –

+0

Это действительно зависит от того, что делает обработчик исходного события. Как правило, я видел, что дескрипторы окон и другие объекты становятся недействительными, потому что исходное сообщение не было полностью обработано при вызове следующего вложенного обработчика. – rrirower

Смежные вопросы