Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Bedingung "symbolleistenbutton gedrückt"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ]
020
31.05.2003, 20:15 Uhr
Dirk22



Danke für die Antwort. Mit den booleschen Variablen haut es im Prinzip schon hin. Ich habe herausgefunden, dass die Updatefunktion immer nach einer beliebigen Aktion des Benutzers ausgeführt wird. D.h., wenn der Benutzer z.B. den Startbutton drückt, dann werden alle Updatefunktionen nach der Ausführung der Funktion, die auf den Startbutton reagiert ausgeführt. Doch leider ist mir das zu spät, da meine Startbuttonroutine eigentlich nie von selber aufhört, sondern erst, wenn man den Stopbutton drückt. Ich muss es deshalb irgendwie schaffen, dass die Updatefunktionen gleich nach dem Drücken des Startbuttons aufgerufen werden können. Denn ich möchte haben, dass direkt nach Drücken des Startbuttons der Startbutton deaktiviert wird.

Hast du vielleicht irgendeine Idee, was man da machen könnte?

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
31.05.2003, 21:19 Uhr
mike
Pinguinhüpfer
(Operator)


Hi
Also ich glaube ich versteh dein Problem nicht ganz
Meinst du sowas?

C++:
void CMainFrame::OnStart()
{
    // TODO: Code für Befehlsbehandlungsroutine hier einfügen
    m_b = TRUE;
}

void CMainFrame::OnStop()
{
    // TODO: Code für Befehlsbehandlungsroutine hier einfügen
    m_b = FALSE;
}

void CMainFrame::OnUpdateStart(CCmdUI* pCmdUI)
{
    // TODO: Code für die Befehlsbehandlungsroutine zum Aktualisieren der Benutzeroberfläche hier einfügen
        if(m_b)
        pCmdUI->Enable(FALSE);
    else
        pCmdUI->Enable(TRUE);
}

void CMainFrame::OnUpdateStop(CCmdUI* pCmdUI)
{
    // TODO: Code für die Befehlsbehandlungsroutine zum Aktualisieren der Benutzeroberfläche hier einfügen
    if(m_b)
        pCmdUI->Enable(TRUE);
    else
        pCmdUI->Enable(FALSE);
}


In OnCreate mit m_b = TRUE initialisieren

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
31.05.2003, 22:02 Uhr
Dirk22



Ja, genau das meine ich. Und genauso habe ich es auch gemacht.
Und im Prinzip funktioniert das ja auch. Wenn ich in der Funktion OnStart() nur wenig Code habe. Denn die Updatefunktionen werden nach dem Ausführen von z.B. OnStart() erst aufgerufen.
Und mein Problem ist nun, dass in meiner OnStart() Funktion soviel Code steht, so dass die Updatefunktion erst sehr spät aufgerufen wird. Und ich suche jetzt nach einer Möglichkeit, dass die Updatefunktionen nicht wie implizit nach einer Funktion, die durch eine Benutzeraktion ausgelöst wurde, aufgerufen wird, sondern dass sie direkt am Anfang von OnStart() aufgerufen wird.

Vielen Dank im Voraus

Dirk

P.S.: Falls mein Problem noch unklar ist, probiere ich es mal genauer zu beschreiben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
31.05.2003, 22:11 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Naja. Wenn in OnStart eine rechenintensive Funktion ist, dann musst da das halt in einen Thread packen, um den GUI nicht zu blockieren. Eine andere Möglichkeit fällt mir momentan nicht ein.

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
31.05.2003, 23:14 Uhr
Dirk22



Das habe ich bereits mit PumpMessage() und PeekMessage() gelöst. Dies kommt am Anfang dieses Threads. Der Benutzer kann während der OnStart() Funktion ganz normal die GUI bedienen. Aber was bringt mir das bei dem Startbutton deaktivieren? Denn auch wenn der Benutzer die GUI bedienen kann, so wird die Updatefunktion erst aufgerufen, wenn die OnStart() Funktion fertig ist, denke ich. Und der Startbutton soll ja genau dann deaktiviert werden, während die OnStart() Funktion läuft.

Kann man die Updatefunktion explizit in der OnStart() Funktion aufrufen?
Wenn ja, wie?

Ich will dich jetzt auch nicht unnötig damit nerven. Falls dir was einfällt, würde ich mich sehr darüber freuen. Falls nicht, werde ich selber noch weiter ausprobieren. Ich will auf keinen Fall, dass du wegen diesem Problem viel Zeit investieren musst.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
31.05.2003, 23:20 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Nemo problemo
Naja. Wenn ich zum Bsp. meine DB connecte dauerd das eine Zeit lang. Das pack ich halt in nen simplen Thread und kann inzwischen im GUI weiterarbeiten. Vielleicht kannst du deine schleife in der Update Funktion aufrufen. Du müsstest halt schaun, ob vorher die Start Funktion aufgerufen wurde löl
Wie man die Update Funktion direkt aufgerufen wird, weiß ich nicht. Könnte eventuell mit UpdateWindow() oder so funtzen.

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
02.06.2003, 11:18 Uhr
Dirk22



Vielen Dank für deine Antwort Mike. Das mit der Schleife in die Updatefunktion zu nehmen und davor eine Überprüfung zu machen, ob auch die Startfunktion vorher aufgerufen wird, klingt eigentlich logisch und müsste funktionieren. Ich habe es gerade mal ausprobiert, aber es funktioniert noch nicht. Ich muss mal schauen, ob ich den Fehler noch finde.

zur anderen Lösung:
Mit UpdateWindow() ist irgendwie nichts passiert. Die Lösung, dass man alle Updatefunktionen explizit von irgendwo im Code aufrufen kann, wäre mir am liebsten. Wäre super, wenn irgendjemand mir den Befehl dafür nennen könnte.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
02.06.2003, 13:09 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Eine Möglichkeit gäbes es da noch - muss ich mir noch genauer anschauen. Du könntest ja die Funktion eigetlich weiterverwendetn - also:

C++:
virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);


Es gibt nämlich anscheinden 2 Konstruktoren:

C++:
CToolBar::OnUpdateCmdUI( pTarget, bDisableIfNoHndler);



Mal schaun, obs vielleicht damit geht. Sonst muss du halt nach einer passenden Message suchen -> Spy++

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
04.06.2003, 11:54 Uhr
Dirk22



Hi Mike,

hast du schon rausgefunden, wie es geht? Wenn ja, wäre es super, wenn du mir diese Sache mit der virtuellen Funktion erklären könntest. Und wie ich diese in meinem Programm anwenden soll. Ich habe noch nie mit virtuellen Funktionen gearbeitet.

Hoffentlich gibt es eine einfache Lösung für dieses Problem, d.h. explizites aufrufen der Updatefunktionen.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
04.06.2003, 22:16 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Hab noch eine schnellere Methode gefunden:
Laut MSDN

Zitat:

The following topics explain the use of update handlers:

When update handlers are called
The ON_UPDATE_COMMAND_UI macro
The CCmdUI class



Also:

C++:
m_b = TRUE;
m_wndToolBar.SendMessage(WM_INITMENUPOPUP,0,0);


Mein Testprogramm: hab m_b mit FALSE initialsiert - der Button war deaktiviert. Hab einen Timer auf 3000ms gestellt un hab den Code oben aufgerufen und der Button war wiedr aktiviert.

Ich hoffe das löst dein Problem

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: