Avatar billede wofd Nybegynder
05. april 2005 - 20:37 Der er 7 kommentarer

Fange enter-key i fra en edit control

Mit interface består af en dialogbox, som jeg har lavet i en resource editor. Når WinMain kaldes starter viser jeg blot boksen.
<code>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_WINMATHCALC), NULL, MathCalcDlgProc);
    return 1;
}
</code>

Men hvordan fanger jeg enter keyen i fra en edit control på min dialogboks? WM_KEYDOWN virker åbenlyst ikke - HJÆLP :D

På forhånd tak
WOFD
Avatar billede bertelbrander Novice
05. april 2005 - 20:48 #1
Måske skal du kikke på ES_WANTRETURN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_edit_styles.asp

Er det en multi-line edit-control?
Avatar billede bertelbrander Novice
05. april 2005 - 20:59 #2
Du kan også instalere din egen WndProc for edit-controllen med SetWindowLong (GWL_WNDPROC):
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windowclasses/windowclassreference/windowclassfunctions/setwindowlong.asp

Du checker så for WM_KEYDOWN i din wndproc, og kalder default handler for alt andet end din Return.
Avatar billede bertelbrander Novice
06. april 2005 - 01:01 #3
Nå, det var ikke så let.

Et "lille" program der virker:
#include <windows.h>

HINSTANCE InstanceHandle;
LRESULT (CALLBACK *OldEditProc )(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK EditProc(HWND HwndEdit, UINT msg, WPARAM wParam, LPARAM lParam)
{
  if(msg == WM_KEYDOWN)
  {
      if(wParam == VK_RETURN)
      {
        MessageBox(HwndEdit, "Got it", "Whatever", MB_OK);
        return 0;
      }
  }

  return CallWindowProc(OldEditProc, HwndEdit, msg, wParam, lParam);
}

bool Done = false;
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_INITDIALOG:
      HWND Edit;
      Edit = GetDlgItem(hwndDlg, 140);
      OldEditProc = (WNDPROC )GetWindowLong(Edit, GWL_WNDPROC);
      SetWindowLong(Edit, GWL_WNDPROC, (LONG )EditProc);
      return TRUE;
    case WM_CLOSE:
      EndDialog(hwndDlg, 0);
      Done = true;
      return TRUE;
  }
  return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
  HWND WindowHandle = CreateDialog(hInstance, MAKEINTRESOURCE(130), 0, DialogProc);
  ShowWindow(WindowHandle, SW_SHOW);
  MSG Msg;
  while(!Done && GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if((Msg.message == WM_KEYDOWN && Msg.wParam == VK_RETURN) || !IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }
  return 1;
}

Edit controllen hedder 140, dialogbox templaten har id 130.

Normalt fanger jeg Enter med en default button.
Avatar billede wofd Nybegynder
06. april 2005 - 07:20 #4
Want return virkede ikke :(

Men mange tak bertelbrander, har ledt hele internettet igennem efter det svar. Poster du ikke lige en svar :D
Avatar billede wofd Nybegynder
06. april 2005 - 07:24 #5
PS: Det sidste eksempel virkede perfekt ! :D
Avatar billede bertelbrander Novice
07. april 2005 - 01:26 #6
Jeg samler ikke på point.
Avatar billede wofd Nybegynder
07. april 2005 - 11:07 #7
ok :D mange tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester