MSDN Magazin > Home > Ausgaben > 2007 > August >  Windows mit C++: Verbesserungen bei Windows Vis...
Windows mit C++
Verbesserungen bei Windows Vista-Steuerelementen
Kenny Kerr

Codedownload verfügbar unter: WindowsWithC++2007_08.exe (165 KB)
Browse the Code Online
Willkommen zur ersten Ausgabe von „Windows mit C++“. Der Schwerpunkt meiner Ausführungen liegt auf der Entwicklung für Windows Vista™ und Windows Server® 2008 mittels systemeigenem C++. In diesem Artikel werden neue, aufregende Features vorgestellt, die mit der neuesten Windows®-Version eingeführt wurden.
Zwei Gründe haben mich dazu bewogen, diesen Artikel zu schreiben. Erstens: Trotz des phänomenalen Erfolgs von Microsoft® .NET Framework gibt es noch immer zahlreiche Szenarios, für die es sinnvoller erscheint, systemeigenes C++ zu verwenden. Zwar nimmt die Akzeptanz von .NET weiter zu, doch C++ wird Bestand haben. Zweitens: Mit der Einführung eines wichtigen neuen Betriebssystems ist nicht unbedingt davon auszugehen, dass in all den verschiedenen Anwendungsframeworks, von MFC über Active Template Library (ATL) bis hin zu .NET und anderen, kurzfristig auch alle neuen Features und Verbesserungen enthalten sind. C++ bleibt die einzige Sprache, die ungehinderten Zugriff auf alle Teile des Windows SDK ermöglicht, und nicht nur in Windows Vista gibt es noch viele unbekannte Ecken zu erforschen! Weitere Informationen über die Zukunft von .NET finden Sie in der Randleiste „Was bringt .NET?“.
Zu Beginn dieser Reihe möchte ich auf Steuerelemente eingehen. Mit Windows Vista werden nicht viele neue Steuerelemente eingeführt (obwohl jedoch das neue Netzwerkadressen-Steuerelement bereitgestellt wird, das die Eingabe und Überprüfung von IPv4-, IPv6- und DNS-Namen ermöglicht), sondern es wird für viele vorhandene standardmäßige und allgemeine Steuerelemente eine Reihe von Verbesserungen und neuen Features geboten. Da Sie viele dieser neuen Features in Ihren Anwendungen mit nur wenig Aufwand nutzen können, ist dies eigentlich eine gute Nachricht. In diesem Artikel werde ich Ihnen einige der gebräuchlichsten Steuerelemente kurz vorstellen und verschiedene neue und aufregende Features erläutern, die ab Windows Vista zur Verfügung stehen. Der Download zu diesem Artikel (verfügbar auf der MSDN® Magazin-Website) enthält Beispiele für die meisten hier beschriebenen Steuerelemente.

Schaltflächen-Steuerelemente
Das Schaltflächen-Steuerelement ist für einige der scheinbar neuen Steuerelemente in Windows Vista verantwortlich. Aufgrund der neuen Stilkennzeichen unterscheiden sich die Schaltflächen im Aussehen erheblich von dem der herkömmlichen Schaltflächen. Abbildung 1 zeigt einige der neuen Schaltflächenstile.
Abbildung 1 Neue Schaltflächenstile unter Windows Vista 
Mit dem BS_SPLITBUTTON-Stil wird eine Trennschaltfläche erstellt. Das übergeordnete Fenster der Schaltfläche empfängt die BCN_DROPDOWN-Nachricht, die angibt, dass der Benutzer auf den Dropdownpfeil der Schaltfläche geklickt hat. Sie sind dann dafür verantwortlich, dass ein Kontextmenü angezeigt wird. Der Dropdownhandler könnte folgendermaßen implementiert werden:
CRect rectangle;
VERIFY(m_splitButton.GetWindowRect(
    &rectangle));

TPMPARAMS params = { sizeof(TPMPARAMS) };
params.rcExclude = rectangle;

CMenuHandle menu = m_menu.GetSubMenu(0);

VERIFY(menu.TrackPopupMenuEx(TPM_LEFTBUTTON,
    rectangle.left, rectangle.bottom,
    m_hWnd, &params));
