GetSystemMetrics(SM_CYSCREEN); |给出错误的值|但是 GetSystemMetrics(SM_CXSCREEN);给出正确的值
GetSystemMetrics(SM_CYSCREEN); | Gives wrong value| but GetSystemMetrics(SM_CXSCREEN); gives correct value
我对 GetSystemMetrics(SM_CYSCREEN);
有疑问 – 每次我 运行 程序时,此函数 returns 的高度都是随机的,但宽度函数 GetSystemMetrics(SM_CXSCREEN);
给出了正确的值。
这是我的代码:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
int MessageBoxPrintf(const wchar_t * szCaption, const wchar_t * szFormat, ...) {
wchar_t buffer[1024];
va_list v1;
va_start(v1, szFormat);
wchar_t* c = va_arg(v1, wchar_t*);
wsprintf(buffer, szFormat, c); //gives formated output to buffer
va_end(v1);
return MessageBox(NULL, buffer, szCaption, 0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
int cxScreen, cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
MessageBoxPrintf(TEXT("ScreenRes"), TEXT("The screen is %i pixels wide by %i pixels high"), cxScreen, cyScreen);
return 0;
}
这个程序基本上只是一个带有 WinAPI 和 C++ 的格式字符串消息框。
您发布的代码显示(几乎可以肯定)未定义的行为,因为您在 MessageBoxPrintf
函数中处理可变参数列表的方式不正确。
在 wchar_t* c = va_arg(v1, wchar_t*);
行中,你是 'assuming' 一个单一的 wchar_t
参数——但是,在你的 main
函数中,你传递了 两个int
个参数。这可能会或不会产生有意义的结果; – 在你的情况下,似乎第一个 int
参数被随后对 wsprintf
的调用正确解释,但第二个参数有点“在翻译中丢失”(表现出上述未定义的行为)。
要正确处理可变参数列表,您需要提取它,然后将其 未处理 传递给 vswprintf
function,然后它可以正确解释该参数列表:
int MessageBoxPrintf(const wchar_t* szCaption, const wchar_t* szFormat, ...)
{
wchar_t buffer[1024];
va_list v1;
va_start(v1, szFormat);
vswprintf(buffer, 1024, szFormat, v1);
va_end(v1);
return MessageBox(NULL, buffer, szCaption, 0);
}
我对 GetSystemMetrics(SM_CYSCREEN);
有疑问 – 每次我 运行 程序时,此函数 returns 的高度都是随机的,但宽度函数 GetSystemMetrics(SM_CXSCREEN);
给出了正确的值。
这是我的代码:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
int MessageBoxPrintf(const wchar_t * szCaption, const wchar_t * szFormat, ...) {
wchar_t buffer[1024];
va_list v1;
va_start(v1, szFormat);
wchar_t* c = va_arg(v1, wchar_t*);
wsprintf(buffer, szFormat, c); //gives formated output to buffer
va_end(v1);
return MessageBox(NULL, buffer, szCaption, 0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
int cxScreen, cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
MessageBoxPrintf(TEXT("ScreenRes"), TEXT("The screen is %i pixels wide by %i pixels high"), cxScreen, cyScreen);
return 0;
}
这个程序基本上只是一个带有 WinAPI 和 C++ 的格式字符串消息框。
您发布的代码显示(几乎可以肯定)未定义的行为,因为您在 MessageBoxPrintf
函数中处理可变参数列表的方式不正确。
在 wchar_t* c = va_arg(v1, wchar_t*);
行中,你是 'assuming' 一个单一的 wchar_t
参数——但是,在你的 main
函数中,你传递了 两个int
个参数。这可能会或不会产生有意义的结果; – 在你的情况下,似乎第一个 int
参数被随后对 wsprintf
的调用正确解释,但第二个参数有点“在翻译中丢失”(表现出上述未定义的行为)。
要正确处理可变参数列表,您需要提取它,然后将其 未处理 传递给 vswprintf
function,然后它可以正确解释该参数列表:
int MessageBoxPrintf(const wchar_t* szCaption, const wchar_t* szFormat, ...)
{
wchar_t buffer[1024];
va_list v1;
va_start(v1, szFormat);
vswprintf(buffer, 1024, szFormat, v1);
va_end(v1);
return MessageBox(NULL, buffer, szCaption, 0);
}