CTRLTEST-Beispiel: Implementiert benutzerdefinierte Steuerelemente

Das CTRLTEST-Beispiel veranschaulicht mehrere Techniken zum Implementieren und Verwenden von benutzerdefinierte Steuerelementen:

  • CParsedEdit Implementieren eines speziellen Steuerelementfunktionalität von seiner Bibliothek-Steuerelementklasse abgeleitet, und bearbeiten drei Methoden für die Verwendung von benutzerdefinierter Steuerelementen.

  • Verwenden des Drehfeld-Steuerelements. Das Drehfeld-Steuerelement verfügt über kleine Aufwärts- und nach unten weisenden Pfeil-Schaltflächen zum Inkrementieren oder dekrementieren einen Wert.

  • Bitmap-Schaltfläche Implementierung von benutzerdefinierteCBitmapButton verwenden Menübefehle.

  • Besitzer (übergeordneten Fenster) beim Zeichnen von Menüs und Listenfeldern. Zugehörige Steuerelementklassen Ableiten der Klasse CMenu und CListBox stellen dieses Feature auf objektorientierte Weise.

  • Verwenden Ressourcendateien, die mit Microsoft Visual C++-Ressourcen-Editoren nicht verwaltet werden können. Dies veranschaulicht die vor- und Nachteile der Verwendung von RC2-Dateien in einem Dialogfeld mit ein benutzerdefiniertes Steuerelement, dessen Formate durch Konstanten in einer Headerdatei definiert sind.

Die Abbildungen in CTRLTEST werden durch Menübefehle initiiert.

SicherheitshinweisSicherheitshinweis

Dieser Beispielcode soll ein Konzept veranschaulichen, und es wird nur den Code, der für dieses Konzept relevant sind. Möglicherweise erfüllt dieser nicht die Sicherheitsanforderungen für eine bestimmte Umgebung, und er sollte nicht genau wie dargestellt verwendet werden. Wir empfehlen, Sicherheits- und Fehlerbehandlungscode hinzuzufügen, um Ihre Projekte sicherer und stabiler zu machen. Microsoft stellt diesen Beispielcode "Wie besehen"keine Garantien.

So erhalten Sie Beispiele und Anweisungen für deren Installation:

Um Beispiele von Visual Studio zuzugreifen

  • im Menü Hilfe Menü klicken Beispiele.

    Standardmäßig sind die Beispiele in installiert. Laufwerk: \Programme\Microsoft visual Studio 10.0\Samples\.

  • Die neueste Version dieses Beispiels und eine Liste der anderen Beispiele finden Sie unter Visual Studio Samples auf der MSDN-Website.

Erstellen und Ausführen des Beispiels

So erstellen Sie und führen das CTRLTEST-Beispiel

  1. Öffnen Sie die Projektmappe Ctrltest.sln.

  2. erstellen Sie Menü, klicken Sie auf erstellen.

  3. Debuggen Sie auf Menü, klicken Sie auf Starten ohne Debuggen.

Beispiel: Implementieren und Verwenden von benutzerdefinierten Steuerelementen

Sie können ein benutzerdefiniertes Steuerelement implementieren, durch Ableiten von CWnd, aber es ist viel einfacher, wenn Sie Funktionen von Windows-Standardsteuerelemente ausleihen können, durch Ableiten von dessen Steuerelementklasse in der Bibliothek. CTRLTEST geht dementsprechend vor, um ein spezialisiertes Edit-Steuerelement CParsedEdit implementieren. Dieses Bearbeitungssteuerelement akzeptiert bei der nur bestimmte Zeichensätze Benutzereingabe: numerische, alphabetische oder Nichtsteuerzeichen. CParsedEdit wird von CEdit abgeleitet. Es verfügt über einen Meldungshandler OnChar die Zeichen entsprechend gefiltert.

Die Implementierung der Befehle im Menü Simple veranschaulicht drei Methoden zur Verwendung eines benutzerdefinierten Steuerelements. Die Methoden werden unterschieden, wie die Anwendung Instanzen des Steuerelements im Dialogfeld mit der CParsedEdit-Klasse verknüpft. Jeder Befehl im Menü Simple zeigt ein Dialogfeld mit vier Instanzen des Steuerelements CParsedEdit. Klicken Sie im Dialogfeld eingegebene Daten werden als TRACE Ausgabe an den Debugport gesendet. Die drei Simple Menübefehle sind:

Testen C++ abgeleitete Klasse

Die CParsedEdit-Steuerelemente sind Datenmember der Dialogklasse. Die Steuerelemente werden in das Dialogfeld OnInitDialog Funktion explizit erstellt, durch Aufrufen von CParsedEdit::CreateSet. Finden Sie unter Dertest.cpp.

Test WNDCLASS registriert