Dieser Ausschnitt berechnet zuerst die Grenzen der Schaltfläche und füllt dann eine TPMPARAMS-Struktur, um TrackPopupMenuEx zu informieren, dass das Menü die Schaltfläche nicht überlappen soll, wenn es nicht an der gewünschten Stelle angezeigt werden kann. Stattdessen soll es an der nächsten verfügbaren Kante angezeigt werden. Sie können auch die Nachrichten BCM_GETSPLITINFO und BCM_SETSPLITINFO verwenden, um die Darstellung des Dropdownpfeils abzufragen und anzupassen. In den meisten Fällen werden jedoch die Standardwerte ausreichen.
Mit dem BS_COMMANDLINK-Stil wird ein Befehlslink erstellt. Befehlslinks weisen einen Pfeil neben der Schaltflächenbeschriftung sowie einen optionalen Hinweis in einer kleineren Schriftart auf. Die Beschriftung der Schaltfläche wird wie gewöhnlich mit der SetWindowText-Funktion festgelegt. Mit der neuen BCM_SETNOTE-Nachricht wird jedoch der Hinweis festgelegt, der unter der Beschriftung angezeigt wird.
Schließlich können Sie Windows auch anweisen, den inzwischen bekannten Schild „Elevation required“ (Berechtigungserweiterung erforderlich) auf einer Schaltfläche anzuzeigen, indem Sie die BCM_SETSHIELD-Nachricht senden. Wenn dabei LPARAM auf TRUE gesetzt ist, wird das Symbol eingefügt, und wenn LPARAM auf FALSE gesetzt ist, wird es entfernt. Hier ist ein einfaches Beispiel:
button.SendMessage(BCM_SETSHIELD, 0, required);

Bearbeitungs- und Kombinationsfeld-Steuerelemente
Seit Windows XP gibt es die Möglichkeit, mithilfe der EM_SETCUEBANNER-Nachricht einen Hinweistext auf Bearbeitungssteuerelementen anzuzeigen. Mit diesem Text wird der Benutzer nach Informationen gefragt, die ausgeblendet wurden, als das Steuerelement den Fokus erhielt. In Windows Vista wurde dieses Feature nur ein klein wenig, aber durchaus sinnvoll erweitert: Sie können den Hinweistext selbst dann anzeigen, wenn das Steuerelement den Fokus hat. Durch diese scheinbar kleine Verbesserung sind in vielen Fällen keine statischen Steuerelemente mehr notwendig. Sie setzen den zuvor nicht verwendeten Parameter WPARAM einfach auf TRUE, um dieses Feature zu nutzen. Der Einfachheit halber wird das Makro „Edit_SetCueBannerTextFocused“ zur Verfügung gestellt:
VERIFY(Edit_SetCueBannerTextFocused(m_edit, L”Cue text”, TRUE));
Bei Kombinationsfeldern wird in Windows Vista derselbe Effekt mit der CB_SETCUEBANNER-Nachricht erreicht. Allerdings besteht nicht die Möglichkeit, den Hinweistext anzuzeigen, wenn das Steuerelement den Fokus hat, und nur in Kombinationsfeldern mit dem Stil „Dropdown-Listenfeld“ wird der Hinweistext so lange angezeigt, bis eine Auswahl getroffen wurde. Dies ist in Abbildung 2 dargestellt.
Abbildung 2 Beispiel für ein Kombinationsfeld 
Aus praktischen Gründen wird das Makro „ComboBox_SetCueBannerText“ zur Verfügung gestellt:
VERIFY(ComboBox_SetCueBannerText(m_comboBox, L”Cue text”));

