DLGCBR32-Beispiel: Demonstriert das Hinzufügen einer Statusleiste und einer Symbolleiste zu Dialogfeldern
Aktualisiert: November 2007
Das DLGCBR32-Beispiel zeigt, wie einem Dialogfeld eine Symbolleiste und eine Statusleiste hinzugefügt werden. Zusätzlich werden einige Techniken demonstriert, die veranschaulichen, wie ein nicht modales Dialogfeld als Hauptfenster einer MFC-Anwendung verwendet werden kann.
In einer MFC-Anwendung können Sie einem Rahmenfenster Steuerleisten (beispielsweise Statusleisten oder Symbolleisten) anfügen. Bei vielen Anwendungen ist jedoch eine einfache dialogfeldbasierte Benutzeroberfläche ausreichend. MFC stellt keine integrierte Unterstützung zum Hinzufügen von Steuerleisten zu Dialogfeldern bereit.
Sicherheitshinweis: |
---|
Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird. |
So rufen Sie Beispiele und Anweisungen für ihre Installation ab
Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.
Weitere Informationen finden Sie unter Suchen von Beispieldateien.
Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.
Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.
Erstellen und Ausführen des Beispiels
So erstellen Sie das DLGCBR32-Beispiel und führen es aus
Öffnen Sie die Projektmappe Dlgcbr32.sln.
Klicken Sie im Menü Erstellen auf Erstellen.
Klicken Sie im Menü Debuggen auf Starten ohne Debuggen.
Hinzufügen einer Steuerleiste zu einem Dialogfeld
Um einem Dialogfeld eine Steuerleiste hinzuzufügen, erstellen Sie die Steuerleiste wie gewohnt, und schaffen Sie anschließend im Clientbereich des Dialogfelds Platz für diese Steuerleiste. Damit die Steuerleiste einwandfrei funktioniert, muss das Dialogfeld einige der Rahmenfensterfunktionen duplizieren. Wenn Sie möchten, dass der ON_UPDATE_COMMAND_UI-Handler die Steuerleisten unterstützt, müssen Sie zusätzlich neue Steuerleistenklassen ableiten und die Meldung WM_IDLEUPDATECMDUI behandeln. Wenn das Dialogfeld nicht das Hauptfenster der Anwendung ist, müssen Sie außerdem das übergeordnete Rahmenfenster bearbeiten, damit die Meldung WM_IDLEUPDATECMDUI an die Steuerleisten des Dialogfelds übergeben wird.
Führen Sie die folgenden Schritte in der OnInitDialog-Funktion des Dialogfelds aus, um im Clientbereich des Dialogfelds Platz für eine Steuerleiste zu schaffen:
Erstellen Sie die Steuerleisten. Ermitteln Sie mit der reposQuery-Option von RepositionBars den Platzbedarf für die Steuerleisten.
CRect rcClientStart; CRect rcClientNow; GetClientRect(rcClientStart); RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNow);
Verschieben Sie die Steuerleisten in dem Dialogfeld, um den Platz zu berücksichtigen, der von den Steuerleisten im oberen oder linken Clientbereich eingenommen wird. Wenn das Dialogfeld ein Menü enthält, müssen Sie den von diesem Menü beanspruchten Platz ebenfalls berücksichtigen.
CPoint ptOffset(rcClientNow.left - rcClientStart.left, rcClientNow.top - rcClientStart.top); CRect rcChild; CWnd* pwndChild = GetWindow(GW_CHILD); while (pwndChild) { pwndChild->GetWindowRect(rcChild); ScreenToClient(rcChild); rcChild.OffsetRect(ptOffset); pwndChild->MoveWindow(rcChild, FALSE); pwndChild = pwndChild->GetNextWindow(); }
Erweitern Sie die Fensterabmessungen des Dialogfelds um den Platz, der von den Steuerleisten eingenommen wird.
CRect rcWindow; GetWindowRect(rcWindow); rcWindow.right += rcClientStart.Width() - rcClientNow.Width(); rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height(); MoveWindow(rcWindow, FALSE);
Positionieren Sie die Steuerleisten mithilfe von RepositionBars.
Um den ersten Bereich der Statusleiste zu aktualisieren, der Text im Menüelement enthält, müssen Sie die Meldungen WM_MENUSELECT, WM_ENTERIDLE, WM_SETMESSAGESTRING und WM_POPMESSAGESTRING in der Dialogfeldklasse behandeln. Die Funktionalität der CFrameWnd-Handler für diese Meldungen muss dupliziert werden. Einige Beispiele für diese Meldungshandler finden Sie unter der CModelessMain-Klasse im Beispielprogramm.
Damit für die Symbolleisten-Schaltflächen QuickInfos angezeigt werden, müssen die Benachrichtigungen TTN_NEEDTEXTW und TTN_NEEDTEXTA behandelt werden.
Damit die ON_UPDATE_COMMAND_UI-Handler andere Statusleistenbereiche und Symbolleisten-Schaltflächen unterstützen können, müssen Sie neue Steuerleistenklassen ableiten und einen Meldungshandler für WM_IDLEUPDATECMDUI implementieren. Dies ist notwendig, da die Standardsteuerleisten-Implementierungen von OnUpdateCmdUI ein Rahmenfenster als übergeordnetes Fenster voraussetzen. OnUpdateCmdUI führt jedoch keine weitere Aktion aus, als den Zeiger des übergeordneten Fensters an eine Funktion zu übergeben, die lediglich einen CCmdTarget-Zeiger benötigt. Demzufolge können Sie OnUpdateCmdUI vorübergehend mitteilen, dass es sich bei dem Zeiger des übergebenen übergeordneten Fensters um einen CFrameWnd-Zeiger handelt, der den Anforderungen des Compilers entspricht. Beispiel:
LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
if (IsWindowVisible())
{
CFrameWnd* pParent = (CFrameWnd*)GetParent();
if (pParent)
OnUpdateCmdUI(pParent, (BOOL)wParam);
}
return OL;
}
Wenn Sie die WM_IDLEUPDATECMDUI-Meldungen an ein anderes Dialogfeld als das Hauptfenster übergeben möchten, müssen Sie die Dialogzeiger in der Rahmenfensterklasse speichern und in dieser Klasse einen WM_IDLEUPDATECMDUI-Handler erstellen. Der Handler muss den untergeordneten Fenstern des Dialogfelds mithilfe von CWnd::SendMessageToDescendants die Meldung WM_IDLEUPDATECMDUI senden. Führen Sie anschließend innerhalb des Rahmenfensters eine Standardverarbeitung der Meldung durch.
Hinweis: |
---|
In diesem und einigen anderen Beispielen wurden die Änderungen an den Visual C++-Assistenten, -Bibliotheken und -Compilern noch nicht nachvollzogen. Sie demonstrieren aber dennoch, wie Sie die gewünschte Aufgabe durchführen können. |