Winapi 如何使用(本机Win32 API)制作计算器?
我是Win32Api的初学者,我曾尝试制作计算器,但由于数据类型之间的转换,我失败了 示例:Winapi 如何使用(本机Win32 API)制作计算器?,winapi,visual-c++,Winapi,Visual C++,我是Win32Api的初学者,我曾尝试制作计算器,但由于数据类型之间的转换,我失败了 示例: int N1 = GetDlgItemText(WID,IDC_N1,NULL,NULL); int N2 = GetDlgItemText(WID,IDC_N2,NULL,NULL); int RESULT = N1+N2; MessageBox(NULL,RESULT,L"Message",MB_OK); 上面的例子告诉我以下错误 (无法将参数2从“int”转换为“LPCWSTR”) 这个错误的原
int N1 = GetDlgItemText(WID,IDC_N1,NULL,NULL);
int N2 = GetDlgItemText(WID,IDC_N2,NULL,NULL);
int RESULT = N1+N2;
MessageBox(NULL,RESULT,L"Message",MB_OK);
上面的例子告诉我以下错误
(无法将参数2从“int”转换为“LPCWSTR”)
这个错误的原因是数据类型之间的转换
请任何人帮助我您的项目未设置为使用Unicode,但您正在将一个宽字符串传递给
MessageBox
。你可以:
1) 更改项目设置,使其默认为Unicode;或
2) 显式调用MessageBoxW
;或
3) 删除
L
,并使用非Unicode API。您的项目未设置为使用Unicode,但您正在向MessageBox
传递一个宽字符串。你可以:
1) 更改项目设置,使其默认为Unicode;或
2) 显式调用MessageBoxW
;或
3) 删除
L
,并使用非Unicode API。您需要将Unicode字符串而不是int传递给MessageBox
wchar_t ResStr[100]; //define string
_itow(RESULT, ResStr, 10); //convert int result to string
MessageBox(NULL, ResStr, L"Message",MB_OK); //now display string
您需要将unicode字符串而不是int传递给MessageBox
wchar_t ResStr[100]; //define string
_itow(RESULT, ResStr, 10); //convert int result to string
MessageBox(NULL, ResStr, L"Message",MB_OK); //now display string
以下是任务的正确代码:
wchar_t Str1[100], Str2[100], ResStr[100];
GetDlgItemText(WID, IDC_N1, Str1, 100);
GetDlgItemText(WID, IDC_N2, Str2, 100);
int N1 = _wtoi(Str1);
int N2 = _wtoi(Str2);
int RESULT = N1 + N2;
_itow(RESULT, ResStr, 10);
MessageBox(NULL, ResStr, L"Message",MB_OK);
有用的链接:以下是任务的正确代码:
wchar_t Str1[100], Str2[100], ResStr[100];
GetDlgItemText(WID, IDC_N1, Str1, 100);
GetDlgItemText(WID, IDC_N2, Str2, 100);
int N1 = _wtoi(Str1);
int N2 = _wtoi(Str2);
int RESULT = N1 + N2;
_itow(RESULT, ResStr, 10);
MessageBox(NULL, ResStr, L"Message",MB_OK);
有用的链接:看起来您只需要转到项目>属性>配置属性>并将“字符集”更改为多字节。它可能是Unicode,我认为这会起作用,因为在更改字符集之前,当我尝试使用WinAPI MessageBox()时,总是会遇到这个错误。也许你想做些不同的事?但这应该会有所帮助…看起来您只需要转到项目>属性>配置属性>并将“字符集”更改为多字节。它可能是Unicode,我认为这会起作用,因为在更改字符集之前,当我尝试使用WinAPI MessageBox()时,总是会遇到这个错误。也许你想做些不同的事?但是这应该会有帮助…有一个API用于此。使用
GetDlgItemInt
有一个用于此的API。使用GetDlgItemInt
chys——我已经使用了以下代码:#ifdef UNICODE#define MessageBox MessageBoxW#else#define MessageBox MessageBoxA#endif/!UNICODE------问题仍然是问题不是因为UNICODE/ansi,问题是因为MessageBox需要以null结尾的字符串作为第二个参数,而不是integer.chys,--我已经使用了以下代码:#ifdef UNICODE#define MessageBox MessageBoxW#else#define MessageBox MessageBoxA#endif/!UNICODE-------问题仍然是问题不是因为UNICODE/ansi,问题是因为MessageBox需要以null结尾的字符串作为第二个参数,而不是整数。这是代码的第二个问题。GetDlgItemText以字符串而不是整数的形式返回文本。本页有一个使用此函数的示例:这是代码的第二个问题。GetDlgItemText以字符串而不是整数的形式返回文本。本页有一个使用此函数的示例:@Michael-此函数适用于整数,但对于浮点数noFor float,您可以使用_wtof和_gcvt函数,并将N1、N2和结果声明为“double”。但是_gcvt函数适用于ANSI,不适用于宽字符您是正确的。swprintf(Str1,L“%f”,YourFloatVariable)可以工作。@Michael-这对于整数很好,但是对于浮点数noFor float,你可以使用_wtof和_gcvt函数,当然可以将N1、N2和结果声明为“double”。但是对于ANSI,gcvt函数不适用于宽字符,你是正确的。swprintf(Str1,L“%f”,您的floatvariable)将起作用。您必须使用MAKEINTRESOURCE(IDC_N1)。需要做更多的工作,如果没有wcstol(),就无法将字符串填充到int中。@Hans Passant:MAKEINTRESOURCE函数对我的代码不起作用您必须使用MAKEINTRESOURCE(IDC_N1)。需要做更多的工作,如果没有wcstol(),就无法将字符串填充到int中。@Hans Passant:MAKEINTRESOURCE函数在我的代码中不起作用