2011-12-30 109 views
5

我們最近將Bitfighter從GLUT移植到SDL。這樣做有很多好處,但也有一些缺點,特別是在窗口管理領域。使用SDL處理最大化窗口

Bitfighter運行在固定縱橫比窗口(800x600像素)。用戶可以根據自己的需要設置任意大小的窗口,但我們捕獲大小調整事件並根據請求的大小進行調整,以確保窗口保持正確的比例(使用SDL_SetVideoMode)。

(以下問題適用於Windows,但尚未在其他平臺上進行測試。我在下面說明具體指的是Windows,雖然我在尋找一個獨立於平臺的解決方案。)

通常,這非常好,除非用戶通過雙擊標題欄或使用最大化按鈕來最大化窗口。在這種情況下,調用窗口大小事件的窗口大小近似於屏幕大小(窗口裝飾減去一些像素)。不幸的是,當窗口被最大化時,SDL_SetVideoMode沒有效果(不像GLUT能調整最大化的窗口)。此外,隨後對SDL_GetVideoInfo的調用會報告我們請求的大小,而不是實際當前的窗口大小,因此很難判斷嘗試調整大小是否奏效。

我找了一個獨立於平臺的方式做任何以下的(按優先順序排列):它被最大化

  • 檢測後,當一個窗口已被最大化,所以

    1. 調整窗口大小知道我無法調整它的大小,我至少可以調整視頻中心
    2. 防止最大化窗口(阻止雙擊窗口標題欄,使用最大化按鈕,並拖動窗口到屏幕上方)

    Bitfighter是用C++編寫的,我們正在使用SDL的最新官方版本。

  • +0

    您是否有能力嘗試SDL 1.3 HEAD? – genpfault 2012-01-03 15:39:06

    +0

    我們可能會;取決於它的穩定性。我們希望在幾周內發佈。 – Watusimoto 2012-01-05 10:27:42

    +1

    查看您的代碼,看起來您已經遷移到SDL 2.0。這是否解決了你的問題? – faffy 2012-08-23 18:57:01

    回答

    0

    我假設你使用OpenGL和SDL,因爲你之前使用過GLUT。我不知道該問題的任何解決方案,exept點2.如果要視頻有一個特定的大小,只留下了SDL-窗口就像是,和打電話

    glViewport(0, 0, width, height); 
    

    與合適的尺寸與正確的比例。 使用該解決方案,您的窗口中仍然有一個黑色邊框,但它只顯示儘可能多的,如您所願。 (與第2個參數,你還可以設置視口窗口的位置;))

    1

    遷移到SDL 2.0(這好像你已經有了)

    SDL 2.0提供了一個更好的API來管理窗口(它實際上提供了一個)。雖然SDL 2.0中的Windows管理仍然存在很多錯誤(尤其是在Linux方面),但自1.2天以來它已經大大改善。