SDL獲得螢幕屬性及實現分析

2021-09-07 12:39:21 字數 2039 閱讀 6486

通常情況下,有過圖形介面程式設計經驗的人都知道桌面系統的構成,螢幕解析度是指的整個螢幕區域的寬高,而通常螢幕區域有一些系統的工作列或者選單欄;舉個例子,windows下的工作列一般位於下面,並且通常非全屏視窗是不能占用工作列的。

sdl2中提供了獲得螢幕個數的介面sdl_getnumvideodisplays,具體建議參考sdl2-wiki。

當然螢幕還有其他屬性,比如顯示模式等,可以通過sdl_getnumdisplaymodessdl_getdisplaymode獲得sdl_displaymode的結構,其中包括顯示格式(yuv、rgb等)、寬高、重新整理率等。

sdl_getdisplaybounds可以獲得指定螢幕的顯示區域,可以通過顯示區域獲取螢幕解析度。

sdl_getdisplayusablebounds返回的是實際可用顯示區域的大小,這個通常比螢幕解析度小。

這裡以sdl_getdisplaybounds為例說明,如果讀者對其他函式感興趣,可以檢視sdl2**。

int sdl_getdisplaybounds(int displayindex, sdl_rect * rect)

}/* assume that the displays are left to right */

if (displayindex == 0) else

rect->w = display->current_mode.w;

rect->h = display->current_mode.h;

}return 0; /* !!! fixme: should this be an error if (rect==null) ? */

}

很明顯這個函式直接呼叫了sdl_videodevice->getdisplaybounds函式,那麼我們找乙個實現版本看看,比如windows下的,**如下:

static sdl_videodevice * win_createdevice(int devindex)

這個實現被重定向到win_getdisplaybounds函式中,**如下:

int

win_getdisplaybounds(_this, sdl_videodisplay * display, sdl_rect * rect)

實現比較簡單,直接從display->current_mode中獲得資料。那麼這個mode在**賦值的呢?

在sdl_windowsvideo.c中查詢下,發下如下呼叫:

static sdl_bool win_adddisplay(_this, lptstr devicename)

displaydata = (sdl_displaydata *) sdl_malloc(sizeof(*displaydata));

if (!displaydata)

sdl_memcpy(displaydata->devicename, devicename,

sizeof(displaydata->devicename));

sdl_zero(display);

device.cb = sizeof(device);

if (enumdisplaydevices(devicename, 0, &device, 0))

display.desktop_mode = mode;

display.current_mode = mode;

display.driverdata = displaydata;

sdl_addvideodisplay(&display);

sdl_free(display.name);

return sdl_true;

}

明顯這是從enumdisplaydevices中獲取。

至此所有實現邏輯基本理清。

獲得螢幕屬性

計算座標就需要乙個參考值,最好的參考值就是螢幕的寬度和高度。安卓中的displaymetrics定義了螢幕的一些屬性,可以通過getmetrics方法得到當前螢幕的displaymetrics屬性,從而取得螢幕的寬和高。順帶一提的就是,加速感應器可以讓應用程式自動適應螢幕的模式,比如橫放時自動變成橫...

HTML innerHTML屬性用法及分析

innerhtml 設定或返回 行的開始和結束標籤之間的 html。看它的英文單詞也可以明白就是裡面的字元按html標記的語言格式取出來或重新設定。innerhtml屬性w3c標準不支援的,但是各大瀏覽器支援它的實現。innerhtml的用法 舉例 下面是js var div1 document.g...

元素的屬性及分析

1.輪播圖 案例2.定時器this問題 var t setinterval function 1000 這裡面的this是window person.prototype n 200,t setinterval this.fn,2000 var ss new person zhang 不管定時器裡函式...