tutorials.de Buch-Aktion 02/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
1043
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    HansJ HansJ ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Beiträge
    92
    In einer Anwendung sind Textfelder, in denen ich über die Tastatur Daten eingeben möchte.
    Wenn ich einem Textfeld den Focus gebe, kann ich darin auch schreiben.
    Aber ich kann nicht feststellen ob die Entertaste gedrückt wurde, damit das Feld wieder verlassen werden kann.
    Bisher habe ich mit diesem Code experimentiert, der funktioniert aber nur wenn kein Textfeld den Focus hat.

    LRESULT CALLBACK BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    if ( wParam == 13 )
    {
    bTest = TRUE; // Nur zum Test für einen Haltepunkt
    return;
    }

    case WM_CHAR:
    if ( wParam == CONTROL_Q )
    {
    PostMessage(hwnd,WM_CLOSE,0,0L);
    return (TRUE);
    }

    swprintf(szTest,_T("%c"),wParam);
    bTest = TRUE;
    break;
    ....
    Geändert von HansJ (28.11.05 um 17:09 Uhr) Grund: Status erledigt
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.144
    Da musst du schon tiefer in die Trickkiste greifen, Stichwort Subclassing.
    Du setzt dem Edit Control mittels SetWindowLong und GWL_WNDPROC eine eigene WindowProc rein; dabei unbedingt alle unbehandelten Nachrichten mittels CallWindowProc an die alte Proc weitergeben. Dann kannst du die Entertaste abfragen, bevor die Edit die bekommt (und bei Bedarf auch einfach nicht weitergeben).
     

  3. #3
    HansJ HansJ ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Beiträge
    92
    Hallo,
    in meinen Büchern habe ich nichts über SetWindowLong und GWL_WNDPROC gefunden. Bei MSDN nur auf den englischen Seiten und das hört sich sehr schwierig an.
    Ist es möglich etwas mehr Hilfe zu bekommen ?
     

  4. #4
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.144
    Im Grunde musst du irgendwo eine WindowProc für dein Edit haben:

    WNDPROC pOldEditProc = NULL;

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    LRESULT MyEditProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
     
      if ( ( uMsg == WM_KEYDOWN )
      && ( wParam == VK_RETURN ) )
      {
        // irgendetwas tun
      }
     
      return CallWindowProc( pOldWndProc, hwnd, uMsg, wParam, lParam );
     
    }

    Dann das Subclassen:
    Code :
    1
    2
    3
    
    HWND  hwndMeinEdit = CreateWindow....
     
    pOldWndProc = (WNDPROC)SetWindowLong( hwndMeinEdit, GWL_WNDPROC, (LONG_PTR)MyEditProc );

    Nach diesem Aufruf laufen alle Messages, die das Edit zu sehen bekommt zuerst durch MyEditProc!

    Hinweis: Für MyEditProc gilt dasselbe wie für alle anderen WindowProcs: Sie können keine Klassen-Member sein, es sei denn, sie sind statisch.
     

  5. #5
    HansJ HansJ ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Beiträge
    92
    Danke du hast mir sehr gehlofen
     

  6. #6
    HansJ HansJ ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Beiträge
    92
    Leider habe ich da doch noch ein Problem.

    In deinem Hinweis, glaube ich zu verstehen, reagierst du darauf das ein neues EditFeld erzeugt wird.

    HWND hwndMeinEdit =CreateWindow....

    In meiner Anwendung habe ich schon Edit Felder, wenn jetzt der Benutzer mit der Tab Taste oder ich den Focus in dieses Edit Feld setze möchte ich dann in die Subclass

    MyEditProc springen um da die Eingaben abzufangen.

    Leider habe ich nicht gefunden. Gibt es dazu eine Möglichkeit ?
    Geändert von HansJ (28.11.05 um 17:08 Uhr) Grund: Status erledigt war gesetzt
     

  7. #7
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.144
    Wenn die Edit-Felder schon existieren ist der Ablauf genau gleich. Wo das HWND herkommt, ist völlig egal. In meinem Beispiel erzeuge ich ein Edit direkt und erhalte das HWND. Bei vorhandenen Edits kannst du dir ja über GetDlgItem das HWND holen (bzw. bei MFC dann noch GetSafeHwnd vom CWnd aus).

    Du musst dir von deinen vorhandenen Edits das HWND besorgen und damit dann SetWindowLong aufrufen.
     

Ähnliche Themen

  1. Textfeld in DB eintragen, ohne linebreaks
    Von MelcomB56 im Forum PHP
    Antworten: 2
    Letzter Beitrag: 29.06.09, 12:42
  2. Clipboard-Update ohne KeyHook erkennen
    Von Coalminer im Forum .NET Café
    Antworten: 3
    Letzter Beitrag: 14.09.08, 17:21
  3. Textfeldeingaben, ohne im Textfeld zu sein
    Von RealHAZZARD im Forum Java
    Antworten: 15
    Letzter Beitrag: 10.10.06, 08:35
  4. Antworten: 10
    Letzter Beitrag: 30.11.05, 18:01
  5. scrollbares Textfeld ohne Frames?
    Von ceralie im Forum HTML & XHTML
    Antworten: 3
    Letzter Beitrag: 12.01.05, 22:29