#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
который затем игнорируется компилятором без ошибок.