C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】

摘要:
对比按钮样式和单选框与复选框样式,可以发现其样式前缀都是BS_,说明按钮、单选框与复选框都定义在“BUTTON”这个预定义结构体中。

(一)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窗口与常用控件样式实例应用

C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】第1张C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】第2张
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, intiCmdShow )
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     returnmsg.wParam ;
76 }
77 
78 LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
79 {
80     staticHWND        hControls [ NUM ] ;
81     staticRECT     rect ;
82     static intcxChar, cyChar ;
83 PAINTSTRUCT     ps ;
84 HDC                hdc ;
85     inti ;
86 
87     switch( message )
88 {
89     caseWM_CREATE:
90 CreateControls ( hwnd, hControls, lParam ) ;
91         
92         cxChar = LOWORD (GetDialogBaseUnits ());    //获得窗口中内定字体字元宽度(低字组)
93         cyChar = HIWORD (GetDialogBaseUnits ());    //获得窗口中内定字体字元高度(高字组)
94         return 0;
95     caseWM_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     caseWM_DESTROY:
109         PostQuitMessage (0) ;
110         return 0;
111 }
112 
113     returnDefWindowProc ( hwnd, message, wParam, lParam ) ;
114 }
115 
116 int CreateControls ( HWND hwnd, HWND *hControls, LPARAM lParam )
117 {
118     inti ;
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

运行结果:

C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】第3张

代码说明:

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

免责声明:文章转载自《C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前端学习 -- image标签和meta标签安卓websocket 封装基于Java-websocket下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Vue指令和事件

/** * 语法糖的概念: * 语法糖是指在不影响功能的情况下,添加某种方法实现同样的; * 使用语法糖,可以简化代码的书写 * 比如 v-on:click='func' @click='func' * v-bind:src :src */ <!-- v-on 可以监听原生DOM事件click,dbclick,keyup,mousemove...

VC++的dll中接收消息

LRESULT CALLBACK MessageWinProc( HWND hwnd,      // handle to window UINT uMsg,      // message identifier WPARAM wParam,  // first message parameter LPARAM lParam   // second mes...

Vue+element UI实现“回到顶部”按钮组件

介绍 这是一个可以快速回到页面顶部的组件,当用户浏览到页面底部的时候,通过点击按钮,可快速回到页面顶部。 使用方法 由于该组件是基于element-UI进行二次封装的,所以在使用该组件时请务必安装element-UI(安装方式猛戳这里),安装好element-UI后,只需将该组件文件夹BackToTop导入到现有项目中即可使用。 使用示例 <temp...

Django知识总结(一)

壹 ● 有关http协议 一 ● 全称 超文本传输协议(HyperText Transfer Protocol) 二 ● 协议 双方遵循的规范 http协议是属于应用层的协议(还有ftp, smtp等), 即浏览器请求消息和服务器响应消息的一系列规则 三 ● http协议的特性 http是无状态、无连接的协议(stateless, c...

WPF笔记一

笔记内容: BUG、WPF运行窗体时调用Hide()方法,然后再Show()异常的解决方案 WPF 窗体设置为无边框 选择本地文件 选择文件夹 WPF实现右下角弹出消息窗口 WPF 显示 HTTP 网络图片 获得当前应用软件的版本 获取匿名对象(object)的属性值 WPF *.exe给另一个*.exe传值 C# zip压缩与zip解压,下载地址:点击...

C#后台实现在Grid标签中动态新增CheckBox标签(WPF中)

页面代码 1 <Grid Margin="45,0,10,0" > 2 <Grid.RowDefinitions> 3 <RowDefinition Height="*"/> 4 <RowDef...