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

(一)Windows窗口(MDICLIENT)样式介绍

 /* Windows窗口样式 */
WS_BORDER //带有边框的窗口
WS_CAPTION //带有标题栏的窗口
WS_CHILD //子窗口
WS_CLIPCHILDREN //当在父窗口内绘图时, 排除子窗口区域
WS_CLIPSIBLINGS //使窗口排除子窗口之间的相对区域
WS_DISABLED //窗口呈不可用状态
WS_DLGFRAME //带对话框边框样式,不带标题框
WS_GROUP //组样式
WS_ICONIC //初始化时呈最小化状态
WS_MAXIMIZE //初始时最大化窗口
WS_MAXIMIZEBOX //具有最大化按钮
WS_MINIMIZE //初始时最小化窗口
WS_MINIMIZEBOX //具有最小化按钮
WS_OVERLAPPED //具有一个标题栏和边框
WS_OVERLAPPEDWINDOW //这些样式的组合 WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX
WS_POPUP //弹出风格, 不能用于子窗口
WS_POPUPWINDOW //这些样式的组合 WS_BORDER, WS_POPUP, WS_SYSMENU
WS_SIZEBOX //可调节边框大小
WS_SYSMENU //标题框上带有窗口菜单(须指定WS_CAPTION样式)
WS_TABSTOP //可接受TAB键
WS_VISIBLE //初始时是可见的

(二)STATIC(静态文本)样式介绍

 /* STATIC(静态控件)控件样式 */
SS_BITMAP //显示位图,控件自动适应位图尺寸
SS_CENTER //文本居中
SS_CENTERIMAGE //显示位图,位图自动裁剪至控件大小
SS_LEFT //文本左对齐
SS_RIGHT //文本右对齐

(三)EDIT(文本框)样式介绍

 /* EDIT(文本框)控件样式 */
ES_AUTOHSCROLL //水平滚动条
ES_AUTOVSCROLL //垂直滚动条
ES_CENTER //居中
ES_LEFT //左对齐
ES_LOWERCASE //将所有字符强制转换为小写
ES_MULTILINE //多行显示
ES_NOHIDESEL //表示文本框未被选中时,也能获得输入焦点,通常用在首个文本框
ES_NUMBER //只允许输入数字
ES_PASSWORD //密码专用文本框,掩码通常为“*”
ES_READONLY //只读,不可编辑
ES_RIGHT //右对齐
ES_UPPERCASE //将所有字符强制转换为大写
ES_WANTRETURN //在多行编辑时,允许用户通过ENTER键插入回车符
WS_TABSTOP //允许用户通过Tap键选中文本框

(四)BUTTON(按钮)样式介绍

BS_ (全拼BUTTONSTYLE_),表示按钮样式,包括按钮、单选框与复选框。对比按钮样式和单选框与复选框样式,可以发现其样式前缀都是BS_,说明按钮、单选框与复选框都定义在“BUTTON”这个预定义结构体中。

(1)按钮样式

 /* BUTTON(按钮)控件样式 */
BS_BOTTOM //按钮中的内容底部对齐
BS_CENTER //按钮中的内容水平居中
BS_DEFPUSHBUTTON //按钮,如果位于对话框中,可以通过ENTER键选中按钮
BS_LEFT //按钮中的内容左对齐
BS_NOTIFY //允许按钮向父窗口发送BN_KILLFOCUS和BN_SETFOCUS
BS_OWNERDRAW //创建自绘按钮
BS_PUSHBUTTON //按钮,单击后给父窗口发送WM_COMMAND消息
BS_RIGHT //按钮中的内容右对齐
BS_TOP //按钮中的内容顶部对齐
BS_VCENTER //按钮中的内容垂直居中
WS_TABSTOP //允许用户通过Tap键选中按钮

(2)单选框样式

 /* BUTTON(单选框)控件样式 */
BS_AUTORADIOBUTTON //单选按钮,当选中时,清除同一组中其它单选按钮
BS_LEFT //单选按钮中的内容左对齐
BS_RADIOBUTTON //单选按钮,不可“选中”
BS_RIGHT //单选按钮中的内容右对齐
BS_RIGHTBUTTON //将单选按钮放置到右侧
WS_TABSTOP //允许用户通过Tap键选中单选按钮

(3)复选框样式

 /* BUTTON(复选框)控件样式 */
BS_3STATE //3状态复选框,不可“选中”
BS_AUTO3STATE //3状态复选框,有“选中”、“选中但不可用”与“清除”
BS_AUTOCHECKBOX //复选框,有“选中”与“清除”2种状态
BS_CHECKBOX //复选框,不可“选中”
BS_LEFT //复选框中的内容左对齐
BS_PUSHLIKE //使复选框动作与按钮动作相似
BS_RIGHT //复选框中的内容右对齐
BS_RIGHTBUTTON //将复选框放置到右侧
WS_TABSTOP //允许用户通过Tap键选中复选框

(五)LISTBOX(列表框)样式介绍

 /* LISTBOX(列表)控件样式 */