Strukturansicht-Steuerelemente
Mit der Einführung erweiterter Stile für das Strukturansicht-Steuerelement sind die Windows-Entwickler schließlich über ihren eigenen Schatten gesprungen. Abbildung 3 zeigt einige der neuen Stile und Designs für Strukturansicht-Steuerelemente in Aktion.
Abbildung 3 Strukturansicht 
Die Nachrichten TVM_GETEXTENDEDSTYLE und TVM_SETEXTENDEDSTYLE stehen zum Abrufen und Festlegen der Bitmaske erweiterter Stile zur Verfügung. Das Makro „TreeView_GetExtendedStyle“ umschließt die TVM_GETEXTENDEDSTYLE-Nachricht und kann wie folgt verwendet werden:
DWORD style = TreeView_GetExtendedStyle(m_treeView);
Normalerweise müssen Sie die erweiterten Stile jedoch nicht abrufen, da Sie mit der TVM_SETEXTENDEDSTYLE-Nachricht eine Teilmenge der Stilkennzeichen unter Verwendung einer Bitmaske aktualisieren können. Beispielsweise können Sie mithilfe des Makros „TreeView_SetExtendedStyle“, das die TVM_SETEXTENDEDSTYLE-Nachricht umschließt, folgendermaßen den erweiterten Stil TVS_EX_AUTOHSCROLL hinzufügen und gleichzeitig den erweiterten Stil TVS_EX_MULTISELECT entfernen:
TreeView_SetExtendedStyle(m_treeView,
                          TVS_EX_AUTOHSCROLL,
                          TVS_EX_AUTOHSCROLL | TVS_EX_MULTISELECT);
Die interessanteste Erweiterung des Strukturansicht-Steuerelements ist zweifellos die Unterstützung der Mehrfachauswahl. Endlich können Entwickler den ganzen Code, der eine Mehrfachauswahl nur vortäuscht, wegwerfen und einfach den erweiterten Stil TVS_EX_MULTISELECT verwenden. Den Rest erledigt das System. Selbstverständlich möchten Sie die ausgewählten Elemente auch auflisten. Dies ist durch die Einführung eines neuen Kennzeichens für die TVM_GETNEXTITEM-Nachricht möglich. Zuerst rufen Sie wie zuvor das derzeit ausgewählte Element mit dem TVGN_CARET-Kennzeichen ab. Die übrigen ausgewählten Elemente rufen Sie dann mit dem TVGN_NEXTSELECTED-Kennzeichen ab. Hier ist ein einfaches Beispiel, bei dem die Klassen „CTreeViewCtrlEx“ und „CTreeItem“ der Windows-Vorlagenbibliothek verwendet werden:
   for (CTreeItem item = 
        m_treeView.GetSelectedItem();
        0 != item;
        item = item.GetNext(TVGN_NEXTSELECTED))
        {
        CString text;
        item.GetText(text);
        TRACE(L”%s\n”, text);
        }
Die GetSelectedItem-Methode von CTreeViewCtrlEx sendet die TVM_GETNEXTITEM-Nachricht mit dem TVGN_CARET-Kennzeichen, um das erste ausgewählte Element abzurufen. Die GetNext-Methode von CTreeItem sendet die TVM_GETNEXTITEM-Nachricht erneut mit dem angegebenen Kennzeichen und dem Handle des Strukturelements, um den Nachrichtenkontext bereitzustellen.
Wenn Sie lediglich die Anzahl der ausgewählten Elemente kennen müssen, bietet die TVM_GETSELECTEDCOUNT-Nachricht die Lösung. Das zugehörige Makro „TreeView_GetSelectedCount“ umschließt die Nachricht und wird folgendermaßen verwendet:
DWORD count = TreeView_GetSelectedCount(m_treeView);
Einige andere erweiterte Stile sind ebenfalls eine Prüfung wert. Der erweiterte Stil TVS_EX_DOUBLEBUFFER weist das Steuerelement an, dass seine Darstellung über doppelte Pufferung erfolgen soll. Dadurch wird beim Ändern der Steuerelementgröße das Flimmern vermieden. Mit dem erweiterten Stil TVS_EX_AUTOHSCROLL kann das Steuerelement automatisch ein ausgewähltes Strukturelement in den Anzeigebereich scrollen. Er wird oft in Kombination mit dem TVS_NOHSCROLL-Stil verwendet, der die horizontale Bildlaufleiste ausblendet. Hier ist ein einfaches Beispiel:
DWORD treeViewStyle = m_treeView.GetStyle();
treeViewStyle |= TVS_NOHSCROLL;
m_treeView.SetWindowLong(GWL_STYLE, treeViewStyle);

TreeView_SetExtendedStyle(m_treeView,
                          TVS_EX_AUTOHSCROLL,
                          TVS_EX_AUTOHSCROLL);
