【发布时间】:2020-04-22 16:02:49
【问题描述】:
我在尝试定位有关如何设置 Flutter 桌面应用程序窗口的初始大小和位置的信息时遇到问题。
在搜索时,我在 C++ 文件中发现了一些代码,但有谁知道是否有办法在 Dart 中设置它,或者只能在 C++ 文件中完成?
【问题讨论】:
标签: flutter
我在尝试定位有关如何设置 Flutter 桌面应用程序窗口的初始大小和位置的信息时遇到问题。
在搜索时,我在 C++ 文件中发现了一些代码,但有谁知道是否有办法在 Dart 中设置它,或者只能在 C++ 文件中完成?
【问题讨论】:
标签: flutter
此软件包可能会有所帮助:Bitsdojo Window。 它使您可以轻松地在 Windows、macOS 和 Linux 上自定义和使用 Flutter 桌面应用程序窗口。
Watch the tutorial 开始使用。
这个包的特点:
- 自定义窗口框架 - 删除标准 Windows/macOS/Linux 标题栏和按钮
- 启动时隐藏窗口
- 显示/隐藏窗口
- 使用 Flutter 小部件移动窗口
- 最小化/最大化/恢复/关闭窗口
- 设置窗口大小、最小尺寸和最大尺寸
- 设置窗口位置
- 在屏幕上设置窗口对齐方式(center/topLeft/topRight/bottomLeft/bottomRight)
- 设置窗口标题
【讨论】:
一种通过平台代码修改的方法。可以通过该路径下的代码修改这两个属性:windowa/runner/main.cpp。这里是你要修改的代码:
Win32Window::Point origin(kFlutterWindowOriginX, kFlutterWindowOriginY); Win32Window::Size size(kFlutterWindowWidth, kFlutterWindowHeight);
初始值在这里:windows/runner/window_configuration.cpp
【讨论】:
目前只能从平台代码中完成,因为窗口是在引擎之前创建的。
请参阅this issue 了解此问题的可能解决方案;如果您对正在开发的平台上的平台工具包足够熟悉,则可以通过添加自定义 MethodChannel 并更改初始创建详细信息,在您自己的运行器中手动实现其中描述的解决方案本机窗口。
【讨论】:
有一个非常简单的方法可以做到这一点。有了这个库desktop_window,可以设置窗口大小等等。示例如下
import 'package:desktop_window/desktop_window.dart';
import 'package:flutter/material.dart';
void main() async {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
appBar: AppBar(
title: const Text('desktop_window example app'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
child: Text("setMinWindowSize(300,400)"),
onPressed: () async {
await DesktopWindow.setMinWindowSize(Size(300, 400));
},
),
RaisedButton(
child: Text("setMaxWindowSize(800,800)"),
onPressed: () async {
await DesktopWindow.setMaxWindowSize(Size(800, 800));
},
),
],
),
),
),
);
}
}
【讨论】:
在我的情况下,我需要在右下角安排窗口,并且我像这样修补 CreateAndShow(...) 方法(${dir project}\windows\runner\win32 window.cpp):
bool Win32Window::CreateAndShow(const std::wstring& title,
const Point& origin,
const Size& size) {
Destroy();
const wchar_t* window_class =
WindowClassRegistrar::GetInstance()->GetWindowClass();
const POINT target_point = {static_cast<LONG>(origin.x),
static_cast<LONG>(origin.y)};
HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
double scale_factor = dpi / 96.0;
int monitor_width = GetSystemMetrics(SM_CXSCREEN);
int monitor_hight = GetSystemMetrics(SM_CYSCREEN);
int new_x_position = monitor_width - size.width;
int new_y_position = monitor_hight - size.height;
HWND window = CreateWindow(
window_class, title.c_str(), WS_POPUP|WS_VISIBLE|WS_SYSMENU,
Scale(new_x_position, scale_factor), Scale(new_y_position, scale_factor),
Scale(size.width, scale_factor), Scale(size.height, scale_factor),
nullptr, nullptr, GetModuleHandle(nullptr), this);
if (!window) {
return false;
}
return OnCreate();
}
【讨论】: