エディットボックスに入力した文字をENTERを押してリストボックスに表示するには?

解決


ロボ  2003-09-18 18:26:41  No: 52155  IP: [192.*.*.*]

チャットソフトを製作しているのですが、エディットボックスに入力したものをENTERを押してリストボックスに送るということがうまくいきません。

case WM_KEYDOWN:
        switch(wp)
        {
        case VK_RETURN:

これを使うんだと思いますが、どうもうまくいきません。
FocusがEDITboxにきていないのが原因だと思うのですが・・・。
ご教授お願いいたします。

編集 削除
ロボ  2003-09-18 18:29:47  No: 52156  IP: [192.*.*.*]

書き忘れましたが、使用ソフトはVC++(ver6.0)です。
よろしくお願いします。

編集 削除
ぴのきよ  2003-09-19 16:27:52  No: 52157  IP: [192.*.*.*]

もし的外れだったらごめんなさい。
MFCを使用されているのなら、エディットボックスの親ウィンドウの
PreTranslateMessageを使用してみたらどうでしょうか?

↓こんなかんじ-------------------------------------------
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
{
  // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
  if (pMsg->message==WM_KEYDOWN
    && pMsg->wParam==VK_RETURN
    && pMsg->hwnd==GetDlgItem(IDC_EDIT1)->m_hWnd)
  {
    CString str;
    GetDlgItem(IDC_EDIT1)->GetWindowText(str);
    ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(str);
    return TRUE;
  }
  return CDialog::PreTranslateMessage(pMsg);
}
-------------------------------------------

編集 削除
ロボ  2003-09-19 17:31:23  No: 52158  IP: [192.*.*.*]

ぴのきよさん、書き込みありがとうございます!
あ〜、すみません。MFCは使わないで、APIを使って作っています。
書くの忘れててすみません。。

編集 削除
ぴのきよ  2003-09-20 10:59:45  No: 52159  IP: [192.*.*.*]

エディットコントロールのスタイルにES_MULTILINEを追加すれば、
WM_KEYDOWNでとれるみたいです。

それか、メッセージループでディスパッチする前に捕まえるとか・・・。

一緒に勉強させて頂いてます。

編集 削除
ロボ  2003-09-21 11:32:46  No: 52160  IP: [192.*.*.*]

//エディットコントロールのスタイルにES_MULTILINEを追加すれば、
//WM_KEYDOWNでとれるみたいです。

書き込みありがとうございます!
やってみましたがどうもうまくできませんでした。プログラムを起動して何もしないうちにENTERを押すと認識してるみたいなんですが、EDITボックスにフォーカスがあたっていると認識してくれないんですよね〜。

//一緒に勉強させて頂いてます。
私もやり始めたばっかりでぜんぜん理解できてないです^^;

編集 削除
ぴのきよ  2003-09-21 13:56:36  No: 52161  IP: [192.*.*.*]

これでそれらしく動いてますが・・・。
どうでしょうか?
-----------------------------------------------------------------

#include "StdAfx.h"
#include "Resource.h"

BOOL CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK HatugenProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

WNDPROC hHatugenEditProc;

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
   // TODO: この位置にコードを記述してください。
  if (DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDLG),
    NULL, (DLGPROC)MainDlgProc) == -1)
    return -1;


  return FALSE;
}

BOOL CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  HWND hEdit;
  switch(uMsg)
  {
  case WM_INITDIALOG:
    // エディットコントロールのサブクラス化
    hEdit = GetDlgItem(hwndDlg, IDC_ED_HATUGEN);
    hHatugenEditProc = (WNDPROC)GetWindowLong(hEdit, GWL_WNDPROC);
        SetWindowLong(hEdit, GWL_WNDPROC, (LONG)HatugenProc);
    
    return TRUE;
    break;
  case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDCANCEL:
      PostQuitMessage(0);
      break;
    }
  }
  return FALSE;
}

LRESULT CALLBACK HatugenProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  switch (uMsg)
  {
  case WM_KEYDOWN:
    if ((int)wParam==VK_RETURN)
    {
      char szMsg[512];
      GetWindowText(hwnd, szMsg, sizeof(szMsg)-1);
      HWND hList = GetDlgItem(GetParent(hwnd), IDC_LST_LOG);
      SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)szMsg);
      SetWindowText(hwnd, "");
    }
    break;
  default:
    return (CallWindowProc(hHatugenEditProc, hwnd, uMsg, wParam, lParam));
  }
  return 0L;
}

編集 削除
ロボ  2003-09-21 18:54:55  No: 52162  IP: [192.*.*.*]

できました!本当にありがとうございました!
すぐ返信してもらえて本当に助かりました!

編集 削除