Flutter windows程序窗口布满工作区

本文介绍了如何在Flutter Windows应用中使程序窗口布满工作区,遵循单一职责原则,只在Windows平台进行改动。主要涉及两个步骤:首先,在main.cpp中使用SystemParametersInfo函数获取屏幕工作区;其次,在win32_window.cpp的窗口创建函数中,不使用Scale转换分辨率,以实现窗口全屏显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flutter 改变Windows窗口大小有一个比较多的插件,很多都是在main.dart中注入,这样势必影响多平台应用。至少,我们也应该遵守单一职责原理,既然是windows的问题,那么就在windows中进行解决。

通过阅读Flutter中windows平台的代码,调整程序窗口大小的比较简单,只需要两步:

第一步,读取屏幕工作区,然后传值给窗口创建函数

在main.cpp中,找到下列代码

  FlutterWindow window(project);
  Win32Window::Point origin(10, 10);
  Win32Window::Size size(1280, 720);
  if (!window.CreateAndShow(L"packing", origin, size)) {
    return EXIT_FAILURE;
  }
  window.SetQuitOnClose(true);

修改为

  FlutterWindow window(project);
  //Win32Window::Point origin(10, 10);
  //Win32Window::Size size(1280, 720);
  RECT rt;
  SystemParametersInfo(SPI_GETWORKAREA,0,(PVOID)&rt,0);
  
  Win32Window::Point origin(rt.left, rt.top);
  Win32Window::Size size(rt.right-rt.left, rt.bottom-rt.top);
  if (!window.CreateAndShow(L"packing", origin, size)) {
    return EX
### 使用 `desktop_multi_window` 插件实现在 Windows 平台上 Flutter 应用的多窗口功能 为了在 Windows 平台上实现 Flutter 应用程序的多窗口支持,推荐使用 `desktop_multi_window` 換件[^2]。此插件专为简化桌面应用程序中的多窗口管理而设计,并兼容 Windows、macOS 和 Linux。 #### 添加依赖项 首先,在项目的 `pubspec.yaml` 文件中添加 `desktop_multi_window` 作为依赖: ```yaml dependencies: flutter: sdk: flutter desktop_multi_window: ^0.1.0+1 ``` 接着运行命令来安装这些依赖: ```bash flutter pub get ``` #### 初始化并配置项目 确保已启用对桌面开发的支持。如果尚未完成这一步,则需通过以下方式激活: ```bash flutter config --enable-windows-desktop ``` #### 编写代码以创建新窗口 下面是一个简单的例子展示如何利用 `desktop_multi_window` 来打开一个新的子窗口并与之交互: ```dart import 'package:flutter/material.dart'; import 'package:desktop_multi_window/desktop_multi_window.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); DesktopMultiWindow.registerNewWindowCallback(openNewSubWindow); // 注册回调函数用于处理新开窗口请求 runApp(MyApp()); } Future<void> openNewSubWindow(int id) async { final windowController = await DesktopMultiWindow.open(id); windowController.setTitle('子窗口 ${id}'); windowController.build((controller) => SubWindow(controller)); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: '主窗口', home: Scaffold( appBar: AppBar(title: Text('主窗口')), body: Center(child: ElevatedButton(onPressed: () => _openAnotherWindow(), child: const Text('Open New Window'))), ), ); } Future<void> _openAnotherWindow() async { try { int newId = await DesktopMultiWindow.openNewWindow(); // 打开新的窗口实例 } catch (e) { debugPrint(e.toString()); } } } class SubWindow extends StatefulWidget { final WindowController controller; SubWindow(this.controller); @override State<SubWindow> createState() => _SubWindowState(); } class _SubWindowState extends State<SubWindow> { TextEditingController textEditingController = TextEditingController(); @override void initState() { super.initState(); widget.controller.setMessageHandler((message) { setState(() { textEditingController.text = message; }); }); } @override Widget build(BuildContext context) { return Material( child: Column( children: [ TextField(controller: textEditingController,), ElevatedButton( onPressed: (){ widget.controller.sendMessage(textEditingController.text.trim()); // 向父窗口发送消息 }, child: const Text('Send Message') ) ], ), ); } } ``` 这段代码展示了怎样设置一个按钮触发事件去启动另一个独立运作的新窗口;同时也包含了基本的消息传递机制以便于两个窗口间的信息交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值