Appliquer l’effet Mica dans les applications de bureau Win32 pour Windows 11
Mica est un matériau opaque qui incorpore le thème de l’utilisateur et le papier peint de bureau pour créer une apparence hautement personnalisée. Lorsque l’utilisateur déplace la fenêtre sur l’écran, le matériau Mica s’adapte dynamiquement pour créer une visualisation enrichie à l’aide du papier peint sous l’application. En outre, le matériau aide les utilisateurs à se concentrer sur la tâche actuelle en revenant à une couleur neutre lorsque l’application est inactive.
Cet article explique comment appliquer Mica comme couche de base de votre application Win32, en hiérarchisant l’application et la visibilité dans la zone de barre de titre. Pour plus d’informations sur les couches d’application avec Mica, consultez Matériau Mica.
Prérequis
Pour appliquer Mica à une application Win32 pour Windows 11, vous devez utiliser le SDK d’application Windows. Vous aurez besoin des éléments suivants :
- Installez la dernière version de l’extension Visual Studio du SDK d’application Windows ou le package NuGet Microsoft.WindowsAppSDK. Consultez Téléchargements pour le SDK d’application Windows.
- Pour les applications non empaquetées, référencez le SDK d’application Windows, installez WinRT et Windows redistribuable App Runtime correspondant (Microsoft.WindowsAppRuntime.Redist). Consultez le Guide de déploiement du SDK Windows App pour les applications dépendantes du framework empaquetées avec un emplacement externe ou non empaquetées.
Utilisation de Mica dans les applications Win32
Pour utiliser Mica dans votre application, vous utilisez la classe MicaController. Cette classe gère à la fois le rendu du matériau de fond du système ainsi que la gestion de la stratégie système pour le matériel Mica.
Le MicaController réagit aux thèmes Clair et Foncé système par défaut. Pour remplacer ce comportement, vous pouvez transmettre les propriétés suivantes au MicaController :
Conseil
Le code de cette section est extrait de l’exemple Win32 Mica de SDK d’application Windows sur GitHub. Consultez le dépôt GitHub pour voir le code complet. Ces exemples utilisent C++/WinRT.
Pour activer Mica, vous avez besoin d’une référence au SDK d’application Windows, à un Compositeur et à un DispatcherQueue.
Cet exemple montre comment effectuer les opérations suivantes pour configurer une application non empaquetée :
- Initialisez WinRT.
- Référencez le WindowsAppSDK à partir d’une application non empaquetée.
- Pour plus d’informations, consultez Utiliser le runtime du SDK Windows App pour les applications empaquetées avec un emplacement externe ou non empaquetées.
- Consultez
WindowsAppSDKBootstrapperContext
dans Utilities.h pour obtenir un exemple de code.
- Inscrivez la classe de fenêtre.
- Créer le contrôleur de file d’attente du répartiteur Mica
- Initialisez un compositeur WinRT.
À partir de WinMain.cpp
int __stdcall WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ PSTR, _In_ int)
{
// Initialize WinRt Instance
winrt::init_apartment();
// Enable referencing the WindowsAppSDK from an unpackaged app.
Utilities::WindowsAppSDKBootstrapperContext sdkContext;
// Register Window class before making the window.
MicaWindow::RegisterWindowClass();
// Mica requires a compositor, which also requires a dispatcher queue.
auto controller = Utilities::CreateDispatcherQueueControllerForCurrentThread();
auto compositor = winrt::Compositor();
// Create your window...
...
}
À partir de MicaWindow.cpp
void MicaWindow::RegisterWindowClass()
{
auto instance = winrt::check_pointer(GetModuleHandleW(nullptr));
WNDCLASSEX wcex = { sizeof(wcex) };
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.hInstance = instance;
wcex.hIcon = LoadIconW(instance, IDI_APPLICATION);
wcex.hCursor = LoadCursorW(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszClassName = ClassName.c_str();
wcex.hIconSm = LoadIconW(wcex.hInstance, IDI_APPLICATION);
winrt::check_bool(RegisterClassExW(&wcex)); // check if the window class was registered successfully
}
La méthode winrt::init_apartment
est multithread par défaut. Si votre application nécessite un thread unique, comme l’exemple WebView2, vous pouvez facilement définir le type.
winrt::init_apartment(winrt::apartment_type::single_threaded);
Vous pouvez maintenant utiliser la fonction CreateWindowEx()
pour créer une fenêtre. Ensuite, vous devez créer une cible de fenêtre et la définir comme racine pour spécifier la couche à laquelle appliquer Mica. Enfin, vérifiez que Mica est pris en charge par la fenêtre et la cible.
L’exemple Win32 Mica crée les classes DesktopWindow et MicaWindow pour effectuer ce travail. Ces classes définissent : ClassName
, windowTitle
, m_target
, m_micaController
et m_isMicaSupported
.
À partir de WinMain.cpp
// Mica window is inherited from the MicaWindow class, which is an extension of the DesktopWindow Class.
// Here, we initialize the main window and set the title.
auto window = MicaWindow(compositor, L"Hello, Mica!");
À partir de MicaWindow.cpp
// Create the main window and enable Mica.
MicaWindow::MicaWindow(const winrt::Compositor& compositor, const std::wstring& windowTitle)
{
auto instance = winrt::check_pointer(GetModuleHandleW(nullptr));
WINRT_ASSERT(!m_window); // check that window is not initialized
WINRT_VERIFY(
// Window Properties
CreateWindowExW(
WS_EX_COMPOSITED,
ClassName.c_str(), // declared in MicaWindow.h and defined above
windowTitle.c_str(),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
800, 600,
nullptr,
nullptr,
instance,
this
));
// Check that the window was created successfully.
WINRT_ASSERT(m_window);
ShowWindow(m_window, SW_SHOWDEFAULT);
UpdateWindow(m_window);
// The Mica controller needs to set a target with a root to recognize the visual base layer.
m_target = CreateWindowTarget(compositor);
// Need to set a root before we can enable Mica.
m_target.Root(compositor.CreateContainerVisual());
m_micaController = winrt::MicaController();
m_isMicaSupported = m_micaController.SetTarget(winrt::Microsoft::UI::WindowId{ reinterpret_cast<uint64_t>(m_window) }, m_target);
}
Utilisation de Mica dans les applications WebView2 Win32
Les principes fondamentaux de l’application de Mica sont cohérents dans la plupart des applications Win32. Le processus pour WebView2 suit les étapes de base des instructions Win32 présentées précédemment. Toutefois, dans ce cas, vous devez spécifier un processus à thread unique à partir de la fonctionnalité init_apartment
de WinRT.
Conseil
Le code de cette section est extrait de l’exemple WebView2 Mica de SDK d’application Windows sur GitHub. Consultez le dépôt GitHub pour voir le code complet.
Pour commencer, configurez le cloisonnement, le contrôleur, le compositeur, la cible et la racine requis. Par défaut, la fonction init_apartment
WinRT est multithread, mais WebView2 est intrinsèquement à thread unique. Pour définir init_apartment
en tant que thread unique, passez le paramètre winrt::apartment_type::single_threaded
. Dans l’exemple Mica WebView2, nous simplifions la syntaxe en créant une classe distincte pour les fonctions de vue web, référencées dans le code suivant.
À partir de Main.cpp
int __stdcall WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ PSTR, _In_ int)
{
winrt::init_apartment(winrt::apartment_type::single_threaded);
// Enable referencing the WindowsAppSDK from an unpackaged app.
// Remember to have a matching Microsoft.WindowsAppRuntime.Redist installed.
// https://learn.microsoft.com/windows/apps/windows-app-sdk/deploy-unpackaged-apps
Utilities::WindowsAppSDKBootstrapperContext sdkContext;
CompositionWindow::RegisterWindowClass();
// A dispatcher queue is required to be able to create a compositor.
auto controller = Utilities::CreateDispatcherQueueControllerForCurrentThread();
auto compositor = winrt::Compositor();
auto window = WebView2Window(compositor, L"Hello, WebView2!");
...
}
Pour obtenir une démonstration complète de la classe WebView2Window et de son intégration à Mica, consultez l’exemple WebView2 Mica de SDK d’application Windows sur GitHub. Notez comment les classes CompositionWindow et WebView2Window gèrent les messages, initialisez l’environnement d’affichage web et supprimez le contrôleur de fenêtre une fois la fenêtre fermée.
Articles connexes
Matériaux, Couches et élévation, Exemples Mica du SDK d’application Windows
Windows developer