2013-06-14 3 views
0

У меня есть простое диалоговое окно со списком, полем редактирования и двумя кнопками, «Отправить» и «Очистить», «Отправить» по умолчанию. Когда он нажимается, строка считывается из окна редактирования и добавляется в список. Ясно говорит сам за себя. Когда я нажимаю кнопку ввода в первый раз, все работает, однако, когда я нажимаю второй раз, он не отвечает/не регистрируется. Если кнопка нажата, все работает по назначению.По умолчанию кнопка работает только один раз

Я попытался использовать DM_SETDEFID после изменения фокуса обратно в поле редактирования, это ничего не делало.

Удалите ненужный код, поэтому я надеюсь, что ничего не пропало.

INT_PTR CALLBACK CHAT(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_INITDIALOG: 
     return (INT_PTR)TRUE; 

    case WM_COMMAND: 
     if (LOWORD(wParam) == IDC_BUTTON1) 
     { 
       string strDisplay="You: "+strMessage; 
       TCHAR szDisplay[MESSAGE_SIZE]; 
       strcpy_s(szDisplay, strDisplay.c_str()); 

       SendDlgItemMessage(hDlg, IDC_LIST1, LB_ADDSTRING, NULL, (LPARAM)&szDisplay); 
       SetDlgItemText(hDlg, IDC_EDIT1, ""); 
      } 
      SetFocus(GetDlgItem(hDlg, IDC_EDIT1)); 
     } 
     else if(LOWORD(wParam) == IDC_BUTTON2) 
     { 
      SetDlgItemText(hDlg, IDC_EDIT1, ""); 
     } 
     break; 
    case WM_CLOSE: 
     { 
      EndDialog(hDlg, LOWORD(wParam)); 
      return (INT_PTR)TRUE; 
     } 
    } 
    return (INT_PTR)FALSE; 
} 

В файле ресурсов:

IDD_CHAT_DIALOG DIALOGEX 0, 0, 309, 176 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "Chat" 
FONT 8, "MS Shell Dlg", 400, 0, 0x1 
BEGIN 
    LTEXT   "Message:",IDC_STATIC,198,12,102,8 
    EDITTEXT  IDC_EDIT1,198,24,102,108,ES_MULTILINE 
    DEFPUSHBUTTON "Send",IDC_BUTTON1,198,138,104,14 
    PUSHBUTTON  "Clear",IDC_BUTTON2,198,156,104,14 
    LISTBOX   IDC_LIST1,7,7,185,167,LBS_NODATA | LBS_NOSEL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP 
END 
+0

Вы можете опубликовать код? – MDMoore313

+0

@ MDMoore313 Done – BioCycle

ответ

6

У вас есть контроль редактирования многострочного. Как только он получит фокус, он обработает все нажатия клавиши ENTER.

Это по дизайну. Если кнопка управляла нажатиями клавиши ENTER, когда элемент управления редактирования имеет фокус, как вы можете ввести новую строку в элементе управления редактированием?

Если вам необходимо остановить многострочный элемент управления редактированием от ENTER, тогда вы можете обращаться с WM_GETDLGCODE, чтобы это устраивало. Техника объясняется здесь: http://blogs.msdn.com/b/oldnewthing/archive/2006/10/12/819674.aspx


Как и в сторону, то strcpy_s ложна. Вызовите c_str() в своей строке и передайте ее непосредственно функции API.

+0

Могу ли я просто использовать GetAsyncKeyState, или я должен переделать его вместо поиска работы? – BioCycle

+0

'GetAsyncKeyState' не годится. Я добавил к ответу, чтобы объяснить «правильный» способ сделать это. Я спрашиваю вас, если вы уверены, что хотите это сделать. Как пользователь будет вводить линейные каналы в этом элементе управления? Или это только для чтения? –

+0

Пользователь будет отправлять (короткие) сообщения, поэтому символы новой строки не важны, спасибо за вашу помощь! – BioCycle

Смежные вопросы