Noch nicht erledigt ! C++, ohne MFC, Entertaste im Textfeld erkennen

HansJ

Mitglied
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 ?
 
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.
 
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;
}
 
Also was mir beim Durchlesen auffällt ist deine Deklaration

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

ändere das mal in
Code:
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
 
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?
 
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;
 
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.
 
Die Zeilen
Code:
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 ?
 
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?
 
Zurück