1. 程式人生 > >C語言Windows程式開發—Windows視窗樣式與常用控制元件樣式【第04天】

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_MAXIMIZEBOX
17 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對話方塊來實現控制元件的建立,具體實現見明天的例項介紹。