子視窗控制項 -windows程式設計(網易小海星的部落格)

來源:互聯網
上載者:User

取父視窗的視窗控制代碼:
hwndParent = GetParent (hwnd) ;

發送訊息:
SendMessage (hwndParent, message, wParam, lParam) ;

預定義的控制項有:
按鈕、複選框、編輯方塊、清單方塊、下拉式清單方塊、靜態字串標籤和捲軸。

當使用預定義的控制項時,不必為其註冊視窗類別,視窗類別已經存在於Windows中,並有一個預先定義的名字。
您只需在CreateWindow()的參數中指出視窗類別名字。CreateWindow()的視窗樣式參數準確地定義了子視窗
控制項的外形和功能。Windows內建了這些控制項的視窗訊息處理常式。

========================================
按鈕控制項

建立子視窗時指定視窗類別為"button".

顯示視窗的CreateWindow參數如下:
Class name(類別名稱)  TEXT ("button")
Window text(視窗文字)  一個c字串szText
Window style(視窗樣式)  WS_CHILD | WS_VISIBLE | 按鈕樣式(下邊有說明)
x position(x位置)
y position(y位置)
Width(寬度)
Height(高度)
Parent window(父視窗)
Child window ID(子視窗ID) 要轉換為HMENU類型.如(HMENU) i  
Instance handle(執行實體控制代碼) 執行執行個體控制代碼
Extra parameters(附加參數)   NULL

其中的按鈕樣式為:
BS_PUSHBUTTON
BS_DEFPUSHBUTTON
BS_CHECKBOX   (帶有複選框.複選框的狀態要手動發送BM_SETCHECK訊息設定)
BS_AUTOCHECKBOX  (帶有複選框.複選框的狀態自動化佈建)
BS_RADIOBUTTON  (帶選項按鈕.其狀態要手動發送BM_SETCHECK訊息設定)
BS_3STATE
BS_AUTO3STATE
BS_GROUPBOX  (分組方塊. 它只是一個標題框. 不處理輸入.)
BS_AUTORADIOBUTTON
BS_OWNERDRAW

按鈕會向父視窗發送WM_COMMAND訊息.參數:
LOWORD(wParam)  為子視窗ID.
HIWORD(wParam)   為通知碼.
lParam   為子視窗控制代碼.

通知碼HIWORD(wParam)有:
BN_CLICKED
BN_PAINT
BN_HILITE or BN_PUSHED
BN_UNHILITE or BN_UNPUSHED
BN_DISABLE
BN_DOUBLECLICKED or BN_DBLCLK
BN_SETFOCUS
BN_KILLFOCUS

父視窗也可以向按鈕發送訊息.
BM_GETCHECK (複選框的選定標記)
BM_SETCHECK
BM_GETSTATE ("正常狀態" 還是"按下狀態" )
BM_SETSTATE
BM_SETSTYLE (改變按鈕樣式)
BM_CLICK
BM_GETIMAGE
BM_SETIMAGE

要得到控制項ID用
GetDlgCtrlId(hwndChild);
要得到控制項的子視窗控制代碼用
GetDlgItem(hwndParent, id);
 

改變按鈕的文字用
SetWindowText (hwnd, pszString) ;
取按鈕的當前文字用
iLength = GetWindowText (hwnd, pszBuffer, iMaxLength) ;

======================================
顯示/隱藏子視窗

如果子視窗的視窗類別的樣式中沒有WS_VISIBLE. 則在沒有呼叫ShowWindow之前不會顯示視窗.
顯示子視窗用:
ShowWindow (hwndChild, SW_SHOWNORMAL) ;
隱藏子視窗用:
ShowWindow (hwndChild, SW_HIDE) ;
查看子視窗是否可見用:
IsWindowVisible (hwndChild) ;

不可用/啟用 子視窗

要使按鈕不可用(文字變為灰色).用:
EnableWindow (hwndChild, FALSE) ;
恢複為可用:
EnableWindow (hwndChild, TRUE) ;
判斷是否被啟用:
IsWindowEnabled (hwndChild) ;

輸入焦點

使用者使用按鈕時.按鈕獲得輸入焦點而其父視窗失去輸入焦點.這時父視窗先收到WM_KILLFOCUS消
息(wParam參數為獲得輸入焦點的視窗的控制代碼).然後獲得輸入焦點的視窗(按鈕子視窗)收到一個WM
_SETFOCUS訊息(wParam參數為失去輸入焦點的視窗的控制代碼).

