C語言Windows程式開發—Windows視窗樣式與常用控制元件樣式【第04天】
(一)Windows視窗(MDICLIENT)樣式介紹
1 /* Windows視窗樣式 */ 2 WS_BORDER //帶有邊框的視窗 3 WS_CAPTION //帶有標題欄的視窗 4 WS_CHILD //子視窗 5 WS_CLIPCHILDREN //當在父視窗內繪圖時, 排除子視窗區域 6 WS_CLIPSIBLINGS //使視窗排除子視窗之間的相對區域 7 WS_DISABLED //視窗呈不可用狀態 8 WS_DLGFRAME //帶對話方塊邊框樣式,不帶標題框 9 WS_GROUP //組樣式 10 WS_ICONIC //初始化時呈最小化狀態 11 WS_MAXIMIZE //初始時最大化視窗 12 WS_MAXIMIZEBOX //具有最大化按鈕 13 WS_MINIMIZE //初始時最小化視窗 14 WS_MINIMIZEBOX //具有最小化按鈕 15 WS_OVERLAPPED //具有一個標題欄和邊框 16 WS_OVERLAPPEDWINDOW //這些樣式的組合 WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX17 WS_POPUP //彈出風格, 不能用於子視窗 18 WS_POPUPWINDOW //這些樣式的組合 WS_BORDER, WS_POPUP, WS_SYSMENU 19 WS_SIZEBOX //可調節邊框大小 20 WS_SYSMENU //標題框上帶有視窗選單(須指定WS_CAPTION樣式) 21 WS_TABSTOP //可接受TAB鍵 22 WS_VISIBLE //初始時是可見的
(二)STATIC(靜態文字)樣式介紹
1 /* STATIC(靜態控制元件)控制元件樣式*/ 2 SS_BITMAP //顯示點陣圖,控制元件自動適應點陣圖尺寸 3 SS_CENTER //文字居中 4 SS_CENTERIMAGE //顯示點陣圖,點陣圖自動裁剪至控制元件大小 5 SS_LEFT //文字左對齊 6 SS_RIGHT //文字右對齊
(三)EDIT(文字框)樣式介紹
1 /* EDIT(文字框)控制元件樣式 */ 2 ES_AUTOHSCROLL //水平滾動條 3 ES_AUTOVSCROLL //垂直滾動條 4 ES_CENTER //居中 5 ES_LEFT //左對齊 6 ES_LOWERCASE //將所有字元強制轉換為小寫 7 ES_MULTILINE //多行顯示 8 ES_NOHIDESEL //表示文字框未被選中時,也能獲得輸入焦點,通常用在首個文字框 9 ES_NUMBER //只允許輸入數字 10 ES_PASSWORD //密碼專用文字框,掩碼通常為“*” 11 ES_READONLY //只讀,不可編輯 12 ES_RIGHT //右對齊 13 ES_UPPERCASE //將所有字元強制轉換為大寫 14 ES_WANTRETURN //在多行編輯時,允許使用者通過ENTER鍵插入回車符 15 WS_TABSTOP //允許使用者通過Tap鍵選中文字框
(四)BUTTON(按鈕)樣式介紹
BS_ (全拼BUTTONSTYLE_),表示按鈕樣式,包括按鈕、單選框與複選框。對比按鈕樣式和單選框與複選框樣式,可以發現其樣式字首都是BS_,說明按鈕、單選框與複選框都定義在“BUTTON”這個預定義結構體中。
(1)按鈕樣式
1 /* BUTTON(按鈕)控制元件樣式 */ 2 BS_BOTTOM //按鈕中的內容底部對齊 3 BS_CENTER //按鈕中的內容水平居中 4 BS_DEFPUSHBUTTON //按鈕,如果位於對話方塊中,可以通過ENTER鍵選中按鈕 5 BS_LEFT //按鈕中的內容左對齊 6 BS_NOTIFY //允許按鈕向父視窗傳送BN_KILLFOCUS和BN_SETFOCUS 7 BS_OWNERDRAW //建立自繪按鈕 8 BS_PUSHBUTTON //按鈕,單擊後給父視窗傳送WM_COMMAND訊息 9 BS_RIGHT //按鈕中的內容右對齊 10 BS_TOP //按鈕中的內容頂部對齊 11 BS_VCENTER //按鈕中的內容垂直居中 12 WS_TABSTOP //允許使用者通過Tap鍵選中按鈕
(2)單選框樣式
1 /* BUTTON(單選框)控制元件樣式 */ 2 BS_AUTORADIOBUTTON //單選按鈕,當選中時,清除同一組中其它單選按鈕 3 BS_LEFT //單選按鈕中的內容左對齊 4 BS_RADIOBUTTON //單選按鈕,不可“選中” 5 BS_RIGHT //單選按鈕中的內容右對齊 6 BS_RIGHTBUTTON //將單選按鈕放置到右側 7 WS_TABSTOP //允許使用者通過Tap鍵選中單選按鈕
(3)複選框樣式
1 /* BUTTON(複選框)控制元件樣式 */ 2 BS_3STATE //3狀態複選框,不可“選中” 3 BS_AUTO3STATE //3狀態複選框,有“選中”、“選中但不可用”與“清除” 4 BS_AUTOCHECKBOX //複選框,有“選中”與“清除”2種狀態 5 BS_CHECKBOX //複選框,不可“選中” 6 BS_LEFT //複選框中的內容左對齊 7 BS_PUSHLIKE //使複選框動作與按鈕動作相似 8 BS_RIGHT //複選框中的內容右對齊 9 BS_RIGHTBUTTON //將複選框放置到右側 10 WS_TABSTOP //允許使用者通過Tap鍵選中複選框
(五)LISTBOX(列表框)樣式介紹
1 /* LISTBOX(列表)控制元件樣式 */ 2 LBS_DISABLENOSCROLL //列表框中資料項未超出時,也顯示垂直滾動條 3 LBS_EXTENDEDSEL //使用“SHIFT+單擊”選擇多個數據項 4 LBS_HASSTRINGS //列表框的資料項包含字串,屬於預設樣式 5 LBS_MULTICOLUMN //多列列表框,通過LB_SETCOLUMNWIDTH設定列寬 6 LBS_MULTIPLESEL //通過單擊或雙擊來選中或者取消選中資料項 7 LBS_NOINTEGRALHEIGHT //在建立列表框時,設定列表框的大小 8 LBS_NOREDRAW //列表框資料項發生改變時無法自動更新,但可以呼叫WS_SETREDRAW來更新 9 LBS_NOSEL //只能檢視列表框資料項,無法選中 10 LBS_NOTIFY //當單擊或雙擊列表框中的資料項時,通知父視窗 11 LBS_OWNERDRAWFIXED //使用者設定列表框中的內容,資料項具有相同高度,可以通過WM_MEASUREITEM增加資料項,通過WM_DRAWITEM更新資料項 12 LBS_OWNERDRAWVARIABLE //與LBS_OWNERDRAWFIXED樣式基本相對,但是其資料項高度是可變的 13 LBS_SORT //根據字母順序給資料項排序 14 LBS_STANDARD //根據字母順序給資料項排序,列表框具有邊框,使用者單擊或雙擊時,父視窗接收輸入訊息 15 LBS_USETABSTOPS //允許使用者通過Tap鍵來選擇列表框中的資料項 16 LBS_TABSTOP //允許使用者通過Tap鍵選中列表框
(六)COMBOBOX(組合框)樣式介紹
1 /* COMBOBOX(組合框)控制元件樣式 */ 2 CBS_AUTOHSCROLL //顯示水平滾動條 3 CBS_DISABLENOSCROLL //組合框中資料項未超出時,也顯示垂直滾動條 4 CBS_DROPDOWN //只顯示組合框,點選下拉按鈕後顯示組合列表框 5 CBS_DROPDOWNLIST //顯示組合框中選中的資料項 6 CBS_HASSTRINGS //組合框的資料項包含字串,屬於預設樣式 7 CBS_LOWERCASE //將所有字元強制轉換為小寫 8 CBS_NOINTEGERALHEIGHT //在建立組合框時,設定組合框的大小 9 CBS_OEMCONVERT // 10 CBS_SORT //根據字母順序給資料項排序 11 CBS_UPPERCASE //將所有字元強制轉換為大寫 12 WS_TABSTOP //允許使用者通過Tap鍵選中組合框
(七)Windows視窗與常用控制元件樣式例項應用
1 #include <windows.h> 2 3 #define IDC_BS_USERNAMES 1000 4 #define IDC_BS_USERTELE 1001 5 #define IDC_SS_USERNAME 1002 6 #define IDC_ES_USERNAME 1003 7 #define IDC_SS_PASSWORD 1004 8 #define IDC_ES_PASSWORD 1005 9 #define IDC_BS_LOGIN 1006 10 11 12 /*button結構宣告與賦值*/ 13 struct 14 { 15 /* data */ 16 TCHAR * szStruct ; //控制元件所屬的預定義結構體 17 TCHAR * szCaption ; //控制元件名稱 18 int iStyle ; //控制元件樣式 19 int IDC ; //控制元件ID 20 } 21 controls [] = 22 { 23 TEXT ("BUTTON"), TEXT ("USERNAME"), WS_GROUP | BS_AUTORADIOBUTTON, IDC_BS_USERNAMES, 24 TEXT ("BUTTON"), TEXT ("USERTELE"), BS_AUTORADIOBUTTON, IDC_BS_USERTELE, 25 TEXT ("STATIC"), TEXT ("USERNAME:"), BS_LEFT, IDC_SS_USERNAME, 26 TEXT ("EDIT"), TEXT (""), WS_BORDER | ES_LEFT | ES_AUTOHSCROLL, IDC_ES_USERNAME, 27 TEXT ("STATIC"), TEXT ("PASSWORD:"), SS_LEFT, IDC_SS_PASSWORD, 28 TEXT ("EDIT"), TEXT (""), WS_BORDER | ES_LEFT | ES_AUTOHSCROLL | ES_PASSWORD, IDC_ES_PASSWORD, 29 TEXT ("BUTTON"), TEXT ("LOGIN"), BS_DEFPUSHBUTTON, IDC_BS_LOGIN 30 }; 31 32 #define NUM (sizeof controls / sizeof controls[0]) 33 34 LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ) ; 35 int CreateControls ( HWND, HWND *, LPARAM ) ; 36 37 int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) 38 { 39 static TCHAR szAppName[] = TEXT ( "Dome" ) ; 40 HWND hwnd ; 41 MSG msg ; 42 WNDCLASS wndclass ; 43 44 wndclass.style = CS_HREDRAW | CS_VREDRAW ; 45 wndclass.lpfnWndProc = WndProc ; 46 wndclass.hInstance = hInstance ; 47 wndclass.cbClsExtra = 0 ; 48 wndclass.cbWndExtra = 0 ; 49 wndclass.hbrBackground = ( HBRUSH ) ( COLOR_BTNFACE + 1 ) ; 50 wndclass.hIcon = LoadIcon ( NULL, IDI_APPLICATION ) ; 51 wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW ) ; 52 wndclass.lpszClassName = szAppName ; 53 wndclass.lpszMenuName = NULL ; 54 55 if ( !RegisterClass ( &wndclass ) ) 56 { 57 MessageBox ( NULL, TEXT ("無法註冊視窗類!"), TEXT ("錯誤"), MB_OK | MB_ICONERROR ) ; 58 } 59 60 hwnd = CreateWindow ( szAppName, TEXT ("LOGINFRAME"), 61 WS_TABSTOP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, 62 CW_USEDEFAULT, CW_USEDEFAULT, 63 348, 232, 64 NULL, NULL, hInstance, NULL ) ; 65 66 ShowWindow ( hwnd, iCmdShow ) ; 67 UpdateWindow (hwnd) ; 68 69 while ( GetMessage ( &msg, NULL, 0, 0 ) ) 70 { 71 TranslateMessage ( &msg ) ; 72 DispatchMessage ( &msg ) ; 73 } 74 75 return msg.wParam ; 76 } 77 78 LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) 79 { 80 static HWND hControls [ NUM ] ; 81 static RECT rect ; 82 static int cxChar, cyChar ; 83 PAINTSTRUCT ps ; 84 HDC hdc ; 85 int i ; 86 87 switch ( message ) 88 { 89 case WM_CREATE: 90 CreateControls ( hwnd, hControls, lParam ) ; 91 92 cxChar = LOWORD (GetDialogBaseUnits ()); //獲得視窗中內定字型字元寬度(低字組) 93 cyChar = HIWORD (GetDialogBaseUnits ()); //獲得視窗中內定字型字元高度(高字組) 94 return 0 ; 95 case WM_SIZE: 96 GetClientRect ( hwnd, &rect ) ; 97 98 MoveWindow ( hControls[ controls[0].IDC ], 30, 30, 120, cyChar * 7 / 5, TRUE ) ; 99 MoveWindow ( hControls[ controls[1].IDC ], 130, 30, 120, cyChar * 7 / 5, TRUE ) ; 100 MoveWindow ( hControls[ controls[2].IDC ], 30, 65, 82, cyChar * 7 / 5, TRUE ) ; 101 MoveWindow ( hControls[ controls[3].IDC ], 120, 63, 180, cyChar * 7 / 5, TRUE ) ; 102 MoveWindow ( hControls[ controls[4].IDC ], 30, 105, 82, cyChar * 7 / 5, TRUE ) ; 103 MoveWindow ( hControls[ controls[5].IDC ], 120, 103, 180, cyChar * 7 / 5, TRUE ) ; 104 MoveWindow ( hControls[ controls[6].IDC ], 90, 145, 150, cyChar * 7 / 4, TRUE ) ; 105 106 return 0 ; 107 108 case WM_DESTROY: 109 PostQuitMessage (0) ; 110 return 0 ; 111 } 112 113 return DefWindowProc ( hwnd, message, wParam, lParam ) ; 114 } 115 116 int CreateControls ( HWND hwnd, HWND * hControls, LPARAM lParam ) 117 { 118 int i ; 119 HINSTANCE hInst = ( ( LPCREATESTRUCT ) lParam ) -> hInstance ; 120 121 for ( i=0; i<NUM; i++ ) 122 hControls [ controls[i].IDC ] = CreateWindow ( 123 controls[i].szStruct, 124 controls[i].szCaption, 125 controls[i].iStyle | WS_CHILD | WS_VISIBLE, 126 0, 0, 0, 0, 127 hwnd, (HMENU) controls[i].IDC, hInst, NULL) ; 128 return 0 ; 129 }View Code
執行結果:
程式碼說明:
(1)結構體controls[ ]說明
1 /*結構體controls宣告與賦值*/ 2 struct 3 { 4 /* data */ 5 TCHAR * szStruct ; //控制元件所屬的預定義結構體 6 TCHAR * szCaption ; //控制元件名稱 7 int iStyle ; //控制元件樣式 8 int IDC ; //控制元件ID 9 } 10 controls [] = 11 { 12 TEXT ("BUTTON"), TEXT ("USERNAME"), WS_GROUP | BS_AUTORADIOBUTTON, IDC_BS_USERNAMES, 13 TEXT ("BUTTON"), TEXT ("USERTELE"), BS_AUTORADIOBUTTON, IDC_BS_USERTELE, 14 TEXT ("STATIC"), TEXT ("USERNAME:"), BS_LEFT, IDC_SS_USERNAME, 15 TEXT ("EDIT"), TEXT (""), WS_BORDER | ES_LEFT, IDC_ES_USERNAME, 16 TEXT ("STATIC"), TEXT ("PASSWORD:"), SS_LEFT, IDC_SS_PASSWORD, 17 TEXT ("EDIT"), TEXT (""), WS_BORDER | ES_LEFT | ES_PASSWORD, IDC_ES_PASSWORD, 18 TEXT ("BUTTON"), TEXT ("LOGIN"), BS_DEFPUSHBUTTON, IDC_BS_LOGIN 19 };
<1>在建立多個單選按鈕時,同時,這些單選按鈕有且只能選擇1個,那麼就需要在第1個單選按鈕的樣式中新增WS_GROUP樣式,表示從這個單選按鈕開始直到遇到下1個WS_GROUP樣式,這些單選按鈕都屬於同一組,在選取其中一個單選按鈕時,其它選中的單選按鈕會自動清除;
<2>在建立的EDIT文字框的樣式中新增ES_PASSWORD樣式,表示該文字框是密碼輸入框,預設掩碼為“*”;
<3>在主函式WinMain之前,宣告結構體controls[ ]並賦值,利用for迴圈實現控制元件建立,能夠有效減少重複程式碼,縮減程式碼行數;
<4>如果需要增加控制元件數目,則可以直接在結構體controls[ ]宣告與賦值時新增,而不需要修改CreateControls函式;
(2)MoveWindow函式說明
1 BOOL MoveWindow( //視窗或控制元件尺寸調整函式 2 HWND hWnd, //要調整尺寸的控制元件控制代碼 3 int X, //控制元件左上角(X,Y)座標的X值 4 int Y, //控制元件左上角(X,Y)座標的Y值 5 int nWidth, //控制元件寬度 6 int nHeight, //控制元件高度 7 BOOL bRepaint //是否按照以上尺寸重繪控制元件,TRUE表示重繪 8 );
在設定控制元件位置與尺寸時,可以根據已經設計好的尺寸直接填寫,也可以根據利用相對位置進行計算得到;
提示:在進行視窗設計時,也可以通過在資源文件中DIALOG對話方塊來實現控制元件的建立,具體實現見明天的例項介紹。