CParsedEdit -Steuerelemente werden in einer Dialogfeldressource Vorlage (IDD_WNDCLASS_EDIT) als benutzerdefinierte Steuerelemente mit einer WNDCLASS als "Paredit". identifiziert angeordnet Es ist hilfreich, die Eigenschaften dieser benutzerdefinierten Steuerelemente unter Verwendung des Visual C++-Dialog-Editors zu überprüfen.

  • Beschriftung leer. Dies ist der anfängliche Wert im CParsedEdit-Steuerelement angezeigt.

  • Klasse: Paredit. Dies ist der Name WNDCLASS , die durch CParsedEdit::RegisterControlClass in PAREDIT2.CPP, registriert ist, bevor das Dialogfeld aufgerufen wird.

  • Sichtbar: aktiviert. Das Steuerelement ist sichtbar.

  • Tabstopp: aktiviert. Der Benutzer kann TAB-TASTE auf dieses Steuerelement.

  • Style: 0 x 5081002, 0 x 5081001, 0 x 5081003, 0x5081ffff für die vier analysierten Edit-Steuerelemente. Die Formatvorlage 0x500000 für WS_CHILD und WS_VISIBLEhandelt und dass ist 0 x 1000 für WS_TABSTOP. Alle benutzerdefinierten Steuerelemente weisen das Format WS_CHILD. Die WS_VISIBLE und WS_TABSTOP Stile werden automatisch vom Dialog-Editor festgelegt, wenn Sie die Visible von und TabStop Stile überprüfen. 0 x 80000 gilt für WS_BORDER. Da die Dialogfeld-Editor-Eigenschaftenseite für ein benutzerdefiniertes Steuerelement alle Fensterstile z. B. WS_BORDER, müssen Sie die Konstante unter \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WINUSER.H suchen. Die Stile 0 x 0001, 0 x 0002, 0 x 0004 und 0x0ffff werden in der Datei PAREDIT.h definiert als jeweils definiert PES_NUMBERS, PES_LETTERS, PER_OTHERCHARSund PES_ALL.

  • Die hexadezimalen Formate in der Eigenschaftenseite der benutzerdefinierten Steuerelemente sind nicht selbstdokumentierend. Wenn ist es wichtig, Sie verwenden die symbolischen Formate, z. B. PES_NUMBERS und PES_LETTERS, können Sie auch manuell eine eigene Ressourcendatei, z. B. RES\Ctrltest.rc2, bearbeiten, die zum Zeitpunkt der Kompilierung vom Ressourcencompiler enthalten, aber nicht am Bearbeitungszeit von Visual C++ gelesen. Eine Erörterung der vor-und Nachteile der manuellen Bearbeitung von benutzerdefinierten Steuerdialogfeldern in einer RC2-Datei finden Sie unter verwenden Ressource von Dateien nicht von Visual C++ Ressourcen-Editoren.

Testen von dynamischen Unterklassen

Die Steuerelemente werden in einem Dialogfeld Vorlage Ressource (IDD_SUB_EDIT in der Datei Ctrltest.rc) als standard-Edit-Steuerelemente angeordnet. Die Steuerelemente werden als CParsedEdit Datenmember in der Dialogfeldklasse deklariert. Das Dialogfeld OnInitDialog -Funktion ruft CParsedEdit::SubClassEdit, die wiederum CWnd::SubclassDlgItemCParsedEdit-Klasse jede spezifische Instanz des Edit-Steuerelements zugeordnet. Finden Sie unter Paredit.cpp.

Beispiel: Drehfeld-Steuerelement

Das CTRLTEST-Beispiel enthält eine Implementierung eines Drehfeld-Steuerelements. Das Drehfeld-Steuerelement weist einen kleinen oben-Pfeil und ein kleines nach unten weisenden Pfeil-Schaltfläche für inkrementieren oder dekrementieren einen Wert.

Befehl Spin Control Ruft ein Dialogfeld, das vier CParsedEdit Steuerelemente enthält, die jeweils ein Drehfeld-Steuerelement zugeordnet. In den Steuerelementen CParsedEdit in diesem Dialogfeld eingegebenen Daten ist gefiltert, um ausschließlich nicht negative ganze Zahlen akzeptieren. Der Benutzer kann numerische Daten eingeben, indem entweder den Wert in Steuerelement CParsedEdit eingibt oder das zugehörige Drehfeld-Steuerelement.

Beispiel: Bitmap Button

