Windows常見視窗樣式和控制元件風格
王佰營 徐麗紅
一、視窗樣式
WS_POPUP 彈出式視窗(不能與WS_CHILDWINDOW樣式同時使用)
WS_CHILDWINDOW 子視窗(不能與WS_POPUP合用)
WS_MINIMIZE 建立視窗擁有最小化按鈕
WS_MINIMIZEBOX 建立視窗擁有最小化按鈕,須同時指定WS_SYSTEM樣式
WS_VISIBLE 可見狀態
WS_DISABLED 不可用狀態
WS_CLIPSIBLINGS 使視窗排除子視窗之間的相對區域
WS_CLIPCHILDREN 當在父視窗內繪圖時,排除子視窗區域
WS_MAXIMIZE 具有最大化按鈕
WS_MAXIMIZEBOX 建立視窗擁有最大化按鈕,須同時指定WS_SYSTEM樣式
WS_CAPTION 有標題框和邊框(和WS_TILED樣式相同)
WS_BORDER 有單邊框
WS_DLGFRAME 帶對話方塊邊框樣式,不帶標題框
WS_VSCROLL 有垂直滾動條
WS_HSCROLL 有水平滾動條
WS_SYSMENU 標題框上帶有視窗選單(須指定WS_CAPTION樣式)
WS_THICKFRAME 有可調邊框(與WS_SIZEBOX樣式相同)
WS_TILED 與WS_OVERLAPPED風格相同
WS_TILEDWINDOW 與WWS_OVERLAPPEDWINDOW風格相同
WS_GROUP 組樣式,每個組的第一個控制元件具有WS_TABSTOP樣式
WS_TABSTOP 可接受TAB鍵
WS_OVERLAPPED 建立一個重疊式視窗,擁有標題欄和邊框
WS_OVERLAPPEDWINDOW 即:WS_OVERLAPPED風格,WS_CAPTION風格,WS_SYSMENU風格
WS_THICKFRAME風格,WS_MINIMIZEBOX風格和WS_MAXIMIZEBOX
風格的組合
/* 視窗擴充套件樣式參考列表:
WS_EX_DLGMODALFRAME - 帶雙層邊框
WS_EX_NOPARENTNOTIFY - 建立/銷燬時不通知父視窗
WS_EX_TOPMOST - 視窗置頂(停留在所有非最高層視窗的上面)
WS_EX_ACCEPTFILES - 可接受檔案拖放
WS_EX_TRANSPARENT - =&H20 透明樣式,在同屬視窗已重畫時該視窗才可重畫
WS_EX_MDICHILD - MDI子視窗樣式
WS_EX_TOOLWINDOW - 工具條視窗樣式
WS_EX_WINDOWEDGE - 帶凸起邊緣的邊框
WS_EX_CLIENTEDGE - 帶陰影的邊緣
WS_EX_CONTEXTHELP - 有上下文幫助樣式,標題欄包含一個問號標誌
WS_EX_RIGHT - 右對齊
WS_EX_RTLREADING - 視窗文字從右到左顯示
WS_EX_LEFTSCROLLBAR - 垂直滾動條在視窗左邊界
WS_EX_CONTROLPARENT - 允許使用者使用TAB鍵在視窗的子視窗間搜尋
WS_EX_STATICEDGE - 當視窗為不可用狀態時建立一個三維邊緣
WS_EX_APPWINDOW - 當視窗可見時將一個頂層視窗放置在工作列上
WS_EX_OVERLAPPEDWINDOW - 帶凸起邊緣的邊框,邊緣有陰影
WS_EX_PALETTEWINDOW - 帶立體邊框,有工具條視窗樣式,視窗在頂層
WS_EX_LAYERED =&H80000 分層或透明視窗,該樣式可使用混合特效
WS_EX_NOINHERITLAYOUT - 子控制元件不繼承窗體或控制元件的佈局
WS_EX_LAYOUTRTL - 窗體或控制元件將具有從右向左的佈局(因而會被映象)
WS_EX_COMPOSITED - 用雙緩衝從下到上繪製視窗的所有子孫(WinXP以上)
WS_EX_NOACTIVATE - 處於頂層但不啟用
二、按鈕風格
BS_AUTOCHECKBOX 同核取按鈕類似,點選一下選中,再次點選取消。
BS_AUTORADIOBUTTON同單選按鈕類似,點選後選中標誌將從同組的其他單選按鈕處移到當前選項。
BS_CHECKBOX 核取按鈕
BS_DEFPUSHBUTTON 預設普通按鈕,具有較黑的邊框。
BS_GROUPBOX 分組框
BS_LEFTTEXT 同單選按鈕或核取按鈕配合使用,標題將顯示在左側。
BS_OWNERDRAW 可建立一個擁有者自繪按鈕。
BS_PUSHBUTTON 普通下壓按鈕
BS_RADIOBUTTON 圓形單選按鈕
BS_3STATE 三態核取按鈕,三種狀態即:選中,未選中,未定
BS_AUTOCHECKBOX 檢查框,按鈕的狀態會自動改變
BS_AUTORADIOBUTTON圓形選擇按鈕,按鈕的狀態會自動改變
BS_AUTO3STATE 允許按鈕有三種狀態即:選中,未選中,未定
BS_CHECKBOX 檢查框
BS_LEFTTEXT 左對齊文字
三、旋轉按鈕控制元件
UDS_HORZ 指定一個水平旋轉按鈕.若不指定該風格則建立一個垂直的旋轉按鈕.
UDS_WRAP 當旋轉按鈕增大到超過最大值時,自動重置為最小值,當減小至低於最小值時,自動重置為最大值.
UDS_ARROWKEYS 當使用者按下向下或向上箭頭鍵時,旋轉按鈕值遞增或遞減.
UDS_SETBUDDYINT 旋轉按鈕將自動更新夥伴控制元件中顯示的數值,如果夥伴控制元件能接受輸入,則可在夥伴控制元件中輸入新的旋轉按鈕值.
UDS_NOTHOUSANDS 夥伴控制元件中顯示的數值每隔三位沒有千位分隔符.
UDS_AUTOBUDDY 自動使旋轉按鈕擁有一個夥伴控制元件.
UDS_ALIGNRIGHT 旋轉按鈕在夥伴控制元件的右側.
UDS_ALIGNLEFT 旋轉按鈕在夥伴控制元件的左側.
四、軌道條控制元件
TBS_HORZ 指定一個水平軌道條.該風格是預設的.
TBS_VERT 指定一個垂直軌道條.
TBS_AUTOTICKS 在範圍設定後,自動為軌道條加上刻度.
TBS_NOTICKS 軌道條無刻度.
TBS_BOTTOM 在水平軌道條的底部顯示刻度,可與TBS_TOP一起使用.
TBS_TOP 在水平軌道條的頂部顯示刻度,可與TBS_BOTTOM一起使用.
TBS_RIGHT 在垂直軌道條的右側顯示刻度,可與TBS_LEFT一起使用.
TBS_LEFT 在垂直軌道條的左側顯示刻度,可與TBS_RIGHT一起使用.
TBS_BOTH 在軌道條的上下部或左右兩側都顯示刻度.
TBS_ENABLESELRANGE 在軌道條中顯示一個選擇範圍.
五、文字編輯框風格
ES_AUTOHSCROLL 當在行尾新增一個字元後自動向右滾動10個字元。
ES_AUTOVSCROLL 當輸入回車後自動上滾一行。
ES_CENTER 字元居中顯示。
ES_LEFT 字元左對齊。
ES_LOWERCASE 統一轉化為小寫字母。
ES_MULTILINE 允許多行顯示。
ES_NOHIDESEL 當編輯失去焦點時隱藏對字元的選定,重新獲得焦點後以反色顯示選中內容。
ES_OEMCONVERT 將ANSI字元轉化為OEM字元。
ES_PASSWORD 以星號顯示字元,多用於回顯密碼。
ES_RIGHT 字元右對齊
ES_UPPERCASE 統一轉化為大寫字母。
ES_READONLY 設定字元為只讀。
ES_WANTRETURN 接受Enter鍵輸入。
六、列表框風格
LBS_STANDARD 建立一個具有邊界和垂直滾動條、當選擇發生變化或條目被雙擊時能夠通知父視窗的標準列表框。所有條目按字母排序。
LBS_SORT 按字母排序。
LBS_NOSEL 條目可視但不可選。
LBS_NOTIFY 當使用者選擇或雙擊一個串時,發出訊息通知父視窗。
LBS_DISABLENOSCROLL 在條目不多時依然顯示並不起作用的滾動條。
LBS_MULTIPLESEL 允許條目多選。
LBS_EXTENDEDSEL 可用SHIFT和滑鼠或指定鍵組合來選擇多個條目。
LBS_MULTICOLUMN 允許多列顯示。
LBS_OWNERDRAWVARIABLE 建立一個擁有者畫列表框,條目高度可以不同。
LBS_OWNERDRAWFIXED 建立一個具有相同條目高度的擁有者畫列表框。
LBS_USETABSTOPS 允許使用TAB製表符。
LBS_NOREDRAW 當條目被增刪後不自動更新列表顯示。
LBS_HASSTRINGS 記憶了新增到列表中的字串。
LBS_WANTKEYBOARDINPUT 當有鍵按下時向父視窗傳送WM_VKEYTOITEM或WM_CHARTOITEM訊息。
LBS_NOINTEGRALHEIGHT 按程式設定尺寸建立列表框。
七、組合框風格
CBS_AUTOHSCROLL 當在行尾輸入字元時自動將編輯框中的文字向右滾動。
CBS_DROPDOWN 同CBS_SIMPLE風格類似,只是只有在使用者點選下拉圖示時才會顯示出下拉選單。
CBS_DROPDOWNLIST 同CBS_DROPDOWN類似,只是顯示當前選項的編輯框為一靜態框所代替。
CBS_HASSTRINGS 建立一個包含了由字串組成的專案的擁有者畫組合框。
CBS_OEMCONVERT 將組合框中的ANSI字串轉化為OEM字元。
CBS_OWNERDRAWFIXED 由下拉選單框的擁有者負責對內容的繪製;列表框中各專案高度相同。
CBS_OWNERDRAWVARIABLE 由下拉選單框的擁有者負責對內容的繪製;列表框中各專案高度可以不同。
CBS_SIMPLE 下拉選單始終顯示。
CBS_SORT 自動對下拉選單中的專案進行排序。
CBS_DISABLENOSCROLL 當下拉選單顯示內容過少時顯示垂直滾動條。
CBS_NOINTEGRALHEIGHT在建立控制元件時以指定的大小來精確設定組合框尺寸。
八、樹形檢視控制元件
TVS_HASLINES 在父項與子項間連線以清楚地顯示結構.
TVS_LINESATROOT 只在根部畫線.
TVS_HASBUTTONS 顯示帶有"+"或"-"的小方框來表示某項能否被展開或已展開.
TVS_EDITLABELS 使用者可以編輯表項的標題.
TVS_SHOWSELALWAYS 即使控制元件失去輸入焦點,仍顯示出項的選擇狀態.
TVS_DISABLEDRAGDROP 不支援拖動操作.
九、列表檢視控制元件
LVS_ALIGNLEFT 當顯示格式是大圖示或小圖示時,標題放在圖示的左邊.預設情況下標題放在圖示的下面.
LVS_ALIGNTOP 當顯示格式是大圖示或小圖示時,標題放在圖示的上邊.
LVS_AUTOARRANGE 當顯示格式是大圖示或小圖示時,自動排列控制元件中的表項.
LVS_EDITLABELS 使用者可以修改標題.
LVS_ICON 指定大圖示顯示格式.
LVS_LIST 指定列表顯示格式.
LVS_NOCOLUMNHEADER 在報告格式中不顯示列的表頭.
LVS_NOLABELWRAP 當顯示格式是大圖示時,使標題單行顯示.預設時是多行顯示.
LVS_NOSCROLL 列表檢視無滾動條.
LVS_NOSORTHEADER 報告列表檢視的表頭不能作為排序按鈕使用.
LVS_OWNERDRAWFIXED 由控制元件的擁有者負責繪製表項.
LVS_REPORT 指定報告 顯示格式.
LVS_SHAREIMAGELISTS 使列表檢視共享影象序列.
LVS_SHOWSELALWAYS 即使控制元件失去輸入焦點,仍顯示出項的選擇狀態.
LVS_SINGLESEL 指定一個單選擇列表檢視.預設時可以多項選擇.
LVS_SMALLICON 指定小圖示顯示格式.
LVS_SORTASCENDING 按升序排列表項.
LVS_SORTDESCENDING 按降序排列表項.
十、靜態文字框風格
SS_CENTER 字元居中顯示。
SS_LEFT 字元左對齊。
SS_LEFTNOWORADWRAP 字元左對齊,可處理TAB製表符,不支援自動換行,超過末尾字元被裁剪。
SS_BLACKRECT 用視窗邊框色填充的矩形。
SS_BLSCKFRAME 矩形邊框,與視窗邊框同色。
SS_GRAYRECT 用螢幕背景色填充的矩行。
SS_GRAYFRAME 矩形邊框,使用螢幕背景色。
SS_WHITERECT 用視窗背景色填充的矩行。
SS_RIGHT 字元右對齊
SS_WHITEFRAME 矩形邊框,使用視窗背景色。
/* 控制元件樣式參考列表:
DS_ABSALIGN - 對話方塊的座標為螢幕座標(預設為客戶區座標)
DS_SYSMODAL - 系統模式(僅支援16位程式),不能與DS_CONTROL同用
DS_LOCALEDIT - 在對話方塊內部為編輯框分配記憶體(僅支援16位程式)
DS_SETFONT - 可定製對話方塊字型
DS_MODALFRAME - 框架樣式(不能與WS_CAPTION同用)
DS_NOIDLEMSG - 無空閒訊息
DS_SETFOREGROUND - 使對話方塊在最前面顯示
DS_3DLOOK - 四周有3維邊框
DS_FIXEDSYS - 使用系統固定字型
DS_NOFAILCREATE - 忽略建立過程中的錯誤
DS_CONTROL - 控制元件模式,可作為其他對話方塊的子視窗
DS_CENTER - 在螢幕居中
DS_CENTERMOUSE - 在滑鼠位置居中
DS_CONTEXTHELP - 有上下文幫助按鈕
近日來工作中需要類似於QQ聊天視窗那樣,視窗最小化縮到工作列,點工作列上的按鈕可以復原視窗,由於視窗是子視窗,所以我們過載了視窗的CreateParams方法如下:
procedure TsubForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do begin
ExStyle := ExStyle or WS_EX_APPWINDOW;
WndParent := GetDesktopWindow();
end;
end;
這樣視窗就可以在工作列上顯示了。
但是又碰到一個問題,就是由於視窗樣式被我設定成了bs_None,為無邊框視窗,所以我點工作列上的視窗按鈕的時候,視窗無法復原和收縮回工作列。
後來仔細看了一下視窗樣式,想想,我們的目的無非是能夠響應普通視窗一樣的訊息,於是,我將視窗設定成bs_Sizeable,然後就能夠實現QQ聊天視窗的那 個效果,於是,俺就想在bs_Sizeable的樣式下減去視窗的邊框樣式,這樣來測試,於是俺先減去了一個WS_Caption標題樣式,此時視窗可以實現QQ聊天視窗的那種樣式了,但是多了一個邊框,又仔細檢視了一下Windows的視窗樣式,發現一個樣式WS_THICKFRAME,該樣式是用來拖動視窗大小的時候的一個視窗邊框,於是俺在多減去該樣式
最後效果實現在視窗的Create事件中加上一個樣式設定的就可
SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE) and (not WS_CAPTION) and (not WS_THICKFRAME));
參考:http://blog.csdn.net/suiyunonghen/article/details/3835813