zoukankan      html  css  js  c++  java
  • Windows标准控件

    学习目的

    学习创建, 使用Windows标准控件(按钮, 滚动条, 静态控件, 列表框, 编辑框, 组合框); 学习使用子窗口控件操作函数(EnableWindow, MoveWindow, SetWindowText, GetWindowText, DestroyWindow).

    编写程序: 设计窗口应用程序, 分别包含按钮, 滚动条, 静态控件, 列表框, 编辑框, 组合框.等标准控件.

    1. 创建按钮控件

    创建子窗口时指定窗口类为button.代码如下:

    //创建按钮

                    CreateWindow("button",//必须为:button

    "向上滚动",//按钮上显示的字符

    WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,

    35, rt.top+10, 120, 60,

    hWnd, (HMENU)IDB_ONE,

    ((LPCREATESTRUCT)lParam)->hInstance,NULL);

     

    2.创建滚动条控件

    在创建窗口函数的第三个参数中添加WS_HSCROLL,WS_VSCROLL分别添加垂直和水平滚动条,代码如下:

    hWnd = CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

     

    3. 创建静态控件

    创建子窗口时指定窗口类为static.代码如下:

    //创建静态控件

                    CreateWindow("static","这是静态控件",WS_VISIBLE|WS_CHILD,

                        200,rt.top+20,100,50,

                        hWnd,NULL,((LPCREATESTRUCT)lParam)->hInstance,NULL);

    4. 创建列表框控件

    创建子窗口时指定窗口类为listbox.代码如下:

    //创建列表框

            hWndList=CreateWindow("listbox",NULL,LBS_NOTIFY|WS_CHILD | WS_VISIBLE | LBS_STANDARD,

            200,(rt.bottom+rt.top)/2-100,200,200,

            hWnd,NULL,((LPCREATESTRUCT)lParam)->hInstance,NULL);

            SendMessage (hWndList, LB_ADDSTRING, 0, (LPARAM) "我是列表框") ;

    5. 创建编辑框控件

    创建子窗口时指定窗口类为edit.代码如下:

    //创建编辑框

    CreateWindow ("edit","这是编辑框, 这是编辑框, 这是编辑框,这是编辑框,这是编辑框,这是编辑框,这是编辑框,这是编辑框, 这是编辑框, 这是编辑框, 这是编辑框, 这是编辑框",

        WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |

        WS_BORDER | ES_LEFT | ES_MULTILINE |

        ES_AUTOHSCROLL | ES_AUTOVSCROLL,

        200, rt.bottom-120, 220, 100, hWnd, NULL,

        ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;

     

    6. 创建组合框控件

    创建子窗口时指定窗口类为combobox.代码如下:

    //创建组合框

    hWndComboBox=CreateWindow("combobox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS,

        rt.right -300, 20, 200, 400, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL);

    SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)"我是列表框");

    for (i=0;i<=50;i++)

        {

            char temp[10];

            SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)itoa(i,temp,10));

        }

    7. 滚动条的事件处理

    在WM_VSCROLL中处理滚动条的消息,代码如下

    case WM_VSCROLL:

                switch (LOWORD (wParam))

                {

                case SB_LINEUP:

                iVscrollPos -= 1 ;

                break ;

     

            case SB_LINEDOWN:

                iVscrollPos += 1 ;

                break ;

     

            case SB_PAGEUP:

                iVscrollPos -= cyClient / cyChar ;

                break ;

     

            case SB_PAGEDOWN:

                iVscrollPos += cyClient / cyChar ;

                break ;

     

            case SB_THUMBPOSITION:

                iVscrollPos = HIWORD (wParam) ;

                break ;

     

            default :

                break ;

                }

                iVscrollPos = max (0, min (iVscrollPos, NUMLINES-1)) ;

                if (iVscrollPos != GetScrollPos (hWnd, SB_VERT))

                {

                    SetScrollPos (hWnd, SB_VERT, iVscrollPos, TRUE) ;

                    InvalidateRect (hWnd, NULL, TRUE) ;

                }

                break;

    8. 按钮控件的事件处理

    同主窗口菜单一样,在WM_COMMAND中处理按钮控件的消息,代码如下

     

    case WM_COMMAND:

                wmId = LOWORD(wParam);

                wmEvent = HIWORD(wParam);

                // Parse the menu selections:

                switch (wmId)

                {

                    case IDM_ABOUT:

                     DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);

                     break;

                    case IDM_EXIT:

                     DestroyWindow(hWnd);

                     break;

     

                     case IDB_ONE:

                         iVscrollPos++;

                         //MessageBox(hWnd, "您点击了第一个按钮。", "提示", MB_OK | MB_ICONINFORMATION);

                         break;

                     case IDB_TWO:

                         iVscrollPos--;

                         //MessageBox(hWnd, "您点击了第二个按钮。", "提示", MB_OK |MB_ICONINFORMATION);

                         break;

                     case IDB_THREE:

                            itoa(iVscrollPos, szList, 10);

                         //SendMessage (hWndList, LB_RESETCONTENT, 0, 0) ;

                         SendMessage (hWndList, LB_INSERTSTRING, -1, (LPARAM)    szList) ;

                         //MessageBox(hWnd, "这个按钮没有功能。", "提示", MB_OK |MB_ICONINFORMATION);

                         break;

                    default:

                     return DefWindowProc(hWnd, message, wParam, lParam);

                }

    9. 向列表框和组合框中添加数据条目

    向相应控件发送消息来向其中添加数据,代码如下

    //向列表框中添加数据

    SendMessage (hWndList, LB_ADDSTRING, 0, (LPARAM) "我是列表框") ;

    //向组合框中添加数据

    SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)"我是组合框");

     

    10.启用、禁用窗口控件

    使用EnableWindow()函数启用与禁用窗口控件,具体代码如下:

    case IDB_ENWIN:

                         if(IsCbBoxEnable==true)

                         {

                             EnableWindow(hWndComboBox,false);

                             IsCbBoxEnable=false;

                             SetWindowText(GetDlgItem(hWnd,IDB_ENWIN),"启用组合框->");

                         }

                         else

                         {

                             EnableWindow(hWndComboBox,true);

                             IsCbBoxEnable=true;

                             SetWindowText(GetDlgItem(hWnd,IDB_ENWIN),"禁用组合框->");

                         }

                         break;

    11.调整控件位置与大小

    使用MoveWindow()函数调整控件位置与大小,具体代码如下:

    case IDB_MOVWIN:

    GetWindowRect(hWndComboBox, &CbBoxRECT);

                         MoveWindow( hWndComboBox,750,CbBoxRECT.top,CbBoxRECT.right-CbBoxRECT.left+30, 400, true );

    break;

    12.控件文字的设置与获取

    使用GetWindowText()函数与SetWindowText()函数获取与设置控件文字,具体代码如下:

    case IDB_GETWINTEXT:

                         TCHAR editString[MAX_LOADSTRING];

                         //GetWindowText(hWndEdit,editString,MAX_LOADSTRING);

                         GetWindowText(hWndComboBox,editString,MAX_LOADSTRING);

                         SetWindowText(GetDlgItem(hWnd,IDB_GETWINTEXT),editString);

                         break;

    13.销毁控件

    使用DestroyWindow()函数获取与设置控件文字,具体代码如下:

    case IDB_DESWIN:

                         DestroyWindow(hWndComboBox);

                         break;

     

    14. 绘制窗口

    在WM_PAINT中绘制窗口,通过改变视口坐标来达到滚动的效果,代码如下

    case WM_PAINT:

                hdc = BeginPaint(hWnd, &ps);

                // TODO: Add any drawing code here...

                RECT rt;

                GetClientRect(hWnd, &rt);

                SetMapMode(hdc,MM_ANISOTROPIC);

                SetViewportOrgEx(hdc,0,rt.bottom -iVscrollPos*5 ,NULL);

                DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);

                TextOut(hdc,300,500,szHello, strlen(szHello));

                

                

                EndPaint(hWnd, &ps);

                break;

    编译并调试程序

    程序运行结果运行结果如下图:

    程序运行初始状态

     

    操作滚动条或点击按钮使文字滚动,打开组合框

     

    禁用组合框

     

    启用并移动组合框,改变组合框宽度

     

    改变组合框文字,获取组合框当前文字并显示在按钮上

     

    销毁组合框,再次获取组合框文字,此时为空

     

    本次只处理了垂直滚动条的事件响应,水平滚动条事件处理方式与此相同,操作重复,暂未做处理。

    在Windows中,控件其实也是窗口,可以像处理窗口一样处理控件。

    做完本次实验感觉Windows中使用纯代码创建控件的方式不是很方便,习惯了Windows在可视化环境下以所见即所得方式创建控件,win32这种方式实在是不适应。而且不能理解的是为什么win32对话框窗口中可以使用可视化方式创建控件,在主窗口中却不能使用这种方式。

  • 相关阅读:
    《挑战程序设计竞赛》 一二章部分代码题解
    动态规划之矩阵连乘和POJ 1651
    关于图片的重绘,从而进行压缩
    iOS开发:读取pdf文件
    如何改变tableview的section的颜色
    端口的作用
    Mac 下,配置SVN
    cocoaPods 的安装和使用
    关于如何调用苹果自带的地图APP
    关于 HTTP 请求头的内容
  • 原文地址:https://www.cnblogs.com/leftshine/p/5698638.html
Copyright © 2011-2022 走看看