Как мне вызвать другой регистр при нажатии кнопки

#c #winforms #winapi #visual-c

#c #winforms #winapi #visual-c

Вопрос:

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

 case Execute_Button:
    INPUT_FIELD;
    break;
case INPUT_FIELD:
    if (HIWORD(wParam) == EN_MAXTEXT) {
        char cText[INPUT_CHAR_LIMIT];
        SendMessage((HWND)lParam, WM_GETTEXT, INPUT_CHAR_LIMIT, (LPARAM)cText);

        if (strcmp(cText, "") == 0)
            break;

        SendMessage((HWND)lParam, WM_SETTEXT, NULL, (LPARAM)"");

        //std::string command = cText;
        HandleCommand(cText);
    }

    break;
}
break;
  

Любая помощь? Я, честно говоря, не знаю, что делать.

Комментарии:

1. Оконная процедура получит сообщение WM_COMMAND при нажатии кнопки. Вы обрабатываете эти обращения там?

2. Да, у меня есть обработчик для команд в Main.cpp .

3. итак, если вы нажмете эту кнопку, ничего не произойдет? Это то, что вы имели в виду?

4. Да, ничего не происходит, я не знаю почему.

5. Ваш код не имеет большого смысла. Отредактируйте свой вопрос, чтобы добавить больше деталей и больше кода…

Ответ №1:

C не предоставляет способа перехода от регистра к регистру, за одним исключением: если у вас нет break , continue return или другого вида инструкции потока управления в конце тела обращения, она попадет в следующее тело обращения (без повторной проверки условия).

Если ExecuteButton и INPUT_FIELD находятся рядом друг с другом, то

 case ExecuteButton:
case INPUT_FIELD:
    // shared code
  

Или ExecuteButton может иметь свой собственный код перед INPUT_FIELD ‘s.

 case ExecuteButton:
    // some code
    // fall through
case INPUT_FIELD:
    // shared code
  

// fall through Комментарий не является обязательным, но его включение делает ваш код более понятным для чтения другими.

Однако, если ExecuteButton и INPUT_FIELD не являются смежными, вы должны реструктурировать свой код, чтобы разместить общий код где-нибудь еще (например, в функции), где оба могут получить к нему свободный доступ.


Что касается

     INPUT_FIELD;
  

Причина, по которой это ничего не делает, но все еще компилируется, заключается в том, что основным типом оператора в C является «оператор выражения». Помните, что назначения и вызовы функций являются выражениями в C . Всякий раз, когда вы выполняете назначения или вызовы функций, такие как

 x = y   z;
somethingThatReturns(x, y);
  

вы действительно вычисляете выражение, которое выполняет присваивание или вызов функции и приводит к значению ( y z и возвращаемому значению функции, соответственно), значение которого отбрасывается. Итак

     INPUT_FIELD;
  

станет чем-то вроде

     456; // or whatever the value of INPUT_FIELD is
  

который затем игнорируется компилятором без ошибок.