Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[ C++, kein MFC ]Nachrichten für Dialogelemente abfangen

25 views
Skip to first unread message

Jan Heidbrink

unread,
May 16, 2000, 3:00:00 AM5/16/00
to

Hi
Ich habe eine Dialogbox mit Editfeldern, in welche Zahlenwerte
eingegeben werden sollen. Sobald ein Editfeld den Focus verliert, soll
der eingegebene Wert geprüft werden. Weiss jemand, wie ich das
erreichen kann? Dazu müsste ich ja in der Lage sein, Ereignisse
abzufangen. Ach ja, wie lautet eigentlich die Nachricht, die ein
Element erhält, wenn es den Focus verliert?

Ernst Pfannenschmidt

unread,
May 16, 2000, 3:00:00 AM5/16/00
to

Jan Heidbrink <no_spam_plea...@gmx.de> schrieb in im Newsbeitrag:
39219f1...@130.133.1.4...

EN_KILLFOCUS speziell für das Edit-Control ansonsten WM_KILLFOCUS.

Ernst

P.S.: Diese Problem könntest Du mit der MFC erheblich einfacher lösen.


Lars Laskowski

unread,
May 16, 2000, 3:00:00 AM5/16/00
to
Hai Jan ...

also in WM_COMMAND fragst du über LOWORD(wParam) ab, ob es eine Message für
dein EditControl ist und in dem case für das Edit Control schaust du unter
HIWORD(wParam) nach, ob es sich um EN_KILLFOCUS handelt, dann kannst du
deine Prüfung machen ...

MfG
Lars

Mail: Soft...@e-networld.de
Internet: www.e-networld.de

Michael Winter

unread,
May 16, 2000, 3:00:00 AM5/16/00
to

Hallo Jan,

Jan Heidbrink <no_spam_plea...@gmx.de> schrieb:
[...]


> Ach ja, wie lautet eigentlich die Nachricht, die ein
> Element erhält, wenn es den Focus verliert?

WM_KILLFOCUS sollte Dir weiterhelfen.

Beste Grüße,
Michael


Wolfgang Schröder

unread,
May 17, 2000, 3:00:00 AM5/17/00
to
Hallo,

Jan Heidbrink <no_spam_plea...@gmx.de> schrieb in im Newsbeitrag:
39219f1...@130.133.1.4...
>
> Hi
> Ich habe eine Dialogbox mit Editfeldern, in welche Zahlenwerte
> eingegeben werden sollen. Sobald ein Editfeld den Focus verliert, soll
> der eingegebene Wert geprüft werden. Weiss jemand, wie ich das
> erreichen kann? Dazu müsste ich ja in der Lage sein, Ereignisse

> abzufangen. Ach ja, wie lautet eigentlich die Nachricht, die ein


> Element erhält, wenn es den Focus verliert?

leite von CEdit eine eigene Klasse ab und füge zu dieser Klasse
die folgenden Methoden hinzu::

// Nur Zahlen, den Punkt und Backspace durchlassen
BOOL CFloatValidator::PreTranslateMessage(MSG* pMsg)
{
// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
// Falls eine Tasten-Nachricht erhalten wurde
if (pMsg->message == WM_CHAR)
{
// Zulaessig sind die Zeichen 0..9 . - + und Backspace
bool bValidChar = isdigit(pMsg->wParam) ||
(pMsg->wParam == '.') ||
(pMsg->wParam == '-') ||
(pMsg->wParam == '+') ||
(pMsg->wParam == 0x08);
// Falls ungueltiges Zeichen eingegeben wurde
if (!bValidChar)
{
// Kurzen Ton ausgeben und Nachricht verwerfen
MessageBeep(-1);
return TRUE;
}
}
// Sonst Nachricht 'normal' verarbeiten
return CEdit::PreTranslateMessage(pMsg);
}

// Und hier jetzt den eingegebenen Wert überprüfen
void CFloatValidator::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);

// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen
// Aktuellen Wert aus Editfeld auslesen
CString CInputField;
GetWindowText(CInputField);
float fValue = (float)atof(LPCSTR(CInputField));
// Falls Wert ausserhalb des erlaubten Bereichs
if ((fValue<m_fMin) || (fValue>m_fMax))
{
// Meldung ausgeben
AfxMessageBox("Eingabe außerhalb des erlaubten Bereichs!",MB_OK);
// und vorherigen Wert wieder einsetzen
CString CLastValue;
CLastValue.Format("%.2f",m_fLastValue);
SetWindowText(CLastValue);
// Focus wieder auf Editfeld setzen
SetFocus();
}
// Wert ist im erlaubten Bereich
else
// Letzter gueltiger Wert auf aktuellen Wert setzen
m_fLastValue = fValue;

}

--
Wolfgang Schröder
Home: www.talknet.de/~cppkurs

Wolfgang Schröder

unread,
May 17, 2000, 3:00:00 AM5/17/00
to

Herbert Menke

unread,
May 17, 2000, 3:00:00 AM5/17/00
to
Eigentlich bietet sich hier EN_KILLFOCUS aus. Jedoch ist das System zu
diesem Zeitpunkt in einem instabilen Zustand, die Dokumentation rät
ausdrücklich davon ab, hier die Eingabe zu überprüfen und eventuell eine
Messagbox anzuzeigen oder den Focus zu ändern.

Ausserdem kann man zu diesem Zeitpunkt auch nicht unterscheiden, ob
EN_KILLFOCUS auch durch Drücken der ESC-Taste, Anklicken des ESC-Buttons,
Taskwechsel mit Alt+Tab, Anklicken eines anderen Fensters, etc. ausgelöst
wurde, und eine Überprüfung nicht gewünscht ist.

Eine Möglichkeit ist, eine globales Flag zu setzen und mit PostMessage eine
Nachricht an sich selbst "posten" und dann "verzögert", wenn dann noch das
Flag gesetzt ist, die Überprüfung ausführen. Das Flag wird durch
WM_COMMAND::IDCANCEL, WM_ACTIVATEAPP und WM_QUERYENDSESSION gelöscht.

In der Knowledge Base gibt es 2 Artikel, die dieses Problem behandeln, zwar
für MFC, aber die vorgeschlagene Methode kann auch ohne MFC benutzten.

Q142481 SAMPLE: FCSVAL32 Control-by-Control Validation in MFC
Q114962 SAMPLE: Control-by-Control Validation in MFC

mfg
herbert menke

"Jan Heidbrink" <no_spam_plea...@gmx.de> schrieb im Newsbeitrag
news:39219f1...@130.133.1.4...

Jan Heidbrink

unread,
May 17, 2000, 3:00:00 AM5/17/00
to

Danke für die Lösung!
Hab's jetzt am laufen.

0 new messages