控制項與顏色

系統色彩
Windows保留了29種系統色彩以供各種顯示使用(例如:菜單顏色.菜單文字顏色.視窗顏色等等)。您可
以使用GetSysColor和SetSysColors來獲得和設定這些顏色。設定的系統色彩只在目前Windows對
話過程中有效。

要在按鈕中顯示表徵圖或位元影像,您可以用BS_ICON或BS_BITMAP樣式,並用BM_SETIMAGE訊息設定位元影像。
對於BS_OWNERDRAW樣式的按鈕,它允許完全自由地繪製按鈕。

====================================
靜態控制項

建立子視窗時指定視窗類別為"static".它既不接收滑鼠或鍵盤輸入,也不向父視窗發送WM_COMMAND訊息。
設定靜態控制項的文字用SetWindowText.

================================
捲軸控制項

建立子視窗時指定視窗類別為"scrollbar".
它不向父視窗發送WM_COMMAND訊息,而是像視窗捲軸那樣發送WM_VSCROLL和WM_HSCROLL訊息。
可以通過lParam參數來區分視窗捲軸與捲軸控制項。對子視窗捲軸其值為0,對於捲軸控制項其值為滾動
條子視窗的控制代碼。wParam對視窗捲軸和捲軸控制項來說含義相同。

設定捲軸控制項用的函數和設定視窗捲軸一樣:
SetScrollRange (hwndScroll, SB_CTL, iMin, iMax, bRedraw) ;
SetScrollPos (hwndScroll, SB_CTL, iPos, bRedraw) ;
SetScrollInfo (hwndScroll, SB_CTL, &si, bRedraw) ;
區別是設定捲軸控制項時.第一個參數是控制項子視窗控制代碼而不是父視窗控制代碼.第二個參數是SB_CTL而不是
SB_VERT或SB_HORZ.

===========================
為控制項指定視窗函數

控制項的視窗函數是windows內部的. 但可以用GWL_WNDPROC做參數通過GetWindowLong函數得到它
的函數地址. 而且可以用SetWindowLong給它重新指定一個新的視窗函數(新的函數也要是callback函數).如:
OldScroll = (WNDPROC) SetWindowLong (hwndScroll, GWL_WNDPROC,
         (LONG) ScrollProc)) ; //傳回值是原來的視窗函數的地址.

在需要用Tab鍵在控制項之間切換輸入焦點時. 由於控制項獲得輸入焦點後所有的鍵盤訊息都發送給控制項的視窗
函數了.而控制項原來的視窗函數並不處理Tab鍵按下的訊息.這時就可以用上邊的方法給控制項重新設定一個窗
口訊息處理函數並在其中處理Tab鍵.最後再在新的視窗函數中呼叫原來的視窗函數處理其它訊息:
return CallWindowProc (OldScroll, hwnd, message, wParam,lParam) ;
這樣就可以處理Tab鍵了.

就像可以通過SetWindowLong給視窗重新設定視窗函數一樣.可以用SetClassLong來設定某個視窗的窗
口類的一些東西.例如下邊重新設定視窗類別的畫刷:
 SetClassLong (hwnd, GCL_HBRBACKGROUND,
      (LONG)CreateSolidBrush (RGB (color[0], color[1], color[2])));

===============================
編輯控制項