Die Implementierung der folgenden Menübefehle Custom veranschaulicht die Möglichkeiten zur Verwendung von CBitmapButton:

  • Bitmap Button 1 - der Dialogfeldkonstruktor explizit lädt die Bitmapressourcen für jeden der drei Schaltflächenzustände (oben, unten und konzentrieren) der Schaltfläche durch Aufrufen von CBitmapButton::LoadBitmaps.

  • Bitmap Button 2 - Ruft das Dialogfeld OnInitDialog Funktion CBitmapButton::Autoload, um die Bitmapressourcen basierend auf der folgenden Namenskonvention zu laden. Der Fenster Text im Steuerelement fungiert als Basis Ressourcennamen und die Buchstaben U, D und F angefügt werden, um die Namen der Ressourcen für jede der drei Bitmapbilder, bzw. erstellen oben, unten und konzentrieren. Beispielsweise sind die drei Bitmapressourcen für die OK-Schaltfläche OKU, OKD und OKF benannt.

  • Bitmap Button 3 - das Dialogfeld ist eine Erweiterung des oben genannten zweiten Dialogfelds einen vierten möglichen Schaltflächenzustand, deaktiviert. Um dieses Dialogfeld verwenden, klicken Sie bis die angezeigte Zahl erreicht 1, der niedrigsten Zahl oder 10, die höchste Zahl auf die links oder Pfeil nach rechts Bitmap Schaltfläche. Wenn das Limit erreicht ist, wird die Schaltfläche ist deaktiviert, und ein viertes Bitmapbild wird angezeigt. Die Namenskonvention für die Bitmapressource für den deaktivierten Zustand ist ein X-Suffix, wie in den Ressourcennamen, PREVX und NEXTX wiedergegeben wird.

Beispiel: Besitzer zeichnen (Menü und Listenfeld)

Verschiedene Windows-Steuerelemente und Menüs verfügen über einen Besitzer zeichnen Feature, mit der das übergeordnete (Besitzer) Fenster oder zeichnen, was er in den Clientbereich des Steuerelements statt das Standardsteuerelement Verhalten will. Die entsprechenden Steuerelementklassen und CMenu-Klasse stellen dieses Feature noch komfortablere, objektorientierte Weise: Die-Klasse Steuerelement oder Menü behandelt die Zeichnung. Dies wird "Self Zeichnung" bezeichnet.

CTRLTEST demonstriert die allgemeine Vorgehensweise von Ownerdrawing in die folgenden Befehle im Menü Custom implementiert werden:

  • Benutzerdefiniertes Menü - dieses Menüelement Ruft ein Popupmenü CColorMenuCMenu abgeleitet. Jedes Untermenüelement zeigt eine von acht Farben, die mit Hilfe des Selbstzeichnungsfeatures an. Ein Meldungsfeld bestätigt die Farbe im Untermenü auswählen.

  • Benutzerdefinierte Listenfeld - dieses Menüelement Ruft ein Dialogfeld, das eine CColorListBox, CListBox abgeleitet anzeigt. Das Listenfeld, das es acht Einträge, jeder in einer mit Hilfe des Selbstzeichnungsfeatures acht Farben gezeichnet wurde. TRACE -Ausgabe bestätigt die vorgenommene Auswahl aus dem Listenfeld aus.

Beispiel: Verwendet Ressource Dateien nicht von Visual C++-Ressourcen-Editoren verwaltet

Die CTRLTEST\RES\Ctrltest.rc2-Ressourcendatei ist ein Beispiel für eine Ressourcendatei nicht von Visual C++ Ressourcen-Editoren in lesbarer Form. Wenn Sie Ctrltest.rc2 in Visual C++ öffnen und speichern Sie es dann, verliert Sie nützliche lesbare Informationen, obwohl der Ressourcencompiler möglicherweise trotzdem würden die RC2-Datei kompiliert und erstellt eine äquivalente binäre RES-Datei. Folglich wurde RES\Ctrltest.rc2 als #include in der Datei Ctrltest.rc mit einer mit Befehl Datei Set Ressourcenincludes angegebene Kompilierzeit-Direktive hinzugefügt.

Im folgenden werden drei Kategorien lesbarer Daten, die nicht mit Visual C++-Ressourcen-Editoren verwaltet werden. Zwei dieser werden in Ctrltest.rc2 veranschaulicht:

  • Custom control styles symbols - Z. B. "msctls_updown32"für das Drehfeld-Steuerelement ist ein Format definiert werden. Obwohl Visual C++ dieses Symbol interpretieren können, wie er in die RC2-Datei liest, Visual C++ schreiben würden Sie die RC2-Datei als hexadezimalen Wert zurückgenommen.

  • Standard Windows WS_ or control style symbols used in a control from a standard Windows control-derived class - Z. B. ES_AUTOHSCROLL ist für das Drehfeld-Steuerelement im IDD_SPIN_EDIT-Dialogfeld definiert. Obwohl Visual C++ diese Symbole interpretieren können, wie er in die RC2-Datei liest, Visual C++ schreiben würden Sie die RC2-Dateien als hexadezimalen Wert zurückgenommen.

  • Arithmetic in the .rc file - Ausdrücken verwendet werden, z. B. "IDC_EDIT1 + 2"Identifizieren Sie Steuerelemente im IDD_SPIN_EDIT würde Dialogfeld zurück in die RC2-Datei als ein einzelner hexadezimaler Wert von Visual C++ geschrieben werden.

