所以我想爲我的遊戲寫一個切換全屏功能。禁用窗口消息(沒有WNDPROC調用)
它工作..有點問題是第一個SetWindowLongPtr()調用導致WM_SIZE消息排隊併發送到我的WNDPROC(在MSDN我讀取窗口樣式的更改只緩存,必須使用SetWindowPos ()雖然)。
SetWindowLongPtr(m_hWnd, GWL_STYLE, dwStyle);
SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, dwExStyle);
SetWindowPos(m_hWnd, NULL, fullscreen ? 0 : window.left, fullscreen ? 0 : window.top, window.right, window.bottom, SWP_NOZORDER | SWP_FRAMECHANGED);
ShowWindow(m_hWnd, SW_SHOW);
當從窗到全屏模式下的客戶區被調整到窗口矩形和更新這樣的改變(所以現在「包含」酒吧等)。 除了導致我的程序兩次銷燬Vulkan上下文之外,這使得我保存錯誤的窗口維度以便稍後恢復爲窗口模式(這是在WM_SIZE發生時以及遊戲處於全屏模式時完成的)。
之後,它通過SetWindowPos()調整到正確的尺寸。
我的意思是,我當然可以在布爾中破解WM_SIZE消息,但它應該是,但我正在尋找一個更好,也許不太順便的方式。 是否有暫時禁用窗口消息或僅用戶def WNDPROC的功能?
不必禁用Windows消息,但正確處理它 – RbMm
我只是做到這一點,它的工作原理: SetWindowLongPtr(m_hWnd,GWLP_WNDPROC,(LONG_PTR)DefWindowProc函數); SetWindowLongPtr(m_hWnd,GWL_STYLE,dwStyle); SetWindowLongPtr(m_hWnd,GWL_EXSTYLE,dwExStyle); SetWindowLongPtr(m_hWnd,GWLP_WNDPROC,(LONG_PTR)StdWndProc); – AxMedia
這當然不應該成爲問題。水晶球說,你只是忘了*還*存儲窗口狀態。這是必需的,因爲它告訴你如何在開始備份時重新創建窗口,假設你想以全屏模式重新開始。 –