MFC: путаница в функции ON_COMMAND? - PullRequest
1 голос
/ 29 апреля 2011

Хорошо, вот эта функция

 
.
.
ON_COMMAND (ID_COLOR_RED, OnColor)
ON_COMMAND (ID_COLOR_GREEN, OnColor) 
ON_COMMAND (ID_COLOR_BLUE, OnColor)
.
.
. 
void CMainWindow::OnColor ()
{
    UINT nID = (UINT) LOWORD (GetCurrentMessage ()->wParam);
    m_nCurrentColor = nID _ ID_COLOR_RED;
}

Итак, здесь LOWORD wParam CurrentMessage должен содержать ID сообщения, это нормально, но что делает m_nCurrentColor = nID _ ID_COLOR_RED; средства? M_nCurrentColor может быть 0,1 или 2 для красного, зеленого или синего соответственно ...
Итак, сначала мы конвертируем ID сообщения в UINT в первом операторе, но что мы пытаемся сделать во втором с m_nCurrentColor = nID _ ID_COLOR_RED?
Кто-нибудь может объяснить, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Понятия не имею, что делает этот код .Прежде всего потому, что m_nCurrentColor = nID _ ID_COLOR_RED не скомпилируется.У вас есть подчеркивание (_) между nID и ID_COLOR_RED.Это ничего не значит для компилятора.Вместо этого вы хотели ввести знак минус (-)?

Но в более общем смысле макрос ON_COMMAND используется для обработки WM_COMMAND сообщений.Макрос принимает два параметра:

  • id, который является идентификатором команды
  • memberFxn, который является именем функции обработчика сообщений, в которую отображается команда

Похоже, у вас все настроено.Все три идентификатора команды (красный, зеленый и синий) обрабатываются одной и той же функцией OnColor.

Итак, давайте посмотрим на документацию для WM_COMMAND сообщения .Это говорит о том, что значение параметров wParam и lParam зависит от источника сообщения.Они имеют разные значения в зависимости от того, выбрал ли пользователь элемент из меню, набрал ли он клавишу ускорения или элемент управления отправляет уведомление в родительское окно.

Я не могу точно сказать из вашего вопроса, какойиз них ID_COLOR_RED (и его братья) соответствуют.
Но это не имеет большого значения.В любом случае, это выглядит , как будто код пытается установить переменную-член (m_nCurrentColor), которая отслеживает цвет, который в данный момент выбран пользователем, на основе идентификатора элемента, который отправилпоследнее уведомлениеЕсли мы предположим, что это знак минус , то все начинает немного фокусироваться:

То, что делает код, это получение идентификатора элемента, который отправляет сообщение (nID) и вычитая из него первое значение в наборе (ID_COLOR_RED).Это означает, что если nID = ID_COLOR_RED, то m_nCurrentColor будет равно 0.

Если значения ID_COLOR_RED, ID_COLOR_GREEN и ID_COLOR_BLUE равны последовательных (иэто большое , если , веская причина, по которой вы не должны писать такой код), тогда если nID = ID_COLOR_GREEN, m_nCurrentColor будет равно 1. Аналогично, если nID =ID_COLOR_BLUE, тогда m_nCurrentColor будет 2.

0 голосов
/ 08 июля 2015

Этот ответ является продолжением моего комментария к вопросу.

Для вашего примера я бы использовал макрос ON_COMMAND_EX с switch(nID) внутри связанной функции. Вы не будете обеспокоены, если идентификатор какой-либо опции в конечном итоге изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...