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 }
运行结果:
代码说明:
(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对话方块来实现控件的创建,具体实现见明天的实例介绍。