[C++ WINAPI] Problem beim Erstellen einer Fenster-Unterklasse

radazong

Mitglied
Hallo Community,

Ich komme irgendwie auf keinen grünen Zweig bei meinem Problem, das sich wie folgt äußert:

Ich habe per .rc-Datei einen Dialog erzeugt, in dem Eingabefelder sind. Nun wollte ich eine Art Passwort-Eingabefeld mit verschlüsselter Ausgabe - z.B. Sternchen - erzeugen.
Dazu habe ich mir dann den Weg der Fenster-Unterklassen gewählt, und dem entsprechenden Feld diese U.-Klasse zugewiesen:

C++:
	case WM_INITDIALOG:
						hEdit=GetDlgItem(hDlg,IDD_PW);

						oldproc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
		return TRUE;

Die Unterklasse ist im Moment mehr ein Dummy, und sieht wie folgt aus:

C++:
LRESULT CALLBACK EditProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch(msg)
	{
	case WM_SETFOCUS: MessageBox(0,L"Hallo",L"Test",MB_OK);
		break;
	case WM_CHAR:
	case WM_KEYDOWN: MessageBox(hDlg,L"Tschö",L"Test",MB_OK);
		break;
	}
	return CallWindowProc(oldproc,hDlg,msg,wParam,lParam);
}

Setze ich jetzt allerdings den Fokus auf das Feld, bekomme ich keine "Hallo"-MB, und genauso bekomme ich bei Zeicheneingabe leider auch keine "Tschö"-MB.
oldproc ist übrigens eine globale Variable, und auch ein Aufruf von CallWindowProc() im default-Zweig der switch-Schleife hat keine Änderung gebracht.

Ich hoffe jemand von euch ist blickiger als ich, und kann mir bei diesem wahrscheinlich total simplen Problem helfen.

Greetz,

RadAzonG
 
Zuletzt bearbeitet von einem Moderator:
Ich hab dein Problem nicht wirklich verstanden. Wieso weißt du deinem Eingabe-Feld
nicht einfach eine Variable in welche die Eingabe geschrieben wird und eine zweite von welche im Feld angezeigt wird. Einfach dann immer bei Tastendruck oder so Updaten.
 
Hi,
genauso wie du es sagst soll es ja auch ablaufen. Die Fensterprozedur für Edit-Felder ist jedoch in den Tiefen von Windows vordefiniert, und genau zwischen die Tastatureingabe und die Verarbeitung der Eingabe in dieser Prozedur möchte ich ja mit dieser Unterklasse gehen.

Der Sinn dieser ist es nämlich, dass ich für mich interessante Nachrichten selber bearbeiten kann (in meinem Fall WM_CHAR und WM_KEYDOWN), und den Rest einfach an die Standardprozedur weitergeben kann.

Aber vielleicht hab ich mich in meinem Vorhaben auch total verfahren, und denk zu kompliziert. Wenn du ein kleines Codebeispiel für deinen Vorschlag hättest, wäre ich dir dankbar.

Greetz,

RadAzonG
 
Guten Morgen,

So, wie bereits befürchtet bin ich selber drauf gekommen. Bloß hab ich keinen Schimmer wieso es bis heute auf Biegen und Brechen nicht wollte, und jetzt anstandslos funktioniert.

Habe mir überlegt, dass das EDIT-Feld ja eventuell (warum auch immer) nicht auf WM_CHAR, sondern auf WM_SETTEXT reagiert. Dann habe ich zu Testzwecken WM_SETFOCUS gegen eben diese WM getauscht und auf einmal funktioniert alles super.

Selbst als ich dann wieder SETFOCUS eingesetzt hab und auf WM_CHAR reagiert habe, funktionierte alles noch super.

Also erklären kann ich mir dieses Verhalten nicht, aber mein "Problem" jedenfalls ist damit aus der Welt.

Greetz,

RadAzonG
 
Zurück