Loading AI tools
包含某種用戶界面的可視區域 来自维基百科,自由的百科全书
視窗是在用戶介面上的一個可見的範圍。視窗一般都是長方形的。它包含着各種控制項,是用作輸入和輸出的介面。雖然視窗一般用於圖形用戶介面,但又有時用於命令列介面的。而一個使用視窗為主要用戶介面的系統則稱為視窗系統。這個想法源於施樂帕洛阿爾托研究中心。
在視窗系統上,視窗一般被畫成一些二維的物件,被安置在桌面之上。大多數的視窗都可以隨用戶的意願而更改大小、移動、隱藏、回復和關閉。當兩個視窗重疊的時候,就如日常生活中一樣,其中一個要位於另一個之上,而下方的則會有些地方被上方個視窗所遮蓋。而視窗系統中管理這個操作的部份,則叫做視窗管理員。
視窗是數種圖形用戶介面中的一種重要的widget。當中有VMS的DEC Windows、GNU/Unix-like系統的X Window系統、Microsoft Windows和Open Windows。
這個概念是由斯坦福大學研究所(由 道格拉斯·恩格爾巴特 領導)開發實現的。[1] 他們最早的系統支援多窗口,但沒明顯的方法顯示它們的分界線(比如窗口邊框、標題列等)。[2]
研究在 Xerox 公司的 Palo Alto 研究中心 / PARC (由 艾倫·凱領導)中繼續。他們使用了重疊的窗口。[3]
在1980年代,PARC 提出術語"WIMP",分別代表了窗口、圖示、選單、指標。
那時Apple與PARC進行了簡單的合作。Apple 根據 PARC 的介面開發了自己的新介面。它首次應用是在 Apple的 Lisa上,此後用於 Macintosh 電腦。與此同時,Microsoft在為"Mac"開發辦公軟件。之後他們在 Apple 系統的基礎上開發了自己的窗口系統。[2]
窗口子類化是對一個窗口實例通過GetWindowLong和SetWindowLong將窗口過程地址修改為一個新函數地址,新的窗口過程函數處理那些感興趣的訊息,將其它訊息傳遞給原窗口過程。即實例子類化。在某控制項已經建立的情況下,為了獲得窗口訊息,必須子類化它。子類化不需要建立一個完整的新窗口類,只需要攔截單個窗口。
窗口超類化是一個已存在的窗口類(WNDCLASS或WNDCLASSEX),改變窗口類的特徵。僅影響窗口類新建立的窗口實例,不會影響窗口過程地址修改前已經建立的窗口。超類化只能改變用戶自創的窗口的特性,不能用於系統建立的窗口(如對話方塊上的標準按鈕)。超類話過程範例如下:
WNDCLASSEX wc;
wc.cbsize=sizeof(wc);
GetClassInfoEx(hinst,"XXXX",&wc); //hinst---定义窗口类XXXX的模块的句柄,如为系统定义的窗口类(如: Edit,Button)则hinst=NULL
wc.lpszClassName="YYYY";//必须改变窗口类的名字
wc.hbrBackground=CreateSolidBrush(RGB(0,0,0));
wc.lpfnWndProc=NewWndProc;//改变窗口过程
RegisterClassEx(&wc);
MFC的CWindowImplBaseT::SubclassWindow用於動態地把一個窗口實例繫結到當前的CWnd對象,訊息迴圈首先呼叫CWnd對象的窗口過程,傳遞給基礎類別的訊息將被預設的窗口過程處理。CWnd::SubclassDlgItem用於把對話方塊的一個控制項子類化繫結到一個基於CWnd的類對象。CWindowImplBaseT::UnsubclassWindow恢復一個被子類化的窗口。
模板類CWindowImplBaseT提供一個數據成員WNDPROC m_pfnSuperWindowProc並且初始化為 ::DefWindowProc.然而在窗口超類化處理時它儲存了已註冊窗口類的窗口過程,在窗口子類化時它儲存窗口實例控制代碼原有的窗口過程。
CWnd::CreateEx在建立窗口前呼叫SetWindowsHookEx函數安裝了一個勾點函數_AfxCbtFilterHook。窗口剛建立好,勾點函數_AfxCbtFilterHook就被呼叫。_AfxCbtFilterHook呼叫SetWindowLong將窗口過程替換為AfxWndProcBase,並將SetWindowLong返回的原窗口地址儲存到成員變數oldWndProc。可見,通過CWnd::CreateEx建立的所有窗口都會被子類化。在DefWindowProc函數中,訊息會傳給子類化時儲存的原窗口地址oldWndProc。
ATL提供DECLARE_WND_SUPERCLASS來支援超類化。
使用Windows API函數CreateWindowEx,可以指定建立的窗口的類型:
GetParent函數,對於子窗口返回其父窗口控制代碼;對於彈出式視窗,返回擁有者窗口控制代碼;對於層疊窗口,返回0.
GetWindow函數,指出GW_OWNER參數,則可以返回彈出式視窗或層疊窗口的擁有者窗口控制代碼。
FindWindowEx函數,用於找到指定父窗口、指定子窗口的下一個子窗口。
WNDCLASS中cbClsExtra和cbWndExtra,分別用於指定附加於窗口類與窗口實例的額外儲存空間位元組大小,不能超過40位元組。分別類似於C++類別中的static變數與類似於C++類別中的成員變數。
GetClassLong(hwnd,GCL_CBCLSEXTRA)取得的是類附加空間的大小,即cbClsExtra的值。GetClassLong(hwnd,GCL_CBWNDEXTRA)取得的是窗口附加空間的大小,即cbWndExtra的值。
使用方法:
其它相關Windows API有:GetWindowWord、GetWindowLongPtr、SetWindowWord、SetWindowLongPtr。
常見的窗口系統:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.