LBS_DISABLENOSCROLL //列表框中数据项未超出时,也显示垂直滚动条
LBS_EXTENDEDSEL //使用“SHIFT+单击”选择多个数据项
LBS_HASSTRINGS //列表框的数据项包含字符串,属于默认样式
LBS_MULTICOLUMN //多列列表框,通过LB_SETCOLUMNWIDTH设置列宽
LBS_MULTIPLESEL //通过单击或双击来选中或者取消选中数据项
LBS_NOINTEGRALHEIGHT //在创建列表框时,设置列表框的大小
LBS_NOREDRAW //列表框数据项发生改变时无法自动更新,但可以呼叫WS_SETREDRAW来更新
LBS_NOSEL //只能查看列表框数据项,无法选中
LBS_NOTIFY //当单击或双击列表框中的数据项时,通知父窗口
LBS_OWNERDRAWFIXED //用户设置列表框中的内容,数据项具有相同高度,可以通过WM_MEASUREITEM增加数据项,通过WM_DRAWITEM更新数据项
LBS_OWNERDRAWVARIABLE //与LBS_OWNERDRAWFIXED样式基本相对,但是其数据项高度是可变的
LBS_SORT //根据字母顺序给数据项排序
LBS_STANDARD //根据字母顺序给数据项排序,列表框具有边框,用户单击或双击时,父窗口接收输入消息
LBS_USETABSTOPS //允许用户通过Tap键来选择列表框中的数据项
LBS_TABSTOP //允许用户通过Tap键选中列表框

(六)COMBOBOX(组合框)样式介绍

 /* COMBOBOX(组合框)控件样式 */
CBS_AUTOHSCROLL //显示水平滚动条
CBS_DISABLENOSCROLL //组合框中数据项未超出时,也显示垂直滚动条
CBS_DROPDOWN //只显示组合框,点击下拉按钮后显示组合列表框
CBS_DROPDOWNLIST //显示组合框中选中的数据项
CBS_HASSTRINGS //组合框的数据项包含字符串,属于默认样式
CBS_LOWERCASE //将所有字符强制转换为小写
CBS_NOINTEGERALHEIGHT //在创建组合框时,设置组合框的大小
CBS_OEMCONVERT //
CBS_SORT //根据字母顺序给数据项排序
CBS_UPPERCASE //将所有字符强制转换为大写
WS_TABSTOP //允许用户通过Tap键选中组合框

(七)Windows窗口与常用控件样式实例应用

 #include <windows.h>

 #define     IDC_BS_USERNAMES        1000
#define IDC_BS_USERTELE 1001
#define IDC_SS_USERNAME 1002
#define IDC_ES_USERNAME 1003
#define IDC_SS_PASSWORD 1004
#define IDC_ES_PASSWORD 1005
#define IDC_BS_LOGIN 1006 /*button结构声明与赋值*/
struct
{
/* data */
TCHAR * szStruct ; //控件所属的预定义结构体
TCHAR * szCaption ; //控件名称
int iStyle ; //控件样式
int IDC ; //控件ID
}
controls [] =
{
TEXT ("BUTTON"), TEXT ("USERNAME"), WS_GROUP | BS_AUTORADIOBUTTON, IDC_BS_USERNAMES,
TEXT ("BUTTON"), TEXT ("USERTELE"), BS_AUTORADIOBUTTON, IDC_BS_USERTELE,
TEXT ("STATIC"), TEXT ("USERNAME:"), BS_LEFT, IDC_SS_USERNAME,
TEXT ("EDIT"), TEXT (""), WS_BORDER | ES_LEFT | ES_AUTOHSCROLL, IDC_ES_USERNAME,
TEXT ("STATIC"), TEXT ("PASSWORD:"), SS_LEFT, IDC_SS_PASSWORD,
TEXT ("EDIT"), TEXT (""), WS_BORDER | ES_LEFT | ES_AUTOHSCROLL | ES_PASSWORD, IDC_ES_PASSWORD,
TEXT ("BUTTON"), TEXT ("LOGIN"), BS_DEFPUSHBUTTON, IDC_BS_LOGIN
}; #define NUM (sizeof controls / sizeof controls[0]) LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ) ;
int CreateControls ( HWND, HWND *, LPARAM ) ; int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
{
static TCHAR szAppName[] = TEXT ( "Dome" ) ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.hInstance = hInstance ;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hbrBackground = ( HBRUSH ) ( COLOR_BTNFACE + ) ;
wndclass.hIcon = LoadIcon ( NULL, IDI_APPLICATION ) ;
wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW ) ;
wndclass.lpszClassName = szAppName ;
wndclass.lpszMenuName = NULL ; if ( !RegisterClass ( &wndclass ) )
{
MessageBox ( NULL, TEXT ("无法注册窗口类!"), TEXT ("错误"), MB_OK | MB_ICONERROR ) ;
} hwnd = CreateWindow ( szAppName, TEXT ("LOGINFRAME"),
WS_TABSTOP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
CW_USEDEFAULT, CW_USEDEFAULT,
, ,
NULL, NULL, hInstance, NULL ) ; ShowWindow ( hwnd, iCmdShow ) ;
UpdateWindow (hwnd) ; while ( GetMessage ( &msg, NULL, , ) )
{
TranslateMessage ( &msg ) ;
DispatchMessage ( &msg ) ;
} return msg.wParam ;
} LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
static HWND hControls [ NUM ] ;
static RECT rect ;
static int cxChar, cyChar ;
PAINTSTRUCT ps ;
HDC hdc ;
int i ; switch ( message )
{
case WM_CREATE:
CreateControls ( hwnd, hControls, lParam ) ; cxChar = LOWORD (GetDialogBaseUnits ()); //获得窗口中内定字体字元宽度(低字组)
cyChar = HIWORD (GetDialogBaseUnits ()); //获得窗口中内定字体字元高度(高字组)
return ;
case WM_SIZE:
GetClientRect ( hwnd, &rect ) ; MoveWindow ( hControls[ controls[].IDC ], , , , cyChar * / , TRUE ) ;
MoveWindow ( hControls[ controls[].IDC ], , , , cyChar * / , TRUE ) ;
MoveWindow ( hControls[ controls[].IDC ], , , , cyChar * / , TRUE ) ;
MoveWindow ( hControls[ controls[].IDC ], , , , cyChar * / , TRUE ) ;
MoveWindow ( hControls[ controls[].IDC ], , , , cyChar * / , TRUE ) ;
MoveWindow ( hControls[ controls[].IDC ], , , , cyChar * / , TRUE ) ;
MoveWindow ( hControls[ controls[].IDC ], , , , cyChar * / , TRUE ) ; return ; case WM_DESTROY:
PostQuitMessage () ;
return ;
} return DefWindowProc ( hwnd, message, wParam, lParam ) ;
} int CreateControls ( HWND hwnd, HWND * hControls, LPARAM lParam )
{
int i ;
HINSTANCE hInst = ( ( LPCREATESTRUCT ) lParam ) -> hInstance ; for ( i=; i<NUM; i++ )
hControls [ controls[i].IDC ] = CreateWindow (
controls[i].szStruct,
controls[i].szCaption,
controls[i].iStyle | WS_CHILD | WS_VISIBLE,
, , , ,
hwnd, (HMENU) controls[i].IDC, hInst, NULL) ;
return ;
}

