【问题标题】:How to set initial size and position of window for desktop app?如何设置桌面应用程序窗口的初始大小和位置?
【发布时间】:2020-04-22 16:02:49
【问题描述】:

我在尝试定位有关如何设置 Flutter 桌面应用程序窗口的初始大小和位置的信息时遇到问题。

在搜索时,我在 C++ 文件中发现了一些代码,但有谁知道是否有办法在 Dart 中设置它,或者只能在 C++ 文件中完成?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    此软件包可能会有所帮助:Bitsdojo Window。 它使您可以轻松地在 Windows、macOS 和 Linux 上自定义和使用 Flutter 桌面应用程序窗口。

    Watch the tutorial 开始使用。

    这个包的特点:

    • 自定义窗口框架 - 删除标准 Windows/macOS/Linux 标题栏和按钮
    • 启动时隐藏窗口
    • 显示/隐藏窗口
    • 使用 Flutter 小部件移动窗口
    • 最小化/最大化/恢复/关闭窗口
    • 设置窗口大小、最小尺寸和最大尺寸
    • 设置窗口位置
    • 在屏幕上设置窗口对齐方式(center/topLeft/topRight/bottomLeft/bottomRight)
    • 设置窗口标题

    【讨论】:

      【解决方案2】:

      一种通过平台代码修改的方法。可以通过该路径下的代码修改这两个属性:windowa/runner/main.cpp。这里是你要修改的代码: Win32Window::Point origin(kFlutterWindowOriginX, kFlutterWindowOriginY); Win32Window::Size size(kFlutterWindowWidth, kFlutterWindowHeight); 初始值在这里:windows/runner/window_configuration.cpp

      【讨论】:

        【解决方案3】:

        目前只能从平台代码中完成,因为窗口是在引擎之前创建的。

        请参阅this issue 了解此问题的可能解决方案;如果您对正在开发的平台上的平台工具包足够熟悉,则可以通过添加自定义 MethodChannel 并更改初始创建详细信息,在您自己的运行器中手动实现其中描述的解决方案本机窗口。

        【讨论】:

          【解决方案4】:

          有一个非常简单的方法可以做到这一点。有了这个库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));
                          },
                        ),
                      ],
                    ),
                  ),
                ),
              );
            }
          }

          【讨论】:

          • 您好,谢谢您的回复。很高兴看到现在存在这样的东西。桌面应用程序在一段时间内有点缺乏,至少到目前为止看起来是这样。当时我最终使用 go-flutter 解决了我的问题,然后最终修改了 CPP 文件,类似于我看到您所做的其他回复,但收藏了它以备将来使用。谢谢!
          • Desktop_Window 包不包含窗口定位???我在代码中的某个地方错过了吗?
          【解决方案5】:

          在我的情况下,我需要在右下角安排窗口,并且我像这样修补 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();
          }

          【讨论】:

            猜你喜欢
            • 2015-10-13
            • 2021-11-30
            • 1970-01-01
            • 2010-10-26
            • 2012-12-25
            • 2015-10-31
            • 1970-01-01
            • 1970-01-01
            • 2021-11-19
            相关资源
            最近更新 更多