2016-03-20 100 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); 
};