Flutter windows程序窗口布满工作区

Posted lxhjh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter windows程序窗口布满工作区相关的知识,希望对你有一定的参考价值。

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 EXIT_FAILURE;
  
  window.SetQuitOnClose(true);

SystemParametersInfo(SPI_GETWORKAREA,0,(PVOID)&rt,0);

读取屏幕的工作区。

第二步,修改窗口创建函数(CreateAndShow),不使用Scale进行分别率转换。

在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;

  HWND window = CreateWindow(
      window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
      Scale(size.width, scale_factor), Scale(size.height, scale_factor),
      nullptr, nullptr, GetModuleHandle(nullptr), this);

  if (!window) 
    return false;
  

  return OnCreate();

修改为

bool Win32Window::CreateAndShow(const std::wstring& title,
                                const Point& origin,
                                const Size& size) 
  Destroy();

  const wchar_t* window_class =
      WindowClassRegistrar::GetInstance()->GetWindowClass();

  HWND window = CreateWindow(
      window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      origin.x, origin.y, 
      size.width,size.height,
      nullptr, nullptr, GetModuleHandle(nullptr), this);

  if (!window) 
    return false;
  

  return OnCreate();

以上是关于Flutter windows程序窗口布满工作区的主要内容,如果未能解决你的问题,请参考以下文章

Flutter windows程序窗口布满工作区

如何在 Flutter 移动端、Web 端和窗口中添加条件导入?

Flutter Desktop:如何隐藏窗口(并使进程保持活动状态)?

DIV+CSS效果求助,上下两个DIV,要求布满整个浏览器,且整个浏览器不能出现滚动条

Flutter Web:获取设备信息UA窗口大小等

Flutter Web:获取设备信息UA窗口大小等