通常情況下,有過圖形介面程式設計經驗的人都知道桌面系統的構成,螢幕解析度是指的整個螢幕區域的寬高,而通常螢幕區域有一些系統的工作列或者選單欄;舉個例子,windows下的工作列一般位於下面,並且通常非全屏視窗是不能占用工作列的。
sdl2中提供了獲得螢幕個數的介面sdl_getnumvideodisplays
,具體建議參考sdl2-wiki。
當然螢幕還有其他屬性,比如顯示模式等,可以通過sdl_getnumdisplaymodes
和sdl_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 不管定時器裡函式...