2016-03-20 101 views
1

我有一个编辑框,其属性为ES_NUMBER,并在按钮上尝试检查编辑框的值是否介于2和15之间(包含)。从WinAPI的编辑窗口中正确提取int以进行逻辑测试

检查了StackOverflow后,我发现强烈建议使用strtol()而不是atoi(),但是都没有成功地允许我执行必要的检查。请参阅下面的当前代码。

char buff[1024]; 
GetWindowText(hWndNoOfTeams, (LPWSTR)buff, 1024); 
int i; 
i = strtol(buff,NULL,10); 
    if ((i > 1)&&(i < 16)){ 
      MessageBox(hWnd, (LPCWSTR)buff, L"MSGBOX", MB_OK); 
    }else{ 
      MessageBox(hWnd, L"The number of teams must be greater than 1 and less than 16.", L"MSGBOX", MB_OK); 
    }; 

该测试在0和9之间正常工作,但是,除此之外它总是显示第二个消息框。我怀疑问题在于从字符串中提取整数的方法,因为所有值buff数组都包含正确的值。

道歉,如果我错过了应该显而易见的东西。

回答

0
GetWindowText(hWndNoOfTeams, (LPWSTR)buff, 1024); 

决不投什么LPWSTRLPSTR或任何有关这一点。编译器告诉你,GetWindowText()正在等待一个宽字符串,它是一个数组WCHAR s,而不是一个数组char s。宽字符API默认加载,因为所有新的Windows程序应该都支持Unicode。

对于宽字符串有单独的转换例程,如wcstol()

在Windows上查找UNICODE_UNICODE宏和Unicode处理以获取更多信息。

0

您正在使用的Win32 API函数的Unicode版本,所以你需要使用Unicode字符缓冲区和strtol将Unicode版本()来匹配:

WCHAR buff[1024] = {0}; 
GetWindowText(hWndNoOfTeams, buff, 1024); 
int i = wcstol(buff, NULL, 10); 
if ((i > 1) && (i < 16)) { 
    MessageBox(hWnd, buff, L"MSGBOX", MB_OK); 
} else { 
    MessageBox(hWnd, L"The number of teams must be greater than 1 and less than 16.", L"MSGBOX", MB_OK); 
};