Zum Inhalt springen

Hilfe um ActiveX Steuerelement zu entwickeln


Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

:)

Link zu diesem Kommentar
Auf anderen Seiten teilen

So hab die beiden Probleme selbst gelöst bekommen. Ist nicht schön aber Selten :rolleyes:


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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Monate später...

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...