CDialogBar und Disabled Buttons - Eine kleine Einführung
-
Ich hatte eine einfache SDI Anwendung erstellt und wollte ein CDialogBar mit mehreren Buttons auf der Linken Seite im SDI-View anzeigen. Nach dem Starten der Anwendung musste ich aber feststellen, das alle Buttons deaktiviert waren also habe ich folgendes getan:
1. Eine neue Dialogressource erstellen - Titelleiste und Systemmenü abschalten!
Dialogfeldrahmen auf None setzen (ohne Rahmen). Weiterhin muss der Dialog auf den Stil -> Untergeordnet gesetzt werden (Sonst gibts ne Assert)!!!2. Buttons plazieren aber KEINE Funktionalität verknüpfen (Also keine neuen Klassen etc. definieren, alles so lassen wies ist!)
3. Man öffne die CMainFrame.h und trage dort folgendes ein:
// Operationen public: CDialogBar bar; // hier wird der CDialogBar deklariert // das ganze funktioniert ähnlich wie CToolBar!
4. Öffne nun bitte die CMainFrame.cpp und trage dort unter der Funktion
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) folgendes ein:// In der Funktion OnCreate der Klasse CMainFrame // Erstellen wir nun das CDialogBar und docken es links an // // Anm.: Ich habe hier lediglich CBRS_LEFT verwendet siehe Online-Hilfe // für weitere Eigenschaften des CDialogBar z.B. CBRS_FLYBY etc. // if(!bar.Create (this,IDD_DIALOG1,CBRS_LEFT,IDD_DIALOG1)) { AfxMessageBox("CDialogBar Erstellung schlug fehl!"); }
5. Kompilieren Sie die Anwendung nun. Das DialogBar sollte nun links angezeigt werden. Aber ooops, was ist nun los, alle Buttons sind Grau (disabled) dargestellt
? Wie konnte das sein? Ich surfte das Forum ab, las im FAQ ab fand keine plausibele Erklärung. Also ab zu Microsoft und in der MSDN geschaut öhhh...
im Prinzip simpel erklärt aber für so eine einefache Sache zu aufwendig, also habe ich den Code etwas modifiziert.
6. Um die Buttons nun einzuschalten (zu enablen) und mit Funktionalität zu versehen muss man nun die Buttons mit der MESSAGE_MAP der View-Klasse verbunden werden (Klasse Erklärung oder?
)
7. Also wie schon gesagt wir wollen nun die Buttons mit Funktionalität versehen
und machen folgendes:In der Klasse CMainFrame (in die Datei CMainFrame.cpp) muss jetzt die Header-Datei der View Klasse includiert (eingebunden) werden.
z.B.
//CMainFrame.cpp: #include "TestView.h" //Header-Datei der View-Klasse
In der View-Klasse (hier angenommen CTestView) wechseln Sie nun bitte in die Header-Datei -> CTestView.h und includieren dort die CTestDoc-Klasse, da man sonst beim kompilieren zig Fehlermeldungen erhält!!
z.B.
//CTestView.h: #pragma once #include "TestViewDoc.h"
Um nun eine Funktion für z.B einen Button zu erstellen, müssen wir in
der Header-Datei der CTestView.h innerhalb der Klassendefinition folgendes einfügen:// public: afx_msg void OnButtonTest(); // hier die eigene Funktion setzen, wichtig ist // afx_msg davor zu setzen -> siehe Online-Hilfe
Wechseln Sie nun in die CTestView.cpp Datei und fügen Sie dort Ihre eigene
Funktion ein, die bei Klick auf den Button ausgeführt werden soll:z.B.
void CTestView::OnButtonTest() { AfxMessageBox("Ja, der Button funktioniert!"); }
Nun haben wir zwar eine eigene Funktion, aber der Button funktioniert immer noch nicht, denn er muss erst in der Klasse CTestView (CTestView.cpp) in die sog. MESSAGE_MAP eingebunden werden. Fügen Sie also in der Datei CTestView.cpp
innerhalb der Message_Map folgendes ein (Anm. die Message_Map steht immer oben im Quellcode -> ist aber kein muss)IMPLEMENT_DYNCREATE(CTestView, CView) BEGIN_MESSAGE_MAP(CTestView, CView) // (..) // Hier definieren wir nun letzlich die Behandlung für den Klick mit der // Maus auf den Button ON_BN_CLICKED(ID_TESTBUTTON,OnButtonTest) END_MESSAGE_MAP()
Nun kompilieren Sie die Anwendung, haben Sie alles wie oben exakt ausgeführt und insofern ich hier nichts (versehentlich) falsch gepostet habe sehen Sie nun links den DialogBar mit Ihrem Button und er ist aktiviert und er funktioniert!
Nantürlich ist dies sicherlich keine Master-Lösung und es gibt im Netz auch jedemenge alternativen, aber ich sehe es nicht ein für einen simplen Button extra eine neue Klasse etc. zu definieren, warum den komplex wenns auch einfach geht!
Kritik und Ergänzungen oder Korrekturen sind gerne willkommen!
-
Ich poste hier noch zusätzlich den Link zur MSDN für alle die das noch genauer oder vielleicht einfacher haben wollen (ist meiner Meinung nach aber komplexer!)
http://support.microsoft.com/default.aspx?scid=kb;en-us;185672#kb1
oder aber noch mehr bei CodeGuru.com (CCmdUI Variante)
http://www.codeguru.com/Cpp/W-D/dislog/dialogbars/article.php/c1871/
oder (Mit neuen Klassen -> kompliziert!)
http://www.codeguru.com/Cpp/W-D/dislog/ddxddv/article.php/c1997/
-
Jetzt noch einen Screenshot in den 2. Beitrag und das Tutorial ist perfekt!
-
Kann das mal bitte jemand in die MFC Faq verschieben danke!