Obwohl das Standardverhalten in der Regel ausreichend ist, können Sie die Animationseigenschaften für den automatischen Bildlauf mit der TVM_SETAUTOSCROLLINFO-Nachricht steuern.
Vielleicht haben Sie auch bemerkt, dass Windows Explorer unter Windows Vista nun neue „Expando“-Schaltflächen bietet, die ein- und ausgeblendet werden können und anstelle der früheren Plus-/Minus-Felder eine neue Pfeilbitmap aufweisen. Mit der SetWindowTheme-Funktion können Sie zu Pfeilen wechseln. Sie weist Windows an, für das angegebene Steuerelement die mit Windows Explorer übereinstimmenden visuellen Stile zu verwenden:
COM_VERIFY(::SetWindowTheme(m_treeView, L”explorer”, 0));
Den Effekt des Ein- und Ausblendens können Sie mit dem erweiterten Stil TVS_EX_FADEINOUTEXPANDOS anfordern.

Kopfzeilen- und Listenansicht-Steuerelemente
Obwohl relativ wenige Entwickler das Kopfzeilen-Steuerelement direkt verwenden, sind praktisch alle Windows-Entwickler mit dem Listenansicht-Steuerelement vertraut, das bei vielen seiner Features in erster Linie auf dem Kopfzeilen-Steuerelement basiert. Sowohl Kopfzeilen- als auch Listenansicht-Steuerelemente haben in Windows Vista viele Verbesserungen erfahren. In diesem Abschnitt möchte ich diese Features aus der Perspektive der Listenansicht-Steuerelemente in den Mittelpunkt stellen, da die meisten Entwickler mit diesen Steuerelementen vertraut sind. Viele Features können jedoch auch ohne ein Listenansicht-Steuerelement eingesetzt werden, und einige erfordern direkte Interaktion mit dem Kopfzeilen-Steuerelement.
Das Listenansicht-Steuerelement wurde in Windows Vista mit vielen neuen Features, Stilen und Verbesserungen aktualisiert. Im Gegensatz zum Strukturansicht-Steuerelement sind für das Listenansicht-Steuerelement seit geraumer Zeit erweiterte Stile verfügbar. In Windows Vista wurden jedoch einige neue erweiterte Stile definiert, die wesentlich umfangreichere Benutzerinteraktionen ermöglichen.
Mit dem erweiterten Stil LVS_EX_AUTOSIZECOLUMNS wird die Größe der angezeigten Spalten automatisch angepasst, wenn die Größe einer Spalte geändert wird, damit die verschiedenen Spalten optimal in die Ansicht passen. Dies ist eine sehr praktische Funktion für Benutzer, die Sie problemlos hinzufügen können.
Der Stil LVS_EX_AUTOCHECKSELECT stellt das Kontrollkästchen „Alle auswählen“ zur Verfügung, das in Tabellensteuerelementen von Webanwendungen so häufig vorkommt. Er entspricht dem neuen HDS_CHECKBOXES-Stil für Kopfzeilen-Steuerelemente. In der Spaltenüberschrift wird oberhalb der Kontrollkästchen für die einzelnen Elemente ein Kontrollkästchen platziert. Durch Klicken in das Kontrollkästchen werden alle Kontrollkästchen der Elemente in der Listenansicht gleichzeitig aktiviert bzw. deaktiviert. Abbildung 4 zeigt hierfür ein Beispiel.
Abbildung 4 Listenansicht-Steuerelement „Alle auswählen“ 
Um dieses Windows Explorer-Design für Ihre Listenansicht zu erhalten, müssen Sie lediglich wie beim Strukturansicht-Steuerelement die SetWindowTheme-Funktion aufrufen, um Windows anzuweisen, die mit Windows Explorer konsistenten visuellen Stile zu verwenden.
Der erweiterte Stil LVS_EX_COLUMNSNAPPOINTS funktioniert in Verbindung mit Ergänzungen der LVCOLUMN-Struktur und passt eine bestimmte Spalte an eine Mindestbreite an, wenn der Benutzer deren Größe ändert. Dieses Verhalten wird auch bei Verwendung des erweiterten Stils LVS_EX_AUTOSIZECOLUMNS zur Verfügung gestellt. Um dieses Feature zu nutzen, fügen Sie einen der beiden erweiterten Stile hinzu und bereiten die LVCOLUMN-Struktur entsprechend vor. Im folgenden Beispiel wird eine Spalte mit einer anfänglichen Breite von 200 Pixel und einer Mindestbreite von 100 Pixel eingefügt:
LVCOLUMN column = { 0 };
column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_MINWIDTH;
column.pszText = L”Name”;
column.cx = 200; // initial width
column.cxMin = 100; // minimum width
m_listView.InsertColumn(0, &column);
Mithilfe der neuen LVCF_MINWIDTH-Maske wird angegeben, dass das cxMin-Feld gefüllt wird und die Mindestbreite der Spalte darstellt.
Ein weiteres Feature von Windows Vista, das Ihnen vielleicht aufgefallen ist, besteht darin, dass Windows Explorer die Spaltenüberschrift in allen Ansichten und nicht nur im Ansichtsmodus „Details“ anzeigt. Standardmäßig ist das Kopfzeilen-Steuerelement nur im Ansichtsmodus „Details“ sichtbar. Mit dem erweiterten Stil LVS_EX_HEADERINALLVIEWS können Sie auf einfache Art und Weise die Spaltenüberschriften in allen Ansichtsmodi zeigen. Obwohl sich der Benutzer erst daran gewöhnen muss, ist dies ein sehr praktisches Feature, da der Benutzer dadurch die Ansicht in verschiedenen Ansichtsmodi sortieren kann.
Vielleicht haben Sie auch bemerkt, dass in einem anderen Ansichtsmodus, z. B. im Kachelansichtsmodus, die Größe der Spalten in Windows Explorer nicht geändert werden kann und keine horizontale Bildlaufleiste verwendet wird, um überlaufende Spaltenüberschriften in den Anzeigebereich zu scrollen. Stattdessen wird eine Überlaufschaltfläche im Kopfzeilen-Steuerelement angezeigt. Durch Klicken auf die Schaltfläche wird ein Popupmenü mit einer Liste der Spaltenüberschriften angezeigt, die nicht sichtbar sind und folglich überlaufen. Um dieses Verhalten zu reproduzieren, sind mehrere Schritte erforderlich.
Zuerst müssen Sie einen anderen Ansichtsmodus als „Details“ festlegen und den erweiterten Stil LVS_EX_HEADERINALLVIEWS zum Anzeigen der Spaltenüberschriften verwenden. In einem zweiten Schritt müssen Sie die Stile HDS_NOSIZING und HDS_OVERFLOW dem Kopfzeilen-Steuerelement des Listenansicht-Steuerelements wie folgt hinzufügen:
CHeaderCtrl header = m_listView.GetHeader();
DWORD headerStyle = header.GetStyle();
headerStyle |= HDS_NOSIZING | HDS_OVERFLOW;
header.SetWindowLong(GWL_STYLE, headerStyle);
Der HDS_NOSIZING-Stil deaktiviert die Größenänderung aller Spalten, und der HDS_OVERFLOW-Stil zeigt bei Bedarf eine Überlaufschaltfläche an. Abschließend müssen Sie die HDN_OVERFLOWCLICK-Nachricht für das Kopfzeilen-Steuerelement verarbeiten. An dieser Stelle können Sie ein Popupfenster oder eine bestimmte Art von Menü anzeigen, damit die übergelaufenen Spalten dem Benutzer angezeigt werden. Dazu können Sie die TrackPopupMenu-Funktion verwenden. Der durch LPARAM der Nachricht bereitgestellte iItem-Member der NMHEADER-Struktur liefert Ihnen den Index der ersten übergelaufenen Spalte.
Ein weiteres neues Feature des Kopfzeilen-Steuerelements ist die Trennschaltfläche. Die Spaltenüberschrift sieht den im Abschnitt über Schaltflächen-Steuerelemente beschriebenen Trennschaltflächen sehr ähnlich. Wenn sich der Mauszeiger über der Spaltenüberschrift befindet, wird eine Dropdown-Schaltfläche angezeigt. Zum Vorbereiten der LVCOLUMN-Struktur für eine neue Spalte verwenden Sie das Formatkennzeichen LVCFMT_SPLITBUTTON. Dies entspricht dem Formatkennzeichen HDF_SPLITBUTTON, das bei der direkten Arbeit mit einem Kopfzeilen-Steuerelement mit der HDITEM-Struktur verwendet wird. Die LVN_COLUMNDROPDOWN-Nachricht wird vom Listenansicht-Steuerelement gesendet, wenn auf die Dropdown-Schaltfläche geklickt wird. Diese entspricht wiederum der HDN_DROPDOWN-Nachricht, wenn Sie direkt mit einem Kopfzeilen-Steuerelement arbeiten. Der Parameter LPARAM der LVN_COLUMNDROPDOWN-Nachricht ist ein Zeiger auf eine NMLISTVIEW-Struktur, und das iSubItem-Feld gibt den Index der Spalte an, auf deren Dropdown-Schaltfläche geklickt wurde.
Ein weiterer Aspekt der Listenansicht-Steuerelemente, der in Windows Vista aktualisiert wurde, sind die Gruppierungsfeatures. Abbildung 5 zeigt einige der neuen Beschriftungen für eine Gruppe. Die Größe der LVGROUP-Struktur, die zur Definition von Listenansichtsgruppen verwendet wird, hat sich mehr als verdoppelt.
Abbildung 5 Listenansichtsgruppierung 
Die in Abbildung 5 dargestellte Gruppe kann wie folgt erstellt werden:
LVGROUP group = { sizeof(LVGROUP) };

