[Dev-C++] Potwierdzanie tekstu w RichEdit za pomocą Entera

0

Witam.

Mam problem polegający na potwierdzaniu tekstu wpisanego w RichEdit za pomocą Entera.
Próbowałem to zrobić w następujący sposób:

-wpisz hasło do kontrolki RichEdit
-WM_KEYDOWN sprawdza, czy Enter został naciśnięty
-Jeśli tak, to program symuluje naciśnięcie przycisku "Szukaj" i tekst zostaje wyświetlony.

Sposób wydaje się dobry, lecz po wpisaniu tekstu do kontrolki, naciskając Enter, tworzymy nową linię w RichEdit (U mnie jest to zablokowane, więc słyszymy specyficzny dźwięk), a nie symulujemy naciśnięcie przycisku "szukaj".

Ustawienie Focusa też nic nie pomogło, gdyż Focus jest ustawiany tylko przy uruchamianiu aplikacji. Naciskając na RichEdit w celu wpisanie słowa do szukania, Focus się kasuje.

Próbowałem szukać rozwiązania w Googlach, lecz nie znalazłem interesujących mnie wyników.

A więc pytanie brzmi: Co zrobić, by program "wiedział", że po wciśnięciu Entera, nie wstawiaćnowej linii, tylko symulował naciśnięcie przycisku "szukaj"?

Z góry dzięki za odpowiedzi!

0

Wyślij do niego EM_SETEVENTMASK z lParam=ENM_KEYEVENTS, wtedy w WM_NOTIFY odbierasz EN_MSGFILTER, gdzie sprawdzasz czy (MSGFILTER*)lParam.msg, .wParam i .lParam odpowiadają wciśnięciu klawisza VK_RETURN i ewentualnie wywołujesz swoje OnCommand(IDC_FIND);

0

Nie wiem, czy dobrze rozumiem, ale

SendMessage(hText, EM_SETEVENTMASK, 0, ENM_KEYEVENTS);

Mam umieścić w WM_COMMAND.

A jeżeli chodzi o drugą część to w WM_NOTIFY muszę umieścić:

if((MSGFILTER*)lParam.msg == VK_RETURN)

Ten kod wywołuje u mnie 3 błędy:

expected primary-expression before '*' token
expected primary-expression before ')' token
expected ')' before "lParam"
0

dodaj #include <richedit.h>

0

richedit.h mam dodane od dawna. Oto lista plików dołączonych do programu:

#include <windows.h>
#include <richedit.h>
#include <commctrl.h>
0
if(((MSGFILTER*)lParam)->msg == VK_RETURN)
0

Dobrze. Program już się kompluje bez żadnych błędów, lecz nadal nie reaguje na naciśnięcie Entera...
Zamieszczam tutaj mocno okrojony kod programu (usunąłem tu wszystko, co nie jest związane z moim problemem):

#include <windows.h>
#include <richedit.h>
#include <commctrl.h>

HWND hSearchControl, hButton, hText, hWnd;
HFONT hFontButton;
CHAR szClassName[] = "MainWindow";
HINSTANCE* hInst;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lStart, INT nShow)
{
  LoadLibrary("RICHED32.DLL");
  
  hInst = &hInstance;
  WNDCLASSEX wc;
  wc.hInstance = *hInst; 
  wc.lpszClassName = szClassName;
  wc.lpfnWndProc = WndProc;
  wc.style = 0;
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.hIcon = LoadIcon(0, IDI_APPLICATION);
  wc.hIconSm = LoadIcon(0, IDI_APPLICATION);
  wc.hCursor = LoadCursor(0, IDC_ARROW);
  wc.lpszMenuName = "Menu";
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND; 
  if(!RegisterClassEx(&wc))
    return 0;
  hWnd = CreateWindowEx(0, szClassName, "Co jest nie tak?", WS_OVERLAPPEDWINDOW, 20, 20, 680, 480, 0, 0, *hInst, 0);      
  ShowWindow(hWnd, nShow);
  MSG msgs;
  while(GetMessage(&msgs, 0, 0, 0))
  {
    TranslateMessage(&msgs);
    DispatchMessage(&msgs);
  }
  return msgs.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar)
{
  switch(msg)
  {
    case WM_CREATE:
      //tworzę RichEdit
      hSearchControl = CreateWindowEx(WS_EX_CLIENTEDGE, "richedit", 0, WS_CHILD|WS_VISIBLE, 10, 110, 570, 25, hwnd, 0, *hInst, 0);
      //tworzę przycisk
      hButton = CreateWindowEx(0, WC_BUTTON, "Szukaj", WS_CHILD|WS_VISIBLE, 590, 110, 70, 25, hwnd, (HMENU)0, *hInst, 0);
      hFontButton = CreateFont(16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Arial CE");
      SendMessage(hButton, WM_SETFONT, (WPARAM)hFontButton, 1);
      //tworzę RichEdit
      hText = CreateWindowEx(WS_EX_CLIENTEDGE, "richedit", 0, WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOVSCROLL|WS_VSCROLL|ES_READONLY, 10, 145, 650, 270, hwnd, (HMENU)0, *hInst, 0);
      
      SendMessage(hSearchControl, EM_SETEVENTMASK, 0, ENM_KEYEVENTS);
      break;
    case WM_NOTIFY:
      if(((MSGFILTER*)lPar) -> msg == VK_RETURN)
          MessageBox(0, "Naciśnięto Enter", "", MB_ICONINFORMATION);
      break;
    case WM_COMMAND:
      if(wPar == 0)
          MessageBox(0, "Naciśnięto przycisk Szukaj", "", MB_ICONINFORMATION);
      break;
    case WM_DESTROY:
      DestroyWindow(hSearchControl);
      DestroyWindow(hButton);
      DestroyWindow(hText);
      PostQuitMessage(0);
      break;
    default:
      return DefWindowProc(hwnd, msg, wPar, lPar);
  }
  return 0;
}

Co tu jest nie tak?

0

Nie lepiej zrobic subclassing RichEdita i przechwytywac WM_KEYDOWN? Ja bym tak do tego podchodzil i to chyba najlepszy sposob. (w kazdym razie na pewno bardziej przejrzysty)

0

othello, Twój pomysł działa :-)

Dzięki wszystkim za pomoc w rozwiązaniu problemu! :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1