Das CTRLTEST-Beispiel veranschaulicht die vor- und Nachteile der Verwendung von RC2-Dateien in ein Dialogfeld mit ein benutzerdefiniertes Steuerelement, dessen Formate durch Konstanten in einer Headerdatei definiert sind. Beide Dialogfelder IDD_WNDCLASS_EDIT und IDD_SPIN_EDIT haben benutzerdefinierte Steuerelemente mit symbolisch definierten Formaten;aber IDD_WNDCLASS ist in einer RC-Datei mit dem Visual C++-Dialogfeld-Editor bearbeitet werden angegeben, wohingegen IDD_SPIN_EDIT in einer RC2-Datei angegeben ist, die nur manuell bearbeitet werden kann.

Die Unterschiede zwischen der Verwendung der RC-Datei und die RC2-Datei können wie folgt zusammengefasst werden.

Für das Dialogfeld IDD_WNDCLASS_EDIT ist das Ressourcenskript in der Datei Ctrltest.rc definiert. Für das Dialogfeld IDD_SPIN_EDIT ist das Ressourcenskript in RES\Ctrltest.rc2 definiert. Für das Dialogfeld IDD_WNDCLASS_EDIT das benutzerdefinierte WNDCLASS lautet "Paredit", die Style-Konstanten werden in der Datei PAREDIT.h definiert definiert und eine Beispiel Style-Konstante ist PES_NUMBER. IDD_WNDCLASS_EDIT ist in Visual C++ bearbeitet werden, jedoch nicht #define Formatvorlagen verwenden. IDD_SPIN_EDIT ist nicht in Visual C++ bearbeitet werden, aber #define Formate verwenden können.

Der Nachteil ist, wenn Sie die RC2-Datei verwenden, können Sie die lesbaren symbolischen Formate in der Headerdatei für das benutzerdefinierte Steuerelement verwenden, aber nicht Sie die RC2-Datei mit Visual C++-Dialog-Editor bearbeiten kann. Es ist einfacher gestalten das Dialogfeld mit Visual C++ als Ressourcenskript; manuell schreibenund das Schreiben von Ressourcenskript Weitere fehleranfällig ist. Andererseits, sind die Formate nicht selbstdokumentierend, wenn Sie vom Visual C++-Dialog-Editor im hexadezimalen Format auf der Eigenschaftenseite der benutzerdefinierten Steuerelemente angezeigt werden.

Schlüsselwörter

Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:

AfxGetInstanceHandle; AfxMessageBox; AfxThrowResourceException; CBitmapButton::AutoLoad; CDC::FillRect; CDC::FrameRect; CDialog::DoModal; CDialog::EndDialog; CDialog::OnInitDialog; CDialog::OnOK; CDialog::OnSetFont; CEdit::Create; CEdit::SetSel; CFrameWnd::Create; CListBox::AddString; CListBox::CompareItem; CListBox::DrawItem; CListBox::GetItemData; CListBox::MeasureItem; CMenu::AppendMenu; CMenu::CreateMenu; CMenu::Detach; CMenu::DrawItem; CMenu::EnableMenuItem; CMenu::FromHandle; CMenu::GetMenuString; CMenu::MeasureItem; CRect::Width; CStatic::Create; CString::Format; CString::LoadString; CWinApp::InitInstance; CWnd::Attach; CWnd::EnableWindow; CWnd::FromHandle; CWnd::GetDlgCtrlID; CWnd::GetDlgItem; CWnd::GetDlgItemInt; CWnd::GetMenu; CWnd::GetParent; CWnd::GetWindowRect; CWnd::GetWindowText; CWnd::IsWindowEnabled; CWnd::MessageBox; CWnd::OnChar; CWnd::OnCommand; CWnd::OnVScroll; CWnd::PostNcDestroy; CWnd::SendMessage; CWnd::SetDlgItemInt; CWnd::SetFocus; CWnd::SetFont; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::SubclassDlgItem; CallWindowProc; GetBValue; GetClassInfo; GetGValue; GetRValue; GetSystemMetrics; HIWORD; IsCharAlpha; IsCharAlphaNumeric; LOWORD; MAKEINTRESOURCE; MAKELONG; MessageBeep; ModifyMenu; RGB; RegisterClass; SetWindowLong

Hinweis

Einige Beispiele, z. B. eine, wurden nicht geändert, um Änderungen in der Visual C++-Assistenten, Bibliotheken und Compiler, demonstrieren aber dennoch wie Sie die gewünschte Aufgabe durchführen.

Siehe auch

Weitere Ressourcen

MFC-Beispiele