首先找到文件:/my_flutter_projrct/windows/runner/win32_windows.cpp 找不到windows文件夾的請去把flutter切換到dev分支,config配置加入windows,重新創建一個flutter項目。
第一個窗口置頂:
在CreateWindows下面加入以下代碼即可
HWND m_hwnd = window; // 將剛創建好的windows復制給m_hwnd變量,以便下面使用 SetWindowPos(m_hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE); // 設置窗體置頂,下面說明其它參數的含義
第一個參數:
為上面剛創建好的HWND對象。
第二個參數:
HWND_BOTTOM:值為1,將窗口置於Z序的底部。如果參數nWnd標識了一個頂層窗口,則窗口失去頂級位置,並且被置在其他窗口的底部。
HWND_NOTOPMOST:值為-2,將窗口置於所有非頂層窗口之上(即在所有項層窗口之后)。如果窗口已經是非頂層窗口則該標志不起作用。
HWND_TOP:值為0,將窗口置於Z序的頂部。
HWND_TOPMOST:值為-1,將窗口置於所有非頂層窗口之上。即使窗口未被激活窗口也將保持頂級位置。
中間的四個參數:大概就是用來設置窗體的位置。
最后一個參數: 是窗口尺寸與定位標志。取值由以下列出:
- SWP_ASYNCWINDoWPOS:如果調用進程不擁有窗口,系統會向擁有窗口的錢線程發出需求。這就防止調用錢線程在其他線程處理需求的時候發生死鎖。
- WP_DEFERERASE:防止產生WM_SYNCPAINT消息。
- SWP_DRAWFRAME:在窗口周圍畫一個邊框〈定義在窗口類描述中)。
- SWP_FRAMECHANGED:給窗口發送WM_NCCALCSIZE消息,即使窗口尺寸沒有改變也會發送該消息。如果未指定這個標志,只有在改變了窗口尺寸時才發送WM_NCCALCSIZE。
- SWP_HIDEWINDOW;隱藏窗口。
- SWP_NOACTIVATE:不激活窗口。如果未設置標志,則窗口被激活,並被設置到其他最高級窗口或非最高級組的頂部(根據參數hWndInsertAfter設置〉。
- SWP_NOCOPYBITS:清除客戶區的所有內容。如果未設置該標志,客戶區的有效內容被保存並且在窗口尺寸更新和重定位后拷貝回客戶區。
- SWP_NOMOvE:維持當前位置(忽略x和Y參數〉。
- SWP_NOOWNERZORDER:不改變z序中的所有者窗口的位置。
- SWP_NOREDRAW:不重畫改變的內容。如果設置了這個標志,則不發生任何重畫動作。適用於客戶區和非客戶區〈包括標題欄和滾動條〉和任何由於窗回移動而露出的父窗口的所有部分。如果設置了這個標志,應用程序必須明確地使窗口無效並區重畫窗口的任何部分和父窗口需要重畫的部分。
- SWP_NOREPOSITION:與SWP_NOOWNERZORDER標志相同。
- SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。
- SWP_NOSIZE:維持當前尺寸〈忽略cx和cy參數〉。
- SWP_NOZORDER:維持當前Z序(忽略hWndInsertAfter參數)。
- SWP_SHOWWINDOW:顯示窗口。
二、窗口屏幕居中顯示:
默認情況下flutter是在左上角(10,10)這個坐標上,也就是距離左側10px和上側10px的地方,相對於左上角;要進行居中顯示的話就需要對獲取屏幕的尺寸及窗口大小進行計算這個中心點的坐標了。
int scrWidth, scrHeight, xShaft, yShaft; // 存儲屏幕和窗體x軸y軸邊距 RECT rect; // 定義一個RECT變量用於下面獲取窗口大小 scrWidth = GetSystemMetrics(SM_CXSCREEN); // 獲取屏幕X軸像素 scrHeight = GetSystemMetrics(SM_CYSCREEN);// 獲取屏幕Y軸像素 //計算窗口x軸及y軸的邊距 即左、上邊距 xShaft = (scrWidth - rect.right) / 2; yShaft = (scrHeight - rect.bottom) / 2; SetWindowPos(m_hwnd, HWND_TOPMOST, xShaft, yShaft, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW);// 窗口居中