| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter_window.h" |
| |
| #include <WinUser.h> |
| #include <flutter/flutter_engine.h> |
| #include <flutter/method_channel.h> |
| #include <flutter/plugin_registrar_windows.h> |
| #include <flutter/standard_method_codec.h> |
| |
| #include <cstdint> |
| #include <memory> |
| #include <optional> |
| #include <string> |
| |
| #include "flutter/generated_plugin_registrant.h" |
| |
| void RegisterMethodChannel(flutter::FlutterEngine* engine) { |
| FlutterDesktopPluginRegistrarRef plugin_registrar_ref = |
| engine->GetRegistrarForPlugin("platform_view"); |
| flutter::PluginRegistrarWindows* registrar = |
| flutter::PluginRegistrarManager::GetInstance() |
| ->GetRegistrar<flutter::PluginRegistrarWindows>(plugin_registrar_ref); |
| auto channel = |
| std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>( |
| registrar->messenger(), "samples.flutter.io/platform_view", |
| &flutter::StandardMethodCodec::GetInstance()); |
| channel->SetMethodCallHandler([](const auto& call, auto result) { |
| int counter = std::get<int32_t>(*call.arguments()); |
| std::string msg = std::string("Pressed the button ") + |
| std::to_string(counter) + " times!"; |
| MessageBoxA(NULL, msg.c_str(), "Popup", MB_OK); |
| result->Success(flutter::EncodableValue(counter)); |
| }); |
| } |
| |
| FlutterWindow::FlutterWindow(const flutter::DartProject& project) |
| : project_(project) {} |
| |
| FlutterWindow::~FlutterWindow() {} |
| |
| bool FlutterWindow::OnCreate() { |
| if (!Win32Window::OnCreate()) { |
| return false; |
| } |
| |
| RECT frame = GetClientArea(); |
| |
| // The size here must match the window dimensions to avoid unnecessary surface |
| // creation / destruction in the startup path. |
| flutter_controller_ = std::make_unique<flutter::FlutterViewController>( |
| frame.right - frame.left, frame.bottom - frame.top, project_); |
| // Ensure that basic setup of the controller was successful. |
| if (!flutter_controller_->engine() || !flutter_controller_->view()) { |
| return false; |
| } |
| RegisterPlugins(flutter_controller_->engine()); |
| RegisterMethodChannel(flutter_controller_->engine()); |
| SetChildContent(flutter_controller_->view()->GetNativeWindow()); |
| return true; |
| } |
| |
| void FlutterWindow::OnDestroy() { |
| if (flutter_controller_) { |
| flutter_controller_ = nullptr; |
| } |
| |
| Win32Window::OnDestroy(); |
| } |
| |
| LRESULT |
| FlutterWindow::MessageHandler(HWND hwnd, UINT const message, |
| WPARAM const wparam, |
| LPARAM const lparam) noexcept { |
| // Give Flutter, including plugins, an opportunity to handle window messages. |
| if (flutter_controller_) { |
| std::optional<LRESULT> result = |
| flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, |
| lparam); |
| if (result) { |
| return *result; |
| } |
| } |
| |
| switch (message) { |
| case WM_FONTCHANGE: |
| flutter_controller_->engine()->ReloadSystemFonts(); |
| break; |
| } |
| |
| return Win32Window::MessageHandler(hwnd, message, wparam, lparam); |
| } |