Я новичок в win32 API, и в рамках своего обучения я хочу распечатать координаты моей мыши (LOWORD (lParam), HIWORD (lParam)). Как я могу это сделать? OutputDebugString получает только значение LPCWSTR, поэтому мне нужно преобразовать в него int? или есть лучший способ сделать это?
OutputDebugString int в win32
Ответы (1)
OutputDebugString
умеет только отправлять текстовые строки в отладчик.
OutputDebugString("This works because this is a string.\n");
int x = GetMouseXCoordinate();
OutputDebugString(x); // This doesn't work because x isn't a string.
Если вы хотите напечатать что-то, что еще не является текстовой строкой, вам сначала нужно создать строку с текстовым представлением, а затем отправить ее на OutputDebugString
.
int x = GetMouseXCoordinate();
// Here's a method commonly used in C and C++ to format the value yourself.
char message[63];
sprintf(message, "%d", x);
OutputDebugString(message);
Существуют альтернативы (например, использование itoa
, std::stringstream
, более безопасных версий sprintf
и т. д.). Несмотря на это, это может быть громоздко, если вы хотите отправить много сообщений в окно вывода отладчика. Многие из сообщений, связанных в комментариях к вашему вопросу, представляют собой способы изолировать этап форматирования с помощью макросов препроцессора, перегрузок функций С++ или шаблонов. Все эти решения имеют компромиссы.
Мое личное решение состоит в том, чтобы вывести свой собственный тип буфера потока из std::basic_streambuf
и переопределить пару его виртуальных методов, чтобы направить вывод на подключенный отладчик. Затем я создаю экземпляр выходного потока с именем dbg
, который использует мой строковый буфер. Итак, когда я хочу вывести в окно отладки, я просто использую вывод в формате C++:
dbg << "Mouse coordinates: " << x << ", " << y << std::endl;
В релизных сборках dbg
— это фиктивный класс, который ничего не делает, а оптимизатор достаточно умен, чтобы не утруждать себя созданием какого-либо кода форматирования и вывода.
OutputDebugStringW
. - person IInspectable   schedule 28.12.2020printf
заходите в буфер памяти, используяvsprintf
семейство функций. - person IInspectable   schedule 28.12.2020std::ostringstream
. - person Remy Lebeau   schedule 28.12.2020OutputDebugString
, если мне не изменяет память - я просто пришел сюда, чтобы поделиться ссылкой. Я открыт для того, чтобы оказаться неправым. Причина, по которой я не хочу углубляться в этот C или этот C++, заключается в том, что мы должны признать иронию, заключающуюся в том, что компилятор Microsoft Visual C++ взаимодействует с WinAPI, написанным на C. - person amn   schedule 25.02.2021