Exemplarische Vorgehensweise: Aktualisieren der MFC Scribble-Anwendung (Teil 2)
In Teil 1 dieser exemplarischen Vorgehensweise wurde gezeigt, wie Sie der klassischen Scribble-Anwendung ein Office Fluent-Menüband hinzufügen. In diesem Teil wird gezeigt, wie Sie Menübandbereiche und Steuerelemente hinzufügen, die Benutzer anstelle von Menüs und Befehlen verwenden können.
Voraussetzungen
Abschnitte
Dieser Teil der exemplarischen Vorgehensweise enthält die folgenden Abschnitte:
Hinzufügen neuer Panels zum Menüband
Diese Schritte zeigen, wie Sie einen Ansichtsbereich hinzufügen, der zwei Kontrollkästchen enthält, die die Sichtbarkeit der Symbolleiste und der Statusleiste steuern, sowie ein Fensterbereich , der eine vertikal ausgerichtete geteilte Schaltfläche enthält, die die Erstellung und Anordnung von MDI-Fenstern (Multiple-Document Interface) steuert.
So fügen Sie der Menübandleiste einen Ansichtsbereich und einen Fensterbereich hinzu
Erstellen Sie einen Bereich mit dem Namen
View
, der zwei Kontrollkästchen enthält, mit denen die Statusleiste und die Symbolleiste umzuschalten sind.Ziehen Sie aus der Toolbox einen Bereich in die Kategorie "Start ". Ziehen Sie dann zwei Kontrollkästchen in das Panel.
Klicken Sie auf das Panel, um dessen Eigenschaften zu ändern. Beschriftung ändern in
View
.Klicken Sie auf das erste Kontrollkästchen, um dessen Eigenschaften zu ändern. Ändern Sie die ID in
ID_VIEW_TOOLBAR
und die Beschriftung inToolbar
.Klicken Sie auf das zweite Kontrollkästchen, um dessen Eigenschaften zu ändern. Ändern Sie die ID in
ID_VIEW_STATUS_BAR
und die Beschriftung inStatus Bar
.
Erstellen Sie einen Bereich mit dem Namen
Window
einer geteilten Schaltfläche. Wenn ein Benutzer auf die geteilte Schaltfläche klickt, zeigt ein Kontextmenü drei Befehle an, die bereits in der Scribble-Anwendung definiert sind.Ziehen Sie aus der Toolbox einen Bereich in die Kategorie "Start ". Ziehen Sie dann eine Schaltfläche in den Bereich.
Klicken Sie auf das Panel, um dessen Eigenschaften zu ändern. Beschriftung ändern in
Window
.Klicken Sie auf die Schaltfläche . Ändern Sie die Beschriftung in , Tasten in
Windows
w
, großen Bildindex in1
, und den Geteilten Modus inFalse
. Klicken Sie dann neben den Menüelementen auf die Auslassungspunkte (...), um das Dialogfeld "Element-Editor" zu öffnen.Klicken Sie dreimal auf "Hinzufügen" , um drei Schaltflächen hinzuzufügen.
Klicken Sie auf die erste Schaltfläche, und ändern Sie dann "Beschriftung" in " und "ID" in
New Window
ID_WINDOW_NEW
.Klicken Sie auf die zweite Schaltfläche, und ändern Sie dann "Beschriftung" in " und "ID" in
Cascade
ID_WINDOW_CASCADE
.Klicken Sie auf die dritte Schaltfläche, und ändern Sie dann "Beschriftung" in
Tile
" und "ID " inID_WINDOW_TILE_HORZ
.
Speichern Sie die Änderungen, erstellen Sie anschließend die Anwendung, und führen Sie sie aus. Die Ansichts - und Fensterbereiche sollten angezeigt werden. Klicken Sie auf die Schaltflächen, um zu bestätigen, dass sie ordnungsgemäß funktionieren.
Hinzufügen eines Hilfebereichs zum Menüband
Jetzt können Sie zwei Menüelemente zuweisen, die in der Scribble-Anwendung definiert sind, Menübandschaltflächen mit dem Namen "Hilfethemen" und "Info zu Scribble". Die Schaltflächen werden einem neuen Bereich mit dem Namen "Hilfe" hinzugefügt.
So fügen Sie einen Hilfebereich hinzu
Ziehen Sie aus der Toolbox einen Bereich in die Kategorie "Start ". Ziehen Sie dann zwei Schaltflächen in den Bereich.
Klicken Sie auf das Panel, um dessen Eigenschaften zu ändern. Beschriftung ändern in
Help
.Klicken Sie auf die erste Schaltfläche. Ändern Sie die Beschriftung in
Help Topics
und die ID inID_HELP_FINDER
.Klicken Sie auf die zweite Schaltfläche. Ändern Sie die Beschriftung in
About Scribble...
und die ID inID_APP_ABOUT
.Speichern Sie die Änderungen, erstellen Sie anschließend die Anwendung, und führen Sie sie aus. Ein Hilfebereich mit zwei Menübandschaltflächen sollte angezeigt werden.
Wichtig
Wenn Sie auf die Schaltfläche "Hilfethemen " klicken, öffnet die Scribble-Anwendung eine komprimierte HTML-Hilfedatei (CHM) mit dem Namen your_project_name.chm. Wenn Ihr Projekt nicht "Scribble" heißt, müssen Sie daher die Hilfedatei in den Projektnamen umbenennen.
Hinzufügen eines Stiftpanels zum Menüband
Fügen Sie nun ein Panel hinzu, um Schaltflächen anzuzeigen, die die Stärke und die Farbe des Stifts steuern. Dieses Panel enthält ein Kontrollkästchen, das zwischen dicken und dünnen Stiften umschaltet. Seine Funktionalität ähnelt der des Menüelements "Dicke Linie " in der Scribble-Anwendung.
Mit der ursprünglichen Scribble-Anwendung können Benutzer Stiftbreiten aus einem Dialogfeld auswählen, das angezeigt wird, wenn der Benutzer im Menü auf Stiftbreiten klickt. Da die Menübandleiste ausreichend Platz für neue Steuerelemente hat, können Sie das Dialogfeld mithilfe von zwei Kombinationsfeldern im Menüband ersetzen. Ein Kombinationsfeld passt die Breite des dünnen Stifts an, und das andere Kombinationsfeld passt die Breite des dicken Stifts an.
So fügen Sie dem Menüband einen Stiftbereich und Kombinationsfelder hinzu
Ziehen Sie aus der Toolbox einen Bereich in die Kategorie "Start ". Ziehen Sie dann ein Kontrollkästchen und zwei Kombinationsfelder in das Panel.
Klicken Sie auf das Panel, um dessen Eigenschaften zu ändern. Beschriftung ändern in
Pen
.Aktivieren Sie das Kontrollkästchen. Ändern Sie die Beschriftung in
Use Thick
und die ID inID_PEN_THICK_OR_THIN
.Klicken Sie auf das erste Kombinationsfeld. Ändern Sie beschriftung in , ID in
Thin Pen
ID_PEN_THIN_WIDTH
, Typ inDrop List
, Daten in1;2;3;4;5;6;7;8;9;
, und Text in2
.Klicken Sie auf das zweite Kombinationsfeld. Ändern Sie beschriftung in , ID in
Thick Pen
ID_PEN_THICK_WIDTH
, Typ inDrop List
, Daten in5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;
, und Text in5
.Die neuen Kombinationsfelder entsprechen keinem vorhandenen Menüelement, daher müssen Sie für jede Stiftoption ein Menüelement erstellen.
Öffnen Sie im Fenster " Ressourcenansicht " die IDR_SCRIBBTYPE Menüressource.
Klicken Sie auf "Stift" , um das Stiftmenü zu öffnen. Klicken Sie dann auf "Hier eingeben" und geben Sie ein
Thi&n Pen
.Klicken Sie mit der rechten Maustaste auf den Text, den Sie eingegeben haben, um das Eigenschaftenfenster zu öffnen, und ändern Sie dann die ID-Eigenschaft in
ID_PEN_THIN_WIDTH
.Erstellen Sie einen Ereignishandler für jedes Stiftmenüelement. Klicken Sie mit der rechten Maustaste auf das von Ihnen erstellte Menüelement "Thi&n Pen ", und klicken Sie dann auf "Ereignishandler hinzufügen". Der Ereignishandler-Assistent wird angezeigt.
Wählen Sie im Listenfeld "Klasse" im Assistenten "CScribbleDoc" aus, und klicken Sie dann auf "Hinzufügen" und "Bearbeiten". Der Befehl erstellt einen Ereignishandler mit dem Namen
CScribbleDoc::OnPenThinWidth
.Füge
CScribbleDoc::OnPenThinWidth
den folgenden Code hinzu.// Get a pointer to the ribbon bar CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); // Get a pointer to the Thin Width combo box CMFCRibbonComboBox* pThinComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THIN_WIDTH)); //Get the selected value int nCurSel = pThinComboBox->GetCurSel(); if (nCurSel>= 0) { m_nThinWidth = atoi(CStringA(pThinComboBox->GetItem(nCurSel))); } // Create a new pen using the selected width ReplacePen();
Erstellen Sie als Nächstes ein Menüelement und Ereignishandler für den dicken Stift.
Öffnen Sie im Fenster " Ressourcenansicht " die IDR_SCRIBBTYPE Menüressource.
Klicken Sie auf "Stift" , um das Stiftmenü zu öffnen. Klicken Sie dann auf "Hier eingeben" und geben Sie ein
Thic&k Pen
.Klicken Sie mit der rechten Maustaste auf den Text, den Sie eingegeben haben, um das Eigenschaftenfenster anzuzeigen. Ändern Sie die ID-Eigenschaft in
ID_PEN_THICK_WIDTH
.Klicken Sie mit der rechten Maustaste auf das Menüelement "Dicker Stift ", das Sie erstellt haben, und klicken Sie dann auf "Ereignishandler hinzufügen". Der Ereignishandler-Assistent wird angezeigt.
Wählen Sie im Listenfeld "Klasse" des Assistenten CScribbleDoc aus, und klicken Sie dann auf Hinzufügen und Bearbeiten. Der Befehl erstellt einen Ereignishandler mit dem Namen
CScribbleDoc::OnPenThickWidth
.Füge
CScribbleDoc::OnPenThickWidth
den folgenden Code hinzu.// Get a pointer to the ribbon bar CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx *) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); CMFCRibbonComboBox* pThickComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THICK_WIDTH)); // Get the selected value int nCurSel = pThickComboBox->GetCurSel(); if (nCurSel>= 0) { m_nThickWidth = atoi(CStringA(pThickComboBox->GetItem(nCurSel))); } // Create a new pen using the selected width ReplacePen();
Speichern Sie die Änderungen, erstellen Sie anschließend die Anwendung, und führen Sie sie aus. Neue Schaltflächen und Kombinationsfelder sollten angezeigt werden. Versuchen Sie, verschiedene Stiftbreiten zum Scribble zu verwenden.
Hinzufügen einer Farbschaltfläche zum Stiftbereich
Fügen Sie als Nächstes ein CMFCRibbonColorButton -Objekt hinzu, mit dem der Benutzer farblich scribibble.
So fügen Sie dem Stiftbereich eine Farbschaltfläche hinzu
Erstellen Sie vor dem Hinzufügen der Farbschaltfläche ein Menüelement dafür. Öffnen Sie im Fenster " Ressourcenansicht " die IDR_SCRIBBTYPE Menüressource. Klicken Sie auf das Menüelement "Stift ", um das Stiftmenü zu öffnen. Klicken Sie dann auf "Hier eingeben" und geben Sie ein
&Color
. Klicken Sie mit der rechten Maustaste auf den Text, den Sie eingegeben haben, um das Eigenschaftenfenster anzuzeigen. Ändern Sie die ID inID_PEN_COLOR
.Fügen Sie nun die Farbschaltfläche hinzu. Ziehen Sie aus der Toolbox eine Farbschaltfläche in den Stiftbereich .
Klicken Sie auf die Farbschaltfläche. Ändern Sie die Beschriftung in
Color
, ID inID_PEN_COLOR
, einfaches Aussehen inTrue
, große Bildindex in1
, und den Geteilten Modus inFalse
.Speichern Sie die Änderungen, erstellen Sie anschließend die Anwendung, und führen Sie sie aus. Die neue Farbschaltfläche sollte im Stiftbereich angezeigt werden. Sie kann jedoch nicht verwendet werden, da sie noch keinen Ereignishandler hat. Die nächsten Schritte zeigen, wie Sie einen Ereignishandler für die Farbschaltfläche hinzufügen.
Hinzufügen eines Farbelements zur Dokumentklasse
Da die ursprüngliche Scribble-Anwendung keine Farbstifte enthält, müssen Sie eine Implementierung für sie schreiben. Um die Stiftfarbe des Dokuments zu speichern, fügen Sie der Dokumentklasse ein neues Element hinzu. CscribbleDoc
So fügen Sie der Dokumentklasse ein Farbelement hinzu
Suchen Sie in scribdoc.h in der
CScribbleDoc
Klasse den// Attributes
Abschnitt. Fügen Sie die folgenden Codezeilen nach der Definition desm_nThickWidth
Datenelements hinzu.// Current pen color COLORREF m_penColor;
Jedes Dokument enthält eine Liste von Stokes, die der Benutzer bereits gezeichnet hat. Jeder Strich wird durch ein
CStroke
Objekt definiert. DieCStroke
Klasse enthält keine Informationen zur Stiftfarbe, daher müssen Sie die Klasse ändern. Fügen Sie in scribdoc.h in derCStroke
Klasse die folgenden Codezeilen nach der Definition desm_nPenWidth
Datenelements hinzu.// Pen color for the stroke COLORREF m_penColor;
Fügen Sie in scribdoc.h einen neuen
CStroke
Konstruktor hinzu, dessen Parameter eine Breite und Farbe angeben. Fügen Sie nach derCStroke(UINT nPenWidth);
Anweisung die folgende Codezeile hinzu.CStroke(UINT nPenWidth, COLORREF penColor);
Fügen Sie in scribdoc.cpp die Implementierung des neuen
CStroke
Konstruktors hinzu. Fügen Sie den folgenden Code nach der Implementierung desCStroke::CStroke(UINT nPenWidth)
Konstruktors hinzu.// Constructor that uses the document's current width and color CStroke::CStroke(UINT nPenWidth, COLORREF penColor) { m_nPenWidth = nPenWidth; m_penColor = penColor; m_rectBounding.SetRectEmpty(); }
Ändern Sie die zweite Zeile der
CStroke::DrawStroke
Methode wie folgt.if (!penStroke.CreatePen(PS_SOLID, m_nPenWidth, m_penColor))
Legen Sie die Standardstiftfarbe für die Dokumentklasse fest. Fügen Sie in scribdoc.cpp die folgenden Zeilen nach der
m_nThickWidth = 5;
Anweisung hinzuCScribbleDoc::InitDocument
.// default pen color is black m_penColor = RGB(0, 0, 0);
Ändern Sie in scribdoc.cpp die erste Zeile der
CScribbleDoc::NewStroke
Methode in Folgendes.CStroke* pStrokeItem = new CStroke(m_nPenWidth, m_penColor);
Ändern Sie die letzte Zeile der
CScribbleDoc::ReplacePen
Methode wie folgt.m_penCur.CreatePen(PS_SOLID, m_nPenWidth, m_penColor);
Sie haben das
m_penColor
Mitglied in einem vorherigen Schritt hinzugefügt. Erstellen Sie nun einen Ereignishandler für die Farbschaltfläche, die das Element festlegt.Öffnen Sie im Fenster " Ressourcenansicht " die IDR_SCRIBBTYPE Menüressource.
Klicken Sie mit der rechten Maustaste auf das Menüelement "Farbe ", und klicken Sie auf " Ereignishandler hinzufügen". Der Ereignishandler-Assistent wird angezeigt.
Wählen Sie im Listenfeld "Klasse" im Assistenten CScribbleDoc aus, und klicken Sie dann auf die Schaltfläche "Hinzufügen und Bearbeiten". Der Befehl erstellt den
CScribbleDoc::OnPenColor
Ereignishandler-Stub.
Ersetzen Sie den Stub für den
CScribbleDoc::OnPenColor
Ereignishandler durch den folgenden Code.void CScribbleDoc::OnPenColor() { // Change pen color to reflect color button's current selection CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); CMFCRibbonColorButton* pColorBtn = DYNAMIC_DOWNCAST( CMFCRibbonColorButton, pRibbon->FindByID(ID_PEN_COLOR)); m_penColor = pColorBtn->GetColor(); // Create new pen using the selected color ReplacePen(); }
Speichern Sie die Änderungen, erstellen Sie anschließend die Anwendung, und führen Sie sie aus. Sie können jetzt die Farbschaltfläche drücken und die Farbe des Stifts ändern.
Initialisieren von Stiften und Speichern von Einstellungen
Initialisieren Sie als Nächstes die Farbe und Breite der Stifte. Speichern und laden Sie schließlich eine Farbzeichnung aus einer Datei.
So initialisieren Sie Steuerelemente auf der Menübandleiste
Initialisieren Sie die Stifte auf der Menübandleiste.
Fügen Sie den folgenden Code hinzu, um "scribdoc.cpp" in der
CScribbleDoc::InitDocument
Methode nach derm_sizeDoc = CSize(200,200)
Anweisung hinzuzufügen.// Reset the ribbon UI to its initial values CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); CMFCRibbonColorButton* pColorBtn = DYNAMIC_DOWNCAST( CMFCRibbonColorButton, pRibbon->FindByID(ID_PEN_COLOR)); // Set ColorButton to black pColorBtn->SetColor(RGB(0, 0, 0)); CMFCRibbonComboBox* pThinComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THIN_WIDTH)); // Set Thin pen combobox to 2 pThinComboBox->SelectItem(1); CMFCRibbonComboBox* pThickComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THICK_WIDTH)); // Set Thick pen combobox to 5 pThickComboBox->SelectItem(0);
Speichern Sie eine Farbzeichnung in einer Datei. Fügen Sie die folgende Anweisung hinzu, um "scribdoc.cpp" in der
CStroke::Serialize
Methode nach derar << (WORD)m_nPenWidth;
Anweisung hinzuzufügen.ar << (COLORREF)m_penColor;
Laden Sie schließlich eine Farbzeichnung aus einer Datei. Fügen Sie in der Methode nach der
CStroke::Serialize
m_nPenWidth = w;
Anweisung die folgende Codezeile hinzu.ar >> m_penColor;
Zeichnen Sie nun in Farbe, und speichern Sie ihre Zeichnung in einer Datei.
Zusammenfassung
Sie haben die MFC Scribble-Anwendung aktualisiert. Verwenden Sie diese exemplarische Vorgehensweise als Leitfaden, wenn Sie Ihre vorhandenen Anwendungen ändern.
Siehe auch
Exemplarische Vorgehensweisen
Exemplarische Vorgehensweise: Aktualisieren der MFC Scribble-Anwendung (Teil 1)