tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
663
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
    Siehe bitte dazu das Thema "C++, ohne MFC, Entertaste im Textfeld erkennen" an.

    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 ?
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    flixt, habe gerade im anderen Thread drauf geantwortet.

    Im Prinzip musst du nur das HWND haben (ob von CreateWindow oder GetDlgItem oder wieauchimmer), und das in SetWindowLong stecken.
     

  3. #3
    HansJ HansJ ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Beiträge
    92
    Hallo noch mal,
    leider bekomme ich noch 3 warning´s beim compelieren:
    Die ersten beiden in der Zeile "return CallWindowProc(..."
    Der dritte in der Zeile "pOldWndProc = (WNDPROC)SetWindowLong( hctl_zstand....)"
    Was mache ich falsch ?

    Die Fehler:
    warning C4047: 'function' : 'long (__cdecl *)(struct HWND__ *,unsigned int ,unsigned int ,long )' differs in levels of indirection from 'struct HWND__ *'

    warning C4024: 'CallWindowProcW' : different types for formal and actual parameter 1

    warning C4047: '=' : 'struct HWND__ *' differs in levels of indirection from 'long (__cdecl *)(struct HWND__ *,unsigned int ,unsigned int ,long )'

    Ein Teil meines Codes:

    #include <windows.h>
    #include <windowsx.h>
    #include "resource.h"

    LRESULT CALLBACK BasicScanProc(HWND,UINT,WPARAM,LPARAM);
    HWND pOldWndProc;

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow)
    {
    int nResult;
    hInst = hInstance;
    nResult = DialogBox(hInstance, MAKEINTRESOURCE IDD_DIALOG_SSCAN), NULL, BasicScanProc);
    return nResult;
    }

    LRESULT MyEditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    if ((uMsg == WM_KEYDOWN) && (wParam == VK_RETURN))
    {
    swprintf(szTest,_T("%c"),wParam);// Nur zum testen
    }

    return CallWindowProc(pOldWndProc, hwnd, uMsg, wParam, lParam);
    }

    LRESULT CALLBACK BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {

    hctl_zstand = GetDlgItem(hwnd,IDC_EDIT_STAND);
    // IDC_EDIT_STAND ist die ID des Edit Feldes

    pOldWndProc = (WNDPROC)SetWindowLong( hctl_zstand, GWL_WNDPROC, (LONG_PTR)MyEditProc);
    switch(uMsg)

    case WM_INITDIALOG:

    usw .....

    return FALSE;
    }
     

  4. #4
    Byteblaster Byteblaster ist offline Mitglied Bronze
    Registriert seit
    Apr 2004
    Ort
    Villingen-Schwenningen
    Beiträge
    34
    Also was mir beim Durchlesen auffällt ist deine Deklaration

    Code :
    1
    
    HWND pOldWndProc;
    (6 Zeile) im gepostetem Code

    ändere das mal in
    Code :
    1
    
    WNDPROC pOldWndProc;

    vielleicht reicht das schon. Es sieht nach den Fehlermeldungen zumindest stark danach aus. (Ich habe den Code noch nicht weiter analysiert)

    Gruß Byteblaster
     

  5. #5
    HansJ HansJ ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Beiträge
    92
    Nein das funktioniert leider nicht, dann bekomme ich die Fehler und noch einige neue Fehler.
     

  6. #6
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Das Ändern auf WNDPROC ist schon richtig. Du musst bei deiner MyEditProc auch das CALLBACK angeben:

    LRESULT CALLBACK MyEditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

    Welche Fehler bekommst du dann noch?
     

  7. #7
    HansJ HansJ ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Beiträge
    92
    Dann bekomme ich keinen Fehler mehr angezeig, beim Starten stürzt es ab und das Editfeld IDC_EDIT_STAND ist nicht sichtbar, die beiden anderen sind noch zusehen.

    Wenn ich die Zeile

    hctl_zstand = GetDlgItem(hwnd,IDC_EDIT_STAND);

    heraus nehme, started das Programm zwar funktioniert aber nicht.

    In der Deklaration nach den include Anweisungen steht noch:
    HWND hctl_zstand;
     

  8. #8
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Das

    hctl_zstand = GetDlgItem(hwnd,IDC_EDIT_STAND);
    // IDC_EDIT_STAND ist die ID des Edit Feldes

    pOldWndProc = (WNDPROC)SetWindowLong( hctl_zstand, GWL_WNDPROC, (LONG_PTR)MyEditProc);

    darf nicht mehrmals aufgerufen werden. So wie es im Moment vor dem Switch/Case steht, wird bei jeder Windows-Nachricht eine neue WindowProc reingesetzt und die alte gemerkte überschrieben. Am Ende gibt es dann einen Stackoverflow, weil MyEditProc über CallWindowProc sich selber rekursiv aufruft.

    Kopiere den Codeschnipsel am besten in WM_INITDIALOG.
     

  9. #9
    HansJ HansJ ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Beiträge
    92
    Die Zeilen
    Code :
    1
    2
    3
    4
    
    hctl_zstand = GetDlgItem(hwnd,IDC_EDIT_STAND); 
    // IDC_EDIT_STAND ist die ID des Edit Feldes
     
    pOldWndProc = (WNDPROC)SetWindowLong( hctl_zstand, GWL_WNDPROC, (LONG_PTR)MyEditProc);

    habe ich jetzt in den Abschnitt WM_INITDIALOG kopiert, das Programm läuft auch, aber mir fehlt noch ein Ereigniss wenn das Textfeld IDC_EDIT_STAND den Focus erhält so das dann MyEditProc ausgeführt wird.
    Kann ich dazu EN_SETFOCUS benutzen und wie ist der Syntax ?
     

  10. #10
    HansJ HansJ ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Beiträge
    92
    Es funktioniert jetzt.
    Verstehe ich es richtig, wenn ich mit der Tab Taste in dieses Editfeld gehe oder den Focus hinein setze, das dadurch die Nachrichtenschleife MyEditProc für dieses Editfeld aufgerufen wird?
     

  11. #11
    Byteblaster Byteblaster ist offline Mitglied Bronze
    Registriert seit
    Apr 2004
    Ort
    Villingen-Schwenningen
    Beiträge
    34
    Ja genau. Sobald das Element irgend eine Nachricht bekommt wird zuerst deine eingesetzte Funktion also MyEditProc() aufgerufen. Und Sachen die du nicht behandelst gibst du über die Zeile.
    Code :
    1
    
    return CallWindowProc(pOldWndProc, hwnd, uMsg, wParam, lParam);
    an die alte Orginalfunktion weiter.

    Gruß byteblaster
     

Ä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. Exaktes Datum erkennen, und noch etwas
    Von CrimeTime im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 29.10.06, 22:11
  4. Wie lange noch ohne OOP
    Von Robert Steichele im Forum PHP
    Antworten: 3
    Letzter Beitrag: 25.08.06, 11:34
  5. Antworten: 6
    Letzter Beitrag: 29.11.05, 08:33