运行结果:

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

代码说明:

(1)结构体controls[ ]说明

 /*结构体controls声明与赋值*/
struct
{
/* data */
TCHAR * szStruct ; //控件所属的预定义结构体
TCHAR * szCaption ; //控件名称
int iStyle ; //控件样式
int IDC ; //控件ID
}
controls [] =
{
TEXT ("BUTTON"), TEXT ("USERNAME"), WS_GROUP | BS_AUTORADIOBUTTON, IDC_BS_USERNAMES,
TEXT ("BUTTON"), TEXT ("USERTELE"), BS_AUTORADIOBUTTON, IDC_BS_USERTELE,
TEXT ("STATIC"), TEXT ("USERNAME:"), BS_LEFT, IDC_SS_USERNAME,
TEXT ("EDIT"), TEXT (""), WS_BORDER | ES_LEFT, IDC_ES_USERNAME,
TEXT ("STATIC"), TEXT ("PASSWORD:"), SS_LEFT, IDC_SS_PASSWORD,
TEXT ("EDIT"), TEXT (""), WS_BORDER | ES_LEFT | ES_PASSWORD, IDC_ES_PASSWORD,
TEXT ("BUTTON"), TEXT ("LOGIN"), BS_DEFPUSHBUTTON, IDC_BS_LOGIN
};

<1>在创建多个单选按钮时,同时,这些单选按钮有且只能选择1个,那么就需要在第1个单选按钮的样式中添加WS_GROUP样式,表示从这个单选按钮开始直到遇到下1个WS_GROUP样式,这些单选按钮都属于同一组,在选取其中一个单选按钮时,其它选中的单选按钮会自动清除;

<2>在创建的EDIT文本框的样式中添加ES_PASSWORD样式,表示该文本框是密码输入框,默认掩码为“*”;

<3>在主函数WinMain之前,声明结构体controls[ ]并赋值,利用for循环实现控件创建,能够有效减少重复代码,缩减代码行数;

<4>如果需要增加控件数目,则可以直接在结构体controls[ ]声明与赋值时添加,而不需要修改CreateControls函数;

(2)MoveWindow函数说明

 BOOL MoveWindow(          //窗口或控件尺寸调整函数
HWND hWnd, //要调整尺寸的控件句柄
int X, //控件左上角(X,Y)坐标的X值
int Y, //控件左上角(X,Y)坐标的Y值
int nWidth, //控件宽度
int nHeight, //控件高度
BOOL bRepaint //是否按照以上尺寸重绘控件,TRUE表示重绘
);

在设置控件位置与尺寸时,可以根据已经设计好的尺寸直接填写,也可以根据利用相对位置进行计算得到;

提示:在进行窗口设计时,也可以通过在资源文档中DIALOG对话方块来实现控件的创建,具体实现见明天的实例介绍。

上一篇:体验usually.js的管道函数——pipe函数


下一篇:Unable to create requested service org.hibernate.cache.spi.RegionFactory