建立子視窗時用"edit".如:
hwndEdit = CreateWindow (TEXT ("edit"), NULL,       
               WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |       
               WS_BORDER | ES_LEFT | ES_MULTILINE |       
               ES_AUTOHSCROLL | ES_AUTOVSCROLL,       
               0, 0, 0, 0, hwnd, (HMENU) ID_EDIT,       
              ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;

編輯控制項的樣式:
文字對齊: ES_LEFT、ES_RIGHT和ES_CENTER
多行: ES_MULTILINE (預設為單行)
在單行樣式中.要文字水平捲動: ES_AUTOHSCROLL
在多行樣式中.要文字水平捲動(不是出現捲軸)(這阻止了自動換行): ES_AUTOHSCROLL
在多行樣式中.要文字垂直捲動(不是出現捲軸): ES_AUTOVSCROLL
在多行樣式中.要顯示捲軸用WS_HSCROLL和WS_VSCROLL
編輯控制項預設時沒有邊框.要顯示邊框用 WS_BORDER
選擇編輯控制項的文字時.文字反白顯示.但編輯控制項失去焦點後文字將不再加亮顯示.要使失去焦點後
選擇的文字仍然加亮顯示用: ES_NOHIDESEL

編輯控制項給父視窗訊息處理常式發送WM_COMMAND訊息.訊息參數為
LOWORD (wParam)     子視窗ID
HIWORD (wParam)      通知碼
lParam              子視窗控制代碼

其中通知碼為:
EN_SETFOCUS        編輯控制項已經獲得輸入焦點
EN_KILLFOCUS       編輯控制項已經失去輸入焦點
EN_CHANGE          編輯控制項的內容將改變
EN_UPDATE          編輯控制項的內容已經改變
EN_ERRSPACE        編輯控制項執行已經超出中間
EN_MAXTEXT         編輯控制項在插入時執行超出空間
EN_HSCROLL         編輯控制項的水平捲軸已經被按下
EN_VSCROLL         編輯控制項的垂直捲軸已經被按下

要處理tab鍵切換輸入焦點或處理Enter鍵. 可以給它重新指定一個視窗函數並在其中攔截.

要在編輯區插入文字用:
GetWindowTextLength
GetWindowText
SetWindowText

給編輯控制項發送訊息:
SendMessage (hwndEdit, WM_CUT, 0, 0) ;   //剪貼     
SendMessage (hwndEdit, WM_COPY, 0, 0) ;  //複製 
SendMessage (hwndEdit, WM_CLEAR, 0, 0) ; //刪除選擇文字
SendMessage (hwndEdit, WM_PASTE, 0, 0) ; //粘貼

SendMessage (hwndEdit, EM_GETSEL, (WPARAM) &iStart,(LPARAM) &iEnd) ;
//取得目前選擇的起始位置和末尾位置.(末尾位置是選擇的最後一個文字的位置加1)

SendMessage (hwndEdit, EM_SETSEL, iStart, iEnd) ;  //選擇文字

SendMessage (hwndEdit, EM_REPLACESEL, 0, (LPARAM) szString) ;
//用其他文字替換目前選擇的文字

iCount = SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0) ;
//取得多行編輯控制項的行數

iOffset = SendMessage (hwndEdit, EM_LINEINDEX, iLine, 0) ;
//對任何特定的行(從0行開始),您可以取得距離編輯緩衝區文字開頭的位移量.
//iLine為-1時返回游標所在行的位移量.

iLength = SendMessage (hwndEdit, EM_LINELENGTH, iLine, 0) ;
//取得第iLine行的長度

iLength = SendMessage (hwndEdit, EM_GETLINE, iLine, (LPARAM) szBuffer) ;
//將第iLine行複製到緩衝區szBuffer中

==========================
清單控制項

建立列表子視窗時,用"listbox"作為視窗類別.

列表樣式:
LBS_NOTIFY   允許父視窗接收列表的WM_COMMAND訊息(預設時不向父視窗發送WM_COMMAND訊息)
LBS_SORT    對列表中的項目排序
LBS_MULTIPLESEL   列表是多選的(預設時為單選)
LBS_NOREDRAW    防止在向列表增加項目時自動重畫列表
樣式LBS_STANDARD包含了最常用的樣式:(LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)

將字串放入列表:
SendMessage (hwndList, LB_INSERTSTRING, i, (LPARAM) szString) ;
第一個參數是清單控制項的視窗控制代碼.
第二個參數LB_INSERTSTRING表示要插入一個項目.
第三個參數表示要插入的位置.(位置值從0開始.0表示最上邊第一個位置.-1表示插入最後)
第四個參數是要插入的字串(字串以0結尾).
函數返回0表示正常完成.

如果清單控制項包含LBS_SORT樣式.則插入一個字串時可以將第2個參數設定為LB_ADDSTRING.這樣
字串就會被自動插入到一個位置.如:
SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) szString) ;

要在清單控制項中刪除一個字串.只要指定第2個參數為LB_DELETESTRING. 例如:
SendMessage (hwndList, LB_DELETESTRING, iIndex, 0) ;

