// 窗口樣式 , 窗口樣式含義請執行參閱官方文檔 , 樣式只要不離譜 , 自己隨便寫 , 影響不大WINDOW_STYLE style = WS_CAPTION |WS_SYSMENU |WS_MINIMIZEBOX |WS_CLIPSIBLINGS |WS_BORDER |WS_DLGFRAME |WS_THICKFRAME |WS_GROUP |WS_TABSTOP |WS_SIZEBOX;根據上面設置的窗口尺寸 , 嘗試根據樣式算出實際可用的尺寸
var rect = new RECT{right = clientSize.Width,bottom = clientSize.Height};// Adjust according to window stylesAdjustWindowRectEx(&rect, style, false, WS_EX_APPWINDOW);接著算出窗口顯示的坐標和尺寸 , 這個邏輯非核心邏輯 , 也可以自己隨意寫一個坐標 。本文將嘗試讓窗口顯示在屏幕中間
int x = 0;int y = 0;int windowWidth = rect.right - rect.left;int windowHeight = rect.bottom - rect.top;// 隨便 , 放在屏幕中間好了 。多個顯示器?忽略int screenWidth = GetSystemMetrics(SM_CXSCREEN);int screenHeight = GetSystemMetrics(SM_CYSCREEN);x = (screenWidth - windowWidth) / 2;y = (screenHeight - windowHeight) / 2;準備完成 , 開始創建窗口
var hInstance = GetModuleHandle((string)null);fixed (char* lpszClassName = windowClassName){PCWSTR szCursorName = new((char*)IDC_ARROW);var wndClassEx = new WNDCLASSEXW{cbSize = (uint)Unsafe.SizeOf<WNDCLASSEXW>(),style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC,// 核心邏輯 , 設置消息循環lpfnWndProc = new WNDPROC(WndProc),hInstance = (HINSTANCE)hInstance.DangerousGetHandle(),hCursor = LoadCursor((HINSTANCE)IntPtr.Zero, szCursorName),hbrBackground = (Windows.Win32.Graphics.Gdi.HBRUSH)IntPtr.Zero,hIcon = (HICON)IntPtr.Zero,lpszClassName = lpszClassName};ushort atom = RegisterClassEx(wndClassEx);if (atom == 0){throw new InvalidOperationException($"Failed to register window class. Error: {Marshal.GetLastWin32Error()}");}}// 創建窗口var hWnd = CreateWindowEx(WS_EX_APPWINDOW,windowClassName,title,style,x,y,windowWidth,windowHeight,hWndParent: default,hMenu: default,hInstance: default,lpParam: null);獲取到的 hWnd 將會在接下來被 DX 掛上
但愿大家知道 hWnd 是啥意思
既然創建出了窗口了 , 那就顯示出來吧
// 創建完成 , 那就顯示ShowWindow(hWnd, SW_NORMAL);獲取實際的窗口大小 , 這將用來決定后續交換鏈的創建 。什么是交換鏈?自己去了解
RECT windowRect;GetClientRect(hWnd, &windowRect);clientSize = new SizeI(windowRect.right - windowRect.left, windowRect.bottom - windowRect.top);以上代碼就完成了創建 Win32 窗口
獲取顯示適配器接口這一步是可選的 , 通過枚舉 DX 提供的抽象的顯示適配器接口 , 可以用來后續創建 D3D 設備 。本文這里是給大家演示如何獲取抽象的顯示適配器接口的方法 , 沒有指定顯示適配器接口也是可以創建 D3D 設備
顯示適配器接口 IDXGIAdapter 是對硬件或軟件的一個抽象 , 可以是一個顯卡 , 也可以是一個軟件渲染器 。這里獲取到的抽象的顯示適配器接口 , 在大部分情況下都是和具體的顯卡相關的 , 但是不代表著一定就是真實的顯卡
下圖是從官方文檔拷貝的 , 一個電腦加兩個顯卡的對象關系

文章插圖
先嘗試使用 IDXGIFactory6 提供的 EnumAdapterByGpuPreference 方法枚舉顯卡 , 這個方法的功能是可以按照給定的參數進行排序 , 特別方便開發時 , 獲取首個可用顯卡
想要使用 EnumAdapterByGpuPreference 方法 , 需要先獲取 IDXGIFactory6 對象 。而 IDXGIFactory6 對象可以通過工廠創建 IDXGIFactory2 對象間接獲取
經驗總結擴展閱讀
- 為什么阿里Java開發手冊不推薦使用Timestamp
- VMware安裝Win11+WSA子系統和使用教程
- 拱辰享適合什么膚質的人使用?
- 護衣留香珠的使用方法?
- 悅薇水乳適合多大年紀的人使用?
- 怡麗絲爾護膚品適合多大年齡的人使用?
- 御泥坊眼膜貼適合什么年齡段的人使用?
- 御泥坊五件套使用步驟是什么?
- 御泥坊小金瓶適合什么人群使用?
- 御泥坊小金瓶適合什么年齡使用?