group.mask = LVGF_GROUPID | LVGF_HEADER | LVGF_SUBTITLE | LVGF_TASK | 
             LVGF_FOOTER | LVGF_STATE | LVGF_ALIGN;

group.iGroupId = 1;
group.pszHeader = L”Header”;
group.pszSubtitle = L”Subtitle”;
group.pszTask = L”Task”;
group.pszFooter = L”Footer”;
group.state = LVGS_COLLAPSIBLE;
group.uAlign = LVGA_FOOTER_RIGHT | LVGA_HEADER_CENTER;

m_listView.InsertGroup(-1, &group);
Was bringt .NET?
In zukünftigen Versionen von .NET Framework werden zweifellos viele der in diesem Artikel beschriebenen Features weiter optimiert. Sie müssen jedoch nicht auf zukünftige Versionen warten, um diese Features in Ihren .NET Framework-basierten Anwendungen zu nutzen, da Windows Forms in den meisten Fällen die notwendigen Ansatzpunkte bietet, um die Anwendungen mit neuer Funktionalität auszustatten.
Für viele der beschriebenen Features ist es erforderlich, dass einem Steuerelement eine Nachricht gesendet wird. Nachrichten werden normalerweise mithilfe der SendMessage-Funktion gesendet, die von der user32.dll-Systembibliothek exportiert wird. Diese Funktion kann folgendermaßen in Ihre verwaltete Anwendung importiert werden:
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr window, int message, 
                              IntPtr wParam, IntPtr lParam);
