Flutter開發桌面應用


一、開發windows桌面應用的一些配置:(注意.cpp文件里哪怕是注釋都不能有中文,否則會報錯,目前沒有找到解決辦法)

1.調整屏幕的大小:

將windows/runner里的main.cpp文件:Win32Window::Size size(1280, 720);改成想要的值即可,如Win32Window::Size size(360, 640);

2.啟動后窗體居中:

這個步驟有點復雜,也是改windows/runner的main.cpp文件,將這兩個代碼

Win32Window::Point origin(10, 10);
Win32Window::Size size(360, 640);

改成:

  UINT windowWidth = 360, windowHeight = 640;
  Win32Window::Size size(windowWidth, windowHeight);
  UINT scrWidth, scrHeight, xShaft, yShaft;
  scrWidth = GetSystemMetrics(SM_CXFULLSCREEN);
  scrHeight = GetSystemMetrics(SM_CYFULLSCREEN);
  xShaft = (scrWidth - windowWidth) / 2;
  yShaft = (scrHeight - windowHeight) / 2;
  // origin is used for set window location
  Win32Window::Point origin(xShaft, yShaft);
 

然后將runner/win32_window.cpp的CreateWindow(..)方法下面添加

SetWindowPos(window, HWND_TOP, origin.x, origin.y, size.width, size.height, SWP_NOSIZE);

3.將窗體改成top窗口【類似截圖pin在屏幕上的那種軟件實現】

在runner/win32_window.cpp里的CreateWindow(..)方法下面添加一行代碼:

SetWindowPos(window, HWND_TOPMOST, origin.x, origin.y, size.width, size.height, SWP_NOSIZE);【注意,和上面的居中的是同一個代碼,只不過HWND_TOP改成HWND_TOPMOST】

4.修改應用的圖標可以修改runner/resources的app_icon.ico文件,注意改了后需要清理編譯的臨時文件【而且圖標是要符合格式的圖標文件】

5.創建一個不可顯示的程序【即后台程序,但是又不是控制台程序】:

將CreateWindow里的 | WS_VISIBLE去掉【就是去掉WS_VISIBLE】,那么這個窗體程序就不顯示了,也就變成了“后台程序”【不過似乎不實用】

6.禁用最大化窗口按鈕【標題欄里的】(win32_window.cpp文件)

注意,在允許最大化窗體按鈕的情況下,雙擊標題欄會最大化窗口,窗口可以拖動更改窗體大小,點擊最大化按鈕會最大化窗體;

但是如果禁用了最大化按鈕,則雙擊標題欄不會最大化,且也不能拖動窗體邊緣來修改窗體大小,禁用最大化按鈕方式為修改CreateWindow的WS_OVERLAPPEDWINDOW,改為:

WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX

7.如果要去掉標題欄,則可以在win32_window.cpp里的SetWindowLongPtr(..)方法下面添加:SetWindowLong(window, GWL_STYLE, WS_OVERLAPPED);

8.dart代碼可以通過io的exit(0);來退出窗體程序;

9.如果不禁用最大化按鈕,但是需要禁用雙擊標題欄最大化窗體,可以修改win32_window.cpp文件里的MessageHandler的switch里添加case是WM_NCLBUTTONDBLCLK: return 0;來實現“吃”掉雙擊標題欄的事件;

10.不禁用最大化按鈕的前提下,不能拖動窗口邊緣來改變窗體大小,可以在win32_window.cpp文件里的MessageHandler的switch里添加case是:

case WM_NCHITTEST:
      LRESULT res = DefWindowProc(hwnd, message, wparam, lparam);
      if (res == HTCAPTION || (res >= HTLEFT && res < HTBORDER)) {
        return HTCLIENT;
      }
      break;

來實現;

【還可以吃掉點擊最大化按鈕的事件,但是沒有意義,還不如直接禁用,消息是WS_SYSCOMMAND然后再通過wparam判斷是不是SC_MAXIMIZE來實現】

11.待做:dart里動態更新標題,托盤功能;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM