Winapi 如何使用(本机Win32 API)制作计算器?

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”) 这个错误的原

我是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”)

这个错误的原因是数据类型之间的转换


请任何人帮助我

您的项目未设置为使用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函数在我的代码中不起作用