Guybrush Threepwood Geschrieben 17. Januar 2006 Teilen Geschrieben 17. Januar 2006 Ich brauche für ein Programm in einer anderen Sprache ein Editfeld bei dem ich darauf reagieren kann wenn die Pfeil Tasten gedrückt werden. In der anderen Sprache (Cobol) ist es leider nicht möglich auf den Pfeil nach Links oder Rechts zu reagieren weil der nur intern für die Navigation im Feld genutzt wird. Ich hab mir also gedacht das man ein Steuerelement entwickeln könnte das sich wie ein normales Edit Feld verhält und zusätzlich einen Event sendet wenn man im Feld am linken Rand steht und nochmal nach Links drückt bzw. am Rechten Rand steht und nach Rechts drückt. Das Problem ist nur das ich noch nie Steuerelement geschrieben habe und im Moment etwas auf dem Schlauch stehe. Ich würde im VC++6 ein MFC Aktive X Steuerelement auswählen und da sagen das es auf einem Edit basiert. Die Funktionen um die Größe des Feldes zu setzen und den Inhalt zu erhalten werde ich bestimmt auch noch hinbekommen. Aber wie funktioniert das mit den Events? Wie sage ich dem OCX das es bei einem Bestimmten Vorfall einen Event auslösen soll auf den ich mit dem anderen Programm reagieren kann? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 17. Januar 2006 Autor Teilen Geschrieben 17. Januar 2006 Ok das mit den Events hab ich mittlerweile raus wie ich die einrichten muss. Jetzt muss ich den Event aber ausführen wenn die entsprechende Taste gedrükt wird. Ich hab mir dazu im Klassenassistenten eine Nachrichtenzuordnung für einen Tastendruck erstellt: void CCmseditCtrl::OnKeyPressEvent(USHORT nChar) { // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen COleControl::OnKeyPressEvent(nChar); switch(nChar) { case VK_RIGHT: { FireMoveOut(2); } break; case VK_LEFT: { FireMoveOut(4); } } } [/PHP] Der Event MOveOut soll halt je nach Taste mit unterschiedlichem Parameter aufgerufen werden. Ich muss jetzt allerdings noch feststellen wo der Tastaturcursor im Edit Feld steht und genau da ist das Problem. Ich bin mit dem MFC Gerüst nicht so bewandert, wie komme ich an das Edit Feld ran? Ich hab mir gedacht das ich die Position mit CEdit::GetSel bekomme, aber ich habe ja nirgendwo eine Instanz von CEdit :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 17. Januar 2006 Autor Teilen Geschrieben 17. Januar 2006 Hab mittlerweile ein bisschen weitergebastelt und auchgemarkt das ich die Pfeiltasten in OnKeyPress nicht mitbekomme. Hab das ganze dann mal in PreTranslateMessage gesteckt und hier bekomme ich die Nachricht immer 2 mal :confused: BOOL CCmseditCtrl::PreTranslateMessage(MSG* pMsg) { // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen if (pMsg->message == WM_KEYDOWN) { ::MessageBox(NULL,"sdfvzb","kshdvb",0); } return COleControl::PreTranslateMessage(pMsg); } [/PHP] Hab also jetzt 2 Probleme wo ich erstmal nicht weiter komme: -Die Nachricht des Tastendrucks kommt 2 mal an -Ich weiß nicht wie ich mit dem Editfeld kommunizieren kann Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 17. Januar 2006 Autor Teilen Geschrieben 17. Januar 2006 So hab die beiden Probleme selbst gelöst bekommen. Ist nicht schön aber Selten BOOL CCmseditCtrl::PreTranslateMessage(MSG* pMsg) { // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen static int i = 0; i++; if (i>2) i=1; if (pMsg->message == WM_KEYDOWN && i == 1) { int iStart = 0, iEnd = 0, iAnz = 0; SendMessage(EM_GETSEL,(WPARAM)&iStart,(LPARAM)&iEnd); switch((int)pMsg->wParam) { case VK_UP: { FireMoveOut(1); } break; case VK_RIGHT: { iAnz = SendMessage(WM_GETTEXTLENGTH,0,0); if (iAnz == iStart && iAnz == iEnd) FireMoveOut(2); } break; case VK_DOWN: { FireMoveOut(3); } break; case VK_LEFT: { if (iStart == 0 && iEnd == 0) FireMoveOut(4); } } } return COleControl::PreTranslateMessage(pMsg); } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 30. Januar 2006 Autor Teilen Geschrieben 30. Januar 2006 ich will wenn ich die Nachricht EN_KILLFOCUS erhalte einen Event auslösen. Dazu hab ich folgendes: LRESULT CCmseditCtrl::OnOcmCommand(WPARAM wParam, LPARAM lParam) { #ifdef _WIN32 WORD wNotifyCode = HIWORD(wParam); #else WORD wNotifyCode = HIWORD(lParam); #endif switch (wNotifyCode) { case EN_KILLFOCUS: { FireLostFocus(); } } // ZU ERLEDIGEN: Hier auf wNotifyCode schalten. return 0; } [/PHP] Wenn ich jetzt im Testcontainer 2 dieser Controls einfüge und mit Tab zwischen denen hin und her wechsle klappt das einwandfrei. Stehe ich aber jetzt im 1. Control und klicke mit der Maus ins 2. dann bekomme ich von beiden den LostFocus Event :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 30. Januar 2006 Autor Teilen Geschrieben 30. Januar 2006 So hab noch ein bisschen rumprobiert und zu Testzwecken das Selbe für EN_SETFOCUS mit dem Event GetFocus hinzufügt. Wenn ich nun im Testcontainer in das andere Control klicke und die Maus gedrückt halte bekomme ich den GetFocus Event. Lasse ich die Maustaste dann los bekomme ich den LostFocus und direkt danach wieder den GetFocus Event. Das sieht also so aus als würde das Feld während des reinklickens den Focus erst nochmal verlieren, aber das kann doch so nicht normal sein oder? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 10. April 2006 Autor Teilen Geschrieben 10. April 2006 Also das Steuerelement funktioniert eigentlich tadellos in meiner Cobol Anwendung. Allerdings musst ich jetzt in der Cobol Anwendung sagen das das Steuerelement Tab und Enter verwendet damit durch drücken dieser Tasten kein automatischer Sprung ins nächte Steuerelement stattfindet. Das funktioniert auch, allerdings ertönt seit dem beim drücken von Enter, Tab oder ESC innhalb dieses Steuerelments immer der Standard Windows Warnton und ich hab keine Ahnung warum :confused: Ich hab auch mal bei anderen standard Cobol Steuerelementen die beiden Flags für Enter und Tab gesetzt und dort ertönt der Sound nicht, also muss es irgendwie mit dem ActiveX zusammenhängen. Habt ihr eine Idee woran das liegen könnte? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.