企業(yè)網(wǎng)站建設(shè)中期報(bào)告模板微商軟文推廣平臺(tái)
對(duì)于 Windows 上的所有圖標(biāo)而言,它的寬度總是8的倍數(shù),這可不是因?yàn)槿藗兿矚g2的冪,雖然在計(jì)算機(jī)世界,你會(huì)看到很多這樣的數(shù)字,例如,1024,4096等。
在 Windows 的早期階段,大多數(shù)顯卡是單色的,如果幸運(yùn)的話,可能會(huì)有一張16色的顯卡。它們運(yùn)作在平面視頻模式(planar video mode)。現(xiàn)在我們想象一下,將一張位圖拷貝到屏幕上,這張位圖和屏幕都是平面化的。
如果目標(biāo)矩形的起始坐標(biāo)剛好8的倍數(shù),則位圖可以通過塊拷貝指令進(jìn)行復(fù)制。換句話說,如果目標(biāo)矩形的坐標(biāo)不是8的倍數(shù),則你需要做很多復(fù)雜的工作來對(duì)位圖進(jìn)行移動(dòng),從而顯示到屏幕上。
這就是窗口風(fēng)格 CS_BYTEALIGNCLIENT 被創(chuàng)建出來的原因。當(dāng)把這個(gè)風(fēng)格設(shè)置到窗口上時(shí),窗口管理器將嘗試定位窗口,以便客戶端矩形左上角的 X 坐標(biāo)位于視頻內(nèi)存的完美字節(jié)邊界。
如果你以 1bpp 視頻模式(單色或 16 色)運(yùn)行,這意味著 x 坐標(biāo)是 8 的倍數(shù)。通過以這種方式定位窗口,復(fù)制到客戶端矩形左上角的位圖將通過快速塊傳輸指令進(jìn)行復(fù)制。
如果你查看 Windows 95 或更早版本的對(duì)話框尺寸,你會(huì)發(fā)現(xiàn)它們的寬度幾乎總是 32 個(gè) DLU 的倍數(shù)。由于四個(gè)水平 DLU 等于一個(gè)平均字符寬度,因此你必須將對(duì)話框?qū)挾缺3譃?32 的倍數(shù),以確保最終對(duì)話框大小是 8 的倍數(shù)。
保持位圖寬度以表示確切的字節(jié)邊界對(duì)于當(dāng)今機(jī)器的性能非常重要。復(fù)制周圍的像素塊通常分三個(gè)主要步驟執(zhí)行:從位圖左邊緣到第一個(gè)字節(jié)邊界的細(xì)垂直條帶,然后是位圖的大部分到最后一個(gè)字節(jié)邊界,最后是從最后一個(gè)字節(jié)邊界到右邊緣的細(xì)垂直條帶。如果你睜大眼睛,你實(shí)際上可以看到這三個(gè)階段的繪畫正在發(fā)生。(就像我說的,當(dāng)時(shí)的機(jī)器并沒有那么快。)保持字節(jié)對(duì)齊和字節(jié)寬度意味著兩個(gè)細(xì)的垂直條帶的寬度為零,因此可以優(yōu)化出來。
當(dāng)然,在當(dāng)今 32bpp 顯示器的世界中,所有這些舊的設(shè)計(jì)考慮在很大程度上都是無關(guān)緊要的。
總結(jié)
最近我確實(shí)在做一些和位圖有關(guān)的研究,相比上古時(shí)代的單色或16色位圖,32bpp(32位的位圖)在處理起來,確實(shí)十分方便和直觀。你可以在腦海你直接呈現(xiàn)位圖,不需要考慮顏色板,壓縮格式等這些勞什子。
對(duì)于數(shù)學(xué)一竅不通的我來說,屬實(shí)是救星一枚。
最后
Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,里面有很多關(guān)于Windows的小知識(shí),對(duì)于廣大Windows平臺(tái)開發(fā)者來說,確實(shí)十分有幫助。
本文來自:《Why are icons multiples of 8 pixels in width?》
?