2013-04-05 21 views
3

我有一個編輯控件:Edit控件不能設置文本空字符串

HWND hInput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
     WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | 
      ES_WANTRETURN, 
    0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_INPUT, GetModuleHandle(NULL), NULL); 

當一個按鈕被按下,我正從它的文本,並嘗試用空字符串替換它:

 TCHAR buff[2048]; 
     memset(buff,0,2048); 
     GetWindowText(hInput, buff, 2048); 
     SetWindowText(hInput,""); 

但之後在編輯控件中還剩下一條新線。

任何想法如何刪除這條新線?提前致謝。

編輯: 其實然後按下按鈕沒關係,沒有新行。

編輯控件具有一個消息過程,該過程捕獲輸入鍵,並在按下按鈕時執行與按鈕相同的操作。這裏是程序:

LRESULT CALLBACK SubClassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_KEYDOWN: 
     switch (wParam) 
     { 
     case VK_RETURN: 
      TCHAR buff[2048]; 
      memset(buff,0,2048); 
      GetWindowText(hInput, buff, 2048); 
      SetWindowText(hInput,""); 
      break; 
     } 
     break; 

    } 
    return CallWindowProc(DefProc, hwnd, msg, wParam, lParam); 
} 

但這裏它留下了新的路線。

+0

似乎很難相信。作爲memset的意思是無意義的,你不檢查錯誤。 – 2013-04-05 19:51:55

+0

你是否在任何機會將它設置爲空字符串後按回車? – 2013-04-05 19:53:09

+0

對不起,我錯了。我做了一個編輯。 – 2013-04-05 20:21:00

回答

2

當您處理WM_KEYDOWN時,您已成功清除編輯控件。

然後,您將該消息傳遞給基類,這是編輯控件,它將回車插入到文本中。這是一個理論。如果它是正確的,那麼簡單地不發送WM_KEYDOWN消息到基類將解決問題。

另一種理論是,WM_KEYDOWN後面跟着一個WM_CHAR(由TranslateMessage合成),並且編輯控件添加了基於該消息的回車。如果它是正確的,那麼你有一個有趣的情況,你說你想要一個多行編輯控件,但是你試圖在用戶每次嘗試創建一個新行時清除內容。

我錯過了ES_WANTRETURN。這與對話框代碼一起工作,以確保它不會完全竊取回車按鍵。這就是爲什麼我改變了我原來的答案。

+0

如果我設置或不設置'ES_WANTRETURN'標誌,則沒有區別。但是捕獲「WM_KEYUP」消息是關鍵。我不知道你爲什麼從答案中刪除它。感謝您的幫助。 – 2013-04-05 20:37:50

+0

當'wParam'爲'VK_RETURN'時,不要將'WM_KEYDOWN'消息傳遞給'CallWindowProc()'。清除Edit控件後,只需'返回0'。 – 2013-04-05 23:34:27