Winapi 我无法在格式化的消息框中打印数字

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(

以下代码不能正常工作<代码>%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(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
,或者在要检查的变量处设置断点。