Toolbar Buttons, Problem mit Ein / Ausschalten.
-
Hi Leute ;),
ich hab ein kleines Programm mit einer Toolbar geschrieben, auf dieser Toolbar wurden won mir 2 Burttons eingefügt, einer für Vorwärtsblättern und einer für zurück.
Beim Start des Programms sollen beide Buttons deaktiviert sein, erst wenn eine Datei geladen wurde sollen beide aktiviert werden.Ich habe das wie folgt gelöst :
In der View.h hab ich 2 bool'sche Membervariablen angelegt
BOOL m_bButtonNext; BOOL m_bButtonBack;diese werden im Konstruktor von View.cpp initialisiert
m_bButtonNext = TRUE; m_bButtonBack = TRUE;Im doc.cpp wird in der Fnkt. welche die Daten läd ein globales Flag auf 1 gesetzt um die beiden Buttons zu aktivieren
iTest = 1;Dieses Flag frage ich in der View.cpp in den UpdateFunktionen der beiden Buttons ab
void CTereader0004View::OnUpdateButtonNext(CCmdUI* pCmdUI) { CTereader0004Doc *pDoc = GetDocument (); // TODO: Code für die Befehlsbehandlungsroutine zum Aktualisieren der Benutzeroberfläche hier einfügen pCmdUI->Enable (!m_bButtonNext); if (pDoc->iTest == 1) { pCmdUI->Enable (m_bButtonNext); } }Den gleichn Code hab ich selbstverständlich auch für den andern Butten !
Es funktioniert eigentlich auch, die Buttons werden aktiviert und deaktiviert wenn es sein soll.
Das eigentliche Problem ist, dass wenn beide Buttons aktiviert sind und ich einen davon betätige egal welchen wird zwar der "Code Behind" ausgeführt aber der Button wird nicht als gedrückt dargestellt, zwar ist er aktiviert aber bei klick nicht gedrückt.

Dieses Detail raubt mir schon seit Stunden die Nerven ich krieg es einfach nicht hin, hab schon zig Tuts und in meinen Büchern versucht die Lösung zu finden aber es will nicht

Könnt Ihr mir helfen ?
Vielen Dank schon mal vorab für eure Mühe

ShadowEater
-
Enable heißt aber auch nicht gedrückt, es heißt eben nur "eingeschaltet". Wenn Du den Button nach dem Klick weiter gedrückt darstellen möchtest, dann musst Du SetCheck verwenden.
Geht es Dir darum?
-
Hallo Martin,
danke für Deine schnelle Antwort.
Geht es Dir darum?
ja genau darum gehr's mir.
Ich hab es mit SetCheck verucht, nun ist der Button beim Start deaktiviert aber auch sonderbar grau schraffiert hinterlegt, also nicht auf die Art und Weise deaktiviert wie man das sonst von Windows kennt
.
Außerdem ist der Butten obwohl grau (also deaktiviert) benutzbar ???
Ich mach immer noch was falsch, leider

void CTereader0004View::OnUpdateButtonNext(CCmdUI* pCmdUI) { CTereader0004Doc *pDoc = GetDocument (); // pCmdUI->Enable (!m_bButtonNext); pCmdUI->SetCheck (2); if (pDoc->iTest == 1) { // pCmdUI->Enable (m_bButtonNext); pCmdUI->SetCheck (0); } }Danke für Deine Mühe
ShadowEater
-
P.S.: OnUpdateButton ist doch auch die richtige Funktion oder ?
Danke nochmal
ShadowEater
-
Warum arbeitest Du mit SetCheck(2). Das bedeutet unbestimmt.
SetCheck(1) bedeutet gedrückt.
-
Hmmm, ja stimmt.
Aber es klappt trotzdem nicht.
Ich glaub ich hab mich nicht richtig ausgedrückt.
Was ich möchte ist dass die beiden button beim start deaktiviert sind, wenn eine Dateigeladen wird sollen sie aktiviert werden. Das funktioniert soweit auch mit Enable(). drücke ich aber dann einen der Button wird er nicht als gedrückt dargestellt. Ich möchte das normale Verhalten erreichen also bei gedrücktem Button soll dieser vertieft dargestellt werden wenn die Maustaste losgelassen wird soll er wieder normal (nicht vertieft) dargestellt werden !Aber so klappts leider auch nicht !
void CTereader0004View::OnUpdateButtonNext(CCmdUI* pCmdUI) { CTereader0004Doc *pDoc = GetDocument (); // pCmdUI->Enable (!m_bButtonNext); pCmdUI->SetCheck (0); if (pDoc->iTest == 1) { // pCmdUI->Enable (m_bButtonNext); pCmdUI->SetCheck (1); } }Grus
ShadowEater
-
Raff ich nicht. Dieses Verhlaten ist doch das normale. SetCheck wir dnur benötigt um bleibend einen Button gedrückt erscheinen zu lassen....
Also musst Du doch nur Enable mit TRUE und FALSE aufrufen wann es Dir passt.
void CTereader0004View::OnUpdateButtonNext(CCmdUI* pCmdUI) { CTereader0004Doc *pDoc = GetDocument (); pCmdUI->Enable(pDoc->DasDokumentIstGeladen()); }
-
Hi ;),
...bleibend einen Button gedrückt erscheinen zu lassen....
Genau, dafür benötige ich SetCheck(). Aber der Button soll nicht permanent gedrückt erscheinen sondern nur wenn er gedrückt wird. Wird die Maustaste losgelassen soll er nach oben "springen" darüm benötige ich wie Du schon gesagt hast nur Enable() True / False zum ein und ausschalten !
invoid CTereader0004View::OnUpdateButtonNext(CCmdUI* pCmdUI) { CTereader0004Doc *pDoc = GetDocument (); pCmdUI->Enable (m_bButtonNext); }schlte ich den / die Buttons ein. m_bButtonNext ist eine Membervariable von View.
Die Datei wird im Dok geladen und der Indikator dafür im Dock auch auf 1 gesetzt. Aber wo muss / kann ich denn den bzw. die Buttons deaktivieren damit zu Beginn niemand drauf rdrücken kann ?

Danke für Deine Mühe
ShadowEater
-
Genau, dafür benötige ich SetCheck(). Aber der Button soll nicht permanent gedrückt erscheinen sondern nur wenn er gedrückt wird. Wird die Maustaste losgelassen soll er nach oben "springen" darüm benötige ich wie Du schon gesagt hast nur Enable() True / False zum ein und ausschalten !
Nein! Denn das ist das normale Verhalten eines Buttons. Dazu musst Du nichts tun.
Die WM_COMMAND Nachricht wird bei einem Button sowieso erst gesendet, wenn der Button los gelassen wird.
-
AAAAAAHHHHHHHHHHRRRRGGGGGGHHHHHHHH !!!!!!

...wird bei einem Button sowieso erst gesendet, wenn der Button los gelassen wird.
Danke jetzt geht's
Oh Mann, Danke

-
ShadowEater schrieb:
Die Datei wird im Dok geladen und der Indikator dafür im Dock auch auf 1 gesetzt. Aber wo muss / kann ich denn den bzw. die Buttons deaktivieren damit zu Beginn niemand drauf rdrücken kann ?

Frag doch einfach nach, ob das Dokument existiert - GetDocument() liefert NULL zurück, wenn du kein Dokument hast (zumindest in MDI-Anwendungen - SDI haben immer ein (notfalls leeres) Dokument).
-
Wenn er den Handler im View hat, dann liefert GetDocument() immer einen Wert!
Es gibt keinen Konstellation bei dem GetDocument() in einem CView NULL liefern würde!
-
Dnke nochmal

Es funktioniert jetzt bestens !Gruß;)
ShadowEater