Méthode IWindowNative ::get_WindowHandle (microsoft.ui.xaml.window.h)
Récupère le handle de fenêtre (HWND) de la fenêtre représentée par l’objet qui implémente IWindowNative.
Pour plus d’informations et des exemples de code, consultez Récupérer un handle de fenêtre (HWND).
Syntaxe
HRESULT get_WindowHandle(
HWND *hWnd
);
Paramètres
hWnd
Handle de fenêtre (HWND).
Valeur retournée
Si cette méthode réussit, elle retourne S_OK. Sinon, elle retourne un code d’erreur HRESULT.
Notes
Exemples
Avant de suivre cet exemple, passez en revue ces rubriques :
Icône de fenêtre personnalisée
Dans cet exemple, nous montrons comment récupérer le handle de fenêtre (HWND) de notre fenêtre main et comment l’utiliser pour personnaliser la barre de titre de la fenêtre et son contenu.
Création d'un projet
- Dans Visual Studio, créez un projet C# ou C++/WinRT à partir du modèle de projet Application vide, empaquetée (WinUI 3 in Desktop).
MainWindow.xaml
Notes
Si vous avez besoin d’un fichier d’icônes à utiliser avec cette procédure pas à pas, vous pouvez télécharger le computer.ico
fichier à partir de l’exemple d’application WirelessHostednetwork . Placez ce fichier dans votre Assets
dossier et ajoutez le fichier à votre projet en tant que contenu. Vous serez ensuite en mesure de faire référence au fichier à l’aide de l’URL Assets/computer.ico
.
Sinon, n’hésitez pas à utiliser un fichier d’icônes que vous avez déjà et à modifier les deux références à celui-ci dans les listes de code ci-dessous.
- Dans la liste de code ci-dessous, vous verrez que
MainWindow.xaml
dans nous avons ajouté deux boutons et spécifié des gestionnaires De clic pour chacun d’eux. Dans le gestionnaire Click du premier bouton (basicButton_Click), nous définissons l’icône de la barre de titre et le texte. Dans la deuxième (customButton_Click), nous montrons une personnalisation plus significative en remplaçant la barre de titre par le contenu du StackPanel nommé customTitleBarPanel.
<Window
x:Class="window_titlebar.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:window_titlebar"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="rootElement" RowDefinitions="100, *, 100, *">
<StackPanel x:Name="customTitleBarPanel" Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Top" Visibility="Collapsed">
<Image Source="Images/windowIcon.gif" />
<TextBlock VerticalAlignment="Center" Text="Full customization of title bar"/>
</StackPanel>
<StackPanel x:Name="buttonPanel" Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center">
<Button x:Name="basicButton" Click="basicButton_Click" Margin="25">Set the Window title and icon</Button>
<Button x:Name="customButton" Click="customButton_Click" Margin="25">Customize the window title bar</Button>
</StackPanel>
</Grid>
</Window>
MainWindow.xaml.cs/cpp
- Dans la liste de code ci-dessous pour le gestionnaire de basicButton_Click, afin de garder la barre de titre personnalisée masquée, nous réduisez le StackPanelpersonnaliséTitleBarPanel et nous définissons la propriété ExtendsContentIntoTitleBar sur
false
. - Nous appelons ensuite IWindowNative ::get_WindowHandle (pour C#, à l’aide de la méthode d’assistance d’interopérabilité GetWindowHandle) pour récupérer le handle de fenêtre (HWND) de la fenêtre main.
- Ensuite, nous définissons l’icône d’application (pour C#, à l’aide du package NuGet PInvoke.User32 ) en appelant les fonctions LoadImage et SendMessage .
- Enfin, nous appelons SetWindowText pour mettre à jour la chaîne de barre de titre.
private void basicButton_Click(object sender, RoutedEventArgs e)
{
// Ensure the custom title bar content is not displayed.
customTitleBarPanel.Visibility = Visibility.Collapsed;
// Disable custom title bar content.
ExtendsContentIntoTitleBar = false;
//Get the Window's HWND
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
IntPtr hIcon = PInvoke.User32.LoadImage(
IntPtr.Zero,
"Images/windowIcon.ico",
PInvoke.User32.ImageType.IMAGE_ICON,
20, 20,
PInvoke.User32.LoadImageFlags.LR_LOADFROMFILE);
PInvoke.User32.SendMessage(
hwnd,
PInvoke.User32.WindowMessage.WM_SETICON,
(IntPtr)0,
hIcon);
PInvoke.User32.SetWindowText(hwnd, "Basic customization of title bar");
}
// pch.h
...
#include <microsoft.ui.xaml.window.h>
...
// MainWindow.xaml.h
...
void basicButton_Click(Windows::Foundation::IInspectable const& sender, Microsoft::UI::Xaml::RoutedEventArgs const& args);
...
// MainWindow.xaml.cpp
void MainWindow::basicButton_Click(IInspectable const&, RoutedEventArgs const&)
{
// Ensure the that custom title bar content is not displayed.
customTitleBarPanel().Visibility(Visibility::Collapsed);
// Disable custom title bar content.
ExtendsContentIntoTitleBar(false);
// Get the window's HWND
auto windowNative{ this->m_inner.as<::IWindowNative>() };
HWND hWnd{ 0 };
windowNative->get_WindowHandle(&hWnd);
HICON icon{ reinterpret_cast<HICON>(::LoadImage(nullptr, L"Assets/computer.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE)) };
::SendMessage(hWnd, WM_SETICON, 0, (LPARAM)icon);
this->Title(L"Basic customization of title bar");
}
- Dans le gestionnaire customButton_Click, nous définissons la visibilité du StackPanel customTitleBarPanel sur Visible.
- Nous définissons ensuite la propriété ExtendsContentIntoTitleBar sur
true
, et nous appelons SetTitleBar pour afficher le StackPanel customTitleBar comme barre de titre personnalisée.
private void customButton_Click(object sender, RoutedEventArgs e)
{
customTitleBarPanel.Visibility = Visibility.Visible;
// Enable custom title bar content.
ExtendsContentIntoTitleBar = true;
// Set the content of the custom title bar.
SetTitleBar(customTitleBarPanel);
}
// MainWindow.xaml.h
...
void customButton_Click(Windows::Foundation::IInspectable const& sender, Microsoft::UI::Xaml::RoutedEventArgs const& args);
...
// MainWindow.xaml.cpp
void MainWindow::customButton_Click(IInspectable const&, RoutedEventArgs const&)
{
customTitleBarPanel().Visibility(Visibility::Visible);
// Enable custom title bar content.
ExtendsContentIntoTitleBar(true);
// Set the content of the custom title bar.
SetTitleBar(customTitleBarPanel());
}
App.xaml
- Dans le
App.xaml
fichier, immédiatement après le<!-- Other app resources here -->
commentaire, nous avons ajouté des pinceaux de couleur personnalisée pour la barre de titre, comme indiqué ci-dessous.
<Application
x:Class="window_titlebar.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:window_titlebar">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
<!-- Other merged dictionaries here -->
</ResourceDictionary.MergedDictionaries>
<!-- Other app resources here -->
<SolidColorBrush x:Key="WindowCaptionBackground">Green</SolidColorBrush>
<SolidColorBrush x:Key="WindowCaptionBackgroundDisabled">LightGreen</SolidColorBrush>
<SolidColorBrush x:Key="WindowCaptionForeground">Red</SolidColorBrush>
<SolidColorBrush x:Key="WindowCaptionForegroundDisabled">Pink</SolidColorBrush>
</ResourceDictionary>
</Application.Resources>
</Application>
Si vous avez suivi ces étapes dans votre propre application, vous pouvez créer votre projet maintenant et l’exécuter. Vous verrez une fenêtre d’application semblable à la suivante (avec l’icône d’application personnalisée) :
Application modèle.
Voici la barre de titre personnalisée de base :
Application de modèle avec une icône d’application personnalisée.Voici la barre de titre entièrement personnalisée :
Application modèle avec barre de titre personnalisée.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 10, version 1809 (avec SDK d'application Windows 0,5 ou version ultérieure) |
En-tête | microsoft.ui.xaml.window.h |