Winapi 我无法在格式化的消息框中打印数字
以下代码不能正常工作<代码>%i未与其变量连接Winapi 我无法在格式化的消息框中打印数字,winapi,unicode,printf,messagebox,Winapi,Unicode,Printf,Messagebox,以下代码不能正常工作%i未与其变量连接 #include<Windows.h> #include<stdio.h> #include<tchar.h> /* SCREENSIZE.C This project contains the code that Programming Windows book by Charles Petzold is using. */ int cdecl MessageBoxPrintfW(
#include<Windows.h>
#include<stdio.h>
#include<tchar.h>
/* SCREENSIZE.C
This project contains the code that Programming Windows
book by Charles Petzold is using.
*/
int cdecl MessageBoxPrintfW(TCHAR *msgBoxTitle, TCHAR *msgBoxFormat, ...)
{
//define buffer
TCHAR msgBoxBuffer[1024];
//define iteration pointer
va_list argPtr;
//start iteration
va_start(argPtr, msgBoxFormat);
/*int _vsnwprintf_s(
wchar_t *const _Buffer,
const size_t _BufferCount,
const size_t _MaxCount,
const wchar_t *const _Format,
va_list _ArgList)
*/
_vsntprintf_s(msgBoxBuffer, sizeof(msgBoxBuffer) / sizeof(TCHAR), (sizeof(msgBoxBuffer) / sizeof(TCHAR)) - 1, msgBoxFormat, argPtr);
//end iteration
va_end(argPtr);
//Use return type to pass preconfigured MessageBox(0,"Text","Title",MB_OKCANCEL);
//Whe we use L before a string example: L"text" it is considered UNICODE format.
return(MessageBox(0, msgBoxFormat, msgBoxTitle, MB_OKCANCEL));
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR pCmdLine,
int iCmdShow)
{
int cxScreen, cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
MessageBoxPrintfW(TEXT ("SCREENSIZE"), TEXT("The screen is %i pixels wide by %i pixels high."), cxScreen, cyScreen);
return(0);
}
#包括
#包括
#包括
/*屏幕尺寸.C
此项目包含用于编程Windows的代码
查尔斯·佩佐尔德的书正在使用。
*/
int-cdecl-MessageBoxPrintfW(TCHAR*msgBoxTitle,TCHAR*msgBoxFormat,…)
{
//定义缓冲区
TCHAR msgBoxBuffer[1024];
//定义迭代指针
va_列表参数;
//开始迭代
va_启动(argPtr,msgBoxFormat);
/*int\u vsnwprintf\u s(
wchar_t*常量缓冲区,
常量大小\u t\u缓冲计数,
常量大小\u t\u最大计数,
常量wchar\u t*常量格式,
va_列表_ArgList)
*/
_vsntprintf_s(msgBoxBuffer,sizeof(msgBoxBuffer)/sizeof(TCHAR),(sizeof(msgBoxBuffer)/sizeof(TCHAR))-1,msgBoxFormat,argPtr);
//结束迭代
va_端(argPtr);
//使用返回类型传递预配置的MessageBox(0,“文本”,“标题”,MB_OKCANCEL);
//当我们在字符串前面使用L时,例如:L“text”,它被认为是UNICODE格式。
返回(消息框(0,msgBoxFormat,msgBoxTitle,MB_-OKCANCEL));
}
int-WINAPI-WinMain(
HINSTANCE HINSTANCE,
HINSTANCE HPPrevenstance,
LPSTR pCmdLine,
int iCmdShow)
{
int cxScreen、cyScreen;
cxScreen=GetSystemMetrics(SM_cxScreen);
cyScreen=GetSystemMetrics(SM_cyScreen);
MessageBoxPrintfW(文本(“屏幕大小”)、文本(“屏幕宽%i像素,高%i像素”)、cxScreen、cyScreen;
返回(0);
}
为什么会发生这种情况
下面是我得到的输出:
请注意,您正在写入msgBoxBuffer
,但从未使用msgBoxBuffer
。因此,您的消息框不会改变任何内容。请尝试以下操作:
int MessageBoxPrintfW(const TCHAR *msgBoxTitle, const TCHAR* msgBoxFormat, ...)
{
va_list args;
va_start(args, msgBoxFormat);
int len = _vsctprintf(msgBoxFormat, args) + 1; // add terminating '\0'
TCHAR *buf = new TCHAR[len];
_vstprintf_s(buf, len, msgBoxFormat, args);
int result = MessageBox(0, buf, msgBoxTitle, MB_OKCANCEL);
delete[]buf;
return result;
}
对于C
版本,使用malloc(len*sizeof(TCHAR))
代替new
,使用free
代替delete[]
请注意,您正在写入msgBoxBuffer
,但从未使用msgBoxBuffer
。因此,您的消息框不会改变任何内容。请尝试以下操作:
int MessageBoxPrintfW(const TCHAR *msgBoxTitle, const TCHAR* msgBoxFormat, ...)
{
va_list args;
va_start(args, msgBoxFormat);
int len = _vsctprintf(msgBoxFormat, args) + 1; // add terminating '\0'
TCHAR *buf = new TCHAR[len];
_vstprintf_s(buf, len, msgBoxFormat, args);
int result = MessageBox(0, buf, msgBoxTitle, MB_OKCANCEL);
delete[]buf;
return result;
}
对于
C
版本,使用malloc(len*sizeof(TCHAR))
而不是new
,使用free
而不是delete[]
显示的是格式,而不是缓冲区。您想要什么?您没有使用msgBoxBuffer
而是显示msgBoxFormat
谢谢您的帮助。您正在显示格式,而不是缓冲区。您想要什么?你不用msgBoxBuffer
而是显示msgBoxFormat
谢谢雷米帮助编辑。天哪,你们是对的,我很困惑,写了参数的名称而不是实际的缓冲区,然后我就看不见了。我想当然地认为这种感觉是正确的。请注意,如果要使用new TCHAR[]
,那么最好使用std::vector
甚至std::basic_string
,这样您就不需要手动调用delete[]
。另一方面这个代码是在一个文件中,它使用了<代码> .c/c>文件扩展名,所以它假定使用C而不是C++。里米是正确的。我不知道C++,我不想使用它直到我掌握了C。我所做的每一件事都尽量保持它的纯C。我认为我应该非常舒服地使用C,然后移到C++……这就是我的感受。如果您使用的是*.c扩展名,那么new
操作符也不会工作。你似乎在使用C++,你应该坚持下去,除非你真的需要C。也许你在说避免<代码> STD< /COD>标准库。我可能应该在这里使用std::vector
,并保存了几行代码。顺便说一下,出于调试目的,您也可以使用OutputDebugString
,或者只是在要检查的变量处放置一个断点。天哪,您是对的,我很困惑,写了参数的名称而不是实际的缓冲区,然后我就看不见了。我想当然地认为这种感觉是正确的。请注意,如果要使用new TCHAR[]
,那么最好使用std::vector
甚至std::basic_string
,这样您就不需要手动调用delete[]
。另一方面这个代码是在一个文件中,它使用了<代码> .c/c>文件扩展名,所以它假定使用C而不是C++。里米是正确的。我不知道C++,我不想使用它直到我掌握了C。我所做的每一件事都尽量保持它的纯C。我认为我应该非常舒服地使用C,然后移到C++……这就是我的感受。如果您使用的是*.c扩展名,那么new
操作符也不会工作。你似乎在使用C++,你应该坚持下去,除非你真的需要C。也许你在说避免<代码> STD< /COD>标准库。我可能应该在这里使用std::vector
,并保存了几行代码。顺便说一下,出于调试目的,您也可以使用OutputDebugString
,或者在要检查的变量处设置断点。