2015-05-29 17 views
0

我一直在搭建一個簡單的Win Api程序(使用CodeBlocks)並且遇到了一個奇怪的問題。Win API錯誤的文本框輸出

case WM_COMMAND:{ 
     if (LOWORD(wParam) == Calculate) { 
      int A=0, ArrayReset = 0; 
      char textread[256]; 
      SendMessage((HWND)Box1,(UINT) EM_GETLINE, (WPARAM)1, (LPARAM)&textread); 
      A = atoi(textread); 
      itoa(ArrayReset, textread, 10); 

      itoa(A, textread, 10); 
      SendMessage((HWND)Box1,(UINT) WM_SETTEXT, (WPARAM)1,(LPARAM)&textread); 

(我的程序更復雜一點,但是這僅僅是顯示問題點) 現在,我所期望的代碼做的是閱讀BOX1值,將其轉換成整數,轉換它返回到char數組,並將該數組重新打印到同一個Box1上。基本上,一些轉換沒有差異的最終結果。 但是,有這個奇怪的問題。該代碼適用於單個數字的數字,但如果我輸入數字更多的數字,如12或356,則分別獲得1200和3560。如果輸入的數字大於一千,它再次正常工作。 這是一個問題,因爲我的方法重置數組的值回到0,還是它必須做一些轉換過程?

回答

0

我想你有幾個問題。

首先,你沒有告訴我們什麼Parse1是。請注意,您必須在緩衝區的第一個字中設置緩衝區的大小。另外,爲什麼你通過1作爲WPARAM?這是從多行編輯控件中檢索的從零開始的索引,但如果編輯是單行,則會被忽略。

另外,什麼是第一個itoa調用?

這裏是工作的例子:

TCHAR textread[256] = {0}; 
*(reinterpret_cast<WORD*>(&textread)) = 256; 
::SendMessage(hwnd, EM_GETLINE, 0, reinterpret_cast<LPARAM>(&textread)); 

auto n = _ttoi(textread); 

_itot_s(n, textread, 256, 10); 

::SendMessage(hwnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(&textread)); 
+0

Parse1實際上應該textread。我正在複製部分代碼並更改變量以使其更易於理解。猜猜我忽略了一個。 我不確定WARAM是幹什麼的,在這個 有點新了第一個itoa調用是刪除數組中的所有以前的數據。 謝謝你的例子,但它似乎並沒有爲我工作。 有錯誤告訴我,「ISO C++禁止聲明'n'沒有類型」 和 「_itot_s'未聲明(首次使用此函數)」 – Luxor

+0

'auto'是C++ 11中的新增功能,因此您必須使用一個較老的編譯器 –

0

有這個代碼一些錯誤。

對於初學者,(LPARAM)&textread應該是(LPARAM)textread(LPARAM)&textread[0]

但更重要的是,你是不是正確準備EM_GETLINE消息:

lParam的
的指針,接收行的副本緩衝區。 在發送消息之前,請將此緩衝區的第一個字設置爲緩衝區的TCHAR中的大小。對於ANSI文本,這是字節數;對於Unicode文本,這是字符數。 第一個單詞中的大小被複制的行覆蓋。

試試這個:

case WM_COMMAND:{ 
    if (LOWORD(wParam) == Calculate) { 
     int A = 0; 
     TCHAR textread[256]; 

     *((LPWORD)&textread) = 256; // <-- add this 
     SendMessage(Box1, EM_GETLINE, 0, (LPARAM)textread); 

     _stscanf(textread, _T("%d"), &A); 
     _stprintf(textread, _T("%d"), A); 

     SendMessage(Box1, WM_SETTEXT, 0, (LPARAM)textread); 
    } 
    break; 
+1

或者只使用'GetDlgItemInt'。 –