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对话方块来实现控件的创建,具体实现见明天的实例介绍。

 

posted on 2018-10-18 22:00  Petrol  阅读(3113)  评论(0编辑  收藏  举报

导航