要刪除所有列表中的內容.則指定第2個參數為LB_RESETCONTENT. 如:
SendMessage (hwndList, LB_RESETCONTENT, 0, 0) ;

在向列表增加或刪除字串時.清單控制項會自動被它的視窗函數重畫.如果你有許多字串需要增加.
你可能希望在所有字串增加完成前暫時阻止列表的自動重畫.這要:
SendMessage (hwndList, WM_SETREDRAW, FALSE, 0) ;
在增加完成後再恢複清單控制項的自動重畫就可以了:
SendMessage (hwndList, WM_SETREDRAW, TRUE, 0) ;

要取得現在清單控制項中的項目數用:
iCount = SendMessage (hwndList, LB_GETCOUNT, 0, 0) ;

在單選清單控制項中.要選擇一個項目(它會被加亮顯示)用:
SendMessage (hwndList, LB_SETCURSEL, iIndex, 0) ;
//iIndex參數為要選擇第幾個項目.指定為-1表示取消所有選擇.

在單選清單控制項中.也可以根據一個字串的第一個字母來選擇一個項目.如:
iIndex = SendMessage (hwndList, LB_SELECTSTRING, iIndex,
                     (LPARAM) szSearchString) ;
表示從第iIndex位置開始搜尋.如果哪個項目的開始字母與 szSearchString相同.則選擇該項目.並
返回該項目的位置. 沒有匹配的項目時返回-1.

在單選清單控制項中.要取得當前選擇項目的索引.用:
iIndex = SendMessage (hwndList, LB_GETCURSEL, 0, 0) ;
如果沒有被選項目.函數返回LB_ERR(值為-1).

在單選清單控制項中.將某個項目複製到一個字元緩衝區.用:
iLength = SendMessage (hwndList, LB_GETTEXT, iIndex, (LPARAM) szBuffer) ;
則將清單控制項中索引為iIndex的項目複製到szBuffer. 並返回字串的長度iLength.
(為了使szBuffer緩衝區足夠大.你可以用LB_GETTEXTLEN做參數先取得該項目的字串長度.)

對於多選清單控制項:

可以使用LB_SETSEL來設定某特定項目的選擇狀態(不會影響其他項目的選擇狀態):
SendMessage (hwndList, LB_SETSEL, wParam, iIndex) ;
參數wParam為0時.取消選擇. 為-1時.選擇/取消所有項目. 為其它值時. 選擇第iIndex個項目.

查看某項目的選擇狀態:
iSelect = SendMessage (hwndList, LB_GETSEL, iIndex, 0) ;
//項目被選擇時返回非0. 否則返回0.

 

要使清單控制項獲得輸入焦點用:
SetFocus (hwndList) ;

清單控制項發送給父視窗的訊息是WM_COMMAND. 參數如下:
LOWORD (wParam) 子視窗ID
HIWORD (wParam) 通知碼
lParam 子視窗控制代碼
 
其中通知碼的值如下:
LBN_ERRSPACE -2  表示已經超出執行空間
LBN_SELCHANGE 1  表示目前選擇已經被改變
LBN_DBLCLK 2     說明某項目已經被滑鼠雙擊
LBN_SELCANCEL 3
LBN_SETFOCUS 4
LBN_KILLFOCUS 5
 
只有清單視窗樣式包括LBS_NOTIFY時,清單控制項才會向父視窗發送LBN_SELCHANGE和LBN_DBLCLK。

檔案清單
要將檔案目錄列表填入清單列表.用:
SendMessage (hwndList, LB_DIR, iAttr, (LPARAM) szFileSpec) ;
//iAttr參數是檔案屬性代碼,其低位元組是檔案屬性代碼:
iAttr    值 屬性
DDL_READWRITE  0x0000  普通檔案
DDL_READONLY  0x0001 唯讀檔案 
DDL_HIDDEN  0x0002 隱藏檔案 
DDL_SYSTEM  0x0004 系統檔案 
DDL_DIRECTORY  0x0010 子目錄 
DDL_ARCHIVE  0x0020 歸檔位設立的檔案
//高位元組提供了一些對所要求項目的附加控制:
iAttr  值 屬性 
DDL_DRIVES 0x4000 包括磁碟機控制代碼 
DDL_EXCLUSIVE 0x8000 互斥搜尋

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.