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

  • 相关阅读:
    基于多传感器的物联网报警器解决方案市场调研摘要
    物联网声光报警器解决方案技术特色解析
    开始找工作了
    失业的第33天
    策略模式在应用中的实践
    接口的所有权之争
    如何优雅的使用MyBatis?
    一文get到SOLID原则的重点
    微服务的故障处理
    Apache Hudi 源码分析 HoodieTableSource
  • 原文地址:https://www.cnblogs.com/petrol/p/9813550.html
Copyright © 2020-2023  润新知