Im Abschnitt zu den Strukturansicht-Steuerelementen in diesem Artikel wurde beispielsweise beschrieben, wie Sie Mehrfachauswahlen aktivieren. Sie können dieselbe Aktion mit der Windows Forms-Klasse „TreeView“ unter Verwendung des folgenden Codes durchführen:
int TVM_SETEXTENDEDSTYLE = 4396;
int TVS_EX_MULTISELECT = 2;

SendMessage(m_treeView.Handle, TVM_SETEXTENDEDSTYLE,
            new IntPtr(TVS_EX_MULTISELECT),
            new IntPtr(TVS_EX_MULTISELECT));
Im Folgenden finden Sie ein weiteres Beispiel, in dem die Verarbeitung von Benachrichtigungen veranschaulicht wird. Die Windows Forms-Klasse „Control“ stellt die geschützte WndProc-Methode bereit, mit der Sie bestimmte Nachrichten bei Bedarf verarbeiten können. Viele der Nachrichten, die von Steuerelementen gesendet werden, um den Besitzer des Steuerelements über verschiedene Ereignisse zu informieren, werden in Form einer WM_NOTIFY-Nachricht gesendet, wobei LPARAM als Zeiger auf eine NMHDR-Struktur dient. Das Codemitglied der NMHDR-Struktur identifiziert die Benachrichtigung, die gesendet wird. Im Folgenden wird gezeigt, wie Sie eine Benachrichtigung in verwaltetem Code verarbeiten:
struct NMHDR
{
    public IntPtr hwndFrom;
    public IntPtr idFrom;
    public int code;
}

const int WM_NOTIFY = 0x004E;

protected override void WndProc(ref Message message)
{
    bool handled = false;

    if (WM_NOTIFY == message.Msg)
    {
        NMHDR header = (NMHDR)Marshal.PtrToStructure(message.LParam,
                                                     typeof(NMHDR));
        if (<someCode> == header.code)
        {
            // TODO: handle notification here
            handled = true;
        }
    }

    if (!handled)
    {
        base.WndProc(ref message);
    }
}

Mit dem Statuskennzeichen LVGS_COLLAPSIBLE kann die Gruppe reduziert und erweitert werden. Beim Reduzieren einer Gruppe werden die Listenansichtselemente, die zur Gruppe gehören, ausgeblendet. Mit dem Statuskennzeichen LVGS_COLLAPSED kann eine Gruppe programmgesteuert reduziert werden. Die LVGA_-Kennzeichen dienen dazu, die standardmäßige Ausrichtung der Gruppenbeschriftungen außer Kraft zu setzen. In Kopf- und Fußzeilen ist Text normalerweise linksbündig ausgerichtet. Untertitel werden immer unter der Überschrift angezeigt. Der Aufgabenlink ist immer rechtsbündig ausgerichtet. Die LVN_LINKCLICK-Nachricht wird gesendet, wenn der Benutzer auf den Aufgabenlink klickt. Die Gruppe, zu der der Aufgabenlink gehört, wird vom iSubItem-Feld des NMLVLINK-Zeigers angegeben, der als LPARAM der Nachricht bereitgestellt wird.
Abschließend haben Sie die Option, auf die LVN_GETEMPTYMARKUP-Nachricht zu reagieren, um Text zur Verfügung zu stellen, der angezeigt werden soll, wenn das Listenansicht-Steuerelement keine Elemente enthält. Bei Bedarf können Sie mit dem Ankertag im Text Links erstellen. Hier sehen Sie ein Beispiel für eine Funktion, welche die Nachricht verarbeitet:
LRESULT OnGetEmptyMarkup(LPNMHDR notifyData)
{
    NMLVEMPTYMARKUP* markupInfo = 
        reinterpret_cast<NMLVEMPTYMARKUP*>(notifyData);

    markupInfo->dwFlags = EMF_CENTERED;

    wcscpy_s(markupInfo->szMarkup,
             _countof(markupInfo->szMarkup),
             L”Link <A>one</A> and <A>two</A>.”);

    return TRUE; // set the markup
}
Standardmäßig wird die Nachricht in der oberen linken Ecke der Listenansicht angezeigt. Das EMF_CENTERED-Kennzeichen zentriert diese sowohl horizontal als auch vertikal. Die Listenansicht meldet auf dieselbe Art und Weise wie Gruppenaufgabenlinks, dass ein Benutzer auf einen Link klickt. Ein bestimmter LVN_LINKCLICK-Nachrichtenhandler kann jedoch freigegeben werden. Im Falle eines leeren Markuplinks werden die iItem- und iSubItem-Member der NMLVLINK-Struktur auf -1 gesetzt, und die verschachtelte LITEM-Struktur wird gefüllt, wobei der Linkbezeichner auf EmptyMarkup und sein iLink-Member auf den Index des Links im Text gesetzt wird.

Zusammenfassung
Wenn Sie sich unter Zuhilfenahme des Windows SDK mit den Steuerelementen von Windows Vista befassen, werden Sie noch viele weitere kleine Features und Verbesserungen entdecken. Viele Szenarios, die zuvor besitzerspezifisch oder benutzerdefiniert entwickelt werden mussten, werden nun einfach bereitgestellt. Außerdem bieten bevorstehende Versionen von Windows-Vorlagenbibliothek und MFC viele Verbesserungen, mit denen Sie die verbesserten Steuerelemente von Windows Vista einfacher nutzen können. Weitere Informationen finden Sie unter MFC-Updates für allgemeine Vista-Steuerelemente.

Senden Sie Fragen und Kommentare für Kenny (in englischer Sprache) an mmwincpp@microsoft.com mmwincpp@microsoft.com.


Kenny Kerr ist Softwarespezialist, der auf die Softwareentwicklung für Windows spezialisiert ist. Er schreibt leidenschaftlich gern und unterrichtet Entwickler in den Bereichen Programmieren und Softwareentwurf. Sie erreichen Kenny Kerr unter weblogs.asp.net/kennykerr.

Page view tracker