学习目的

学习创建, 使用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","这是编辑框,\r\n这是编辑框,\r\n这是编辑框,这是编辑框,这是编辑框,这是编辑框,这是编辑框,这是编辑框,\r\n这是编辑框,\r\n这是编辑框,\r\n这是编辑框,\r\n这是编辑框",

    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对话框窗口中可以使用可视化方式创建控件,在主窗口中却不能使用这种方式。

Windows标准控件的更多相关文章

  1. Windows窗体应用开发3--配置标准控件1

    1.掌握主要的Windows窗体控件的功能 2.掌握使用SplitContainer控件的方法 3.掌握使用TreeView控件的方法 注:新建一个WindowsForm 命名为Form2.cs 主要 ...

  2. KRBTabControl(中文)Windows选项卡控件

    本文阐述了如何在C#使自定义Windows选项卡控件. Download demo project - 82.4 KB Download source - 252 KB 介绍 本文讨论如何使用.NET ...

  3. 如何:对 Windows 窗体控件进行线程安全调用

    http://msdn.microsoft.com/zh-cn/library/ms171728(VS.90).aspx http://msdn.microsoft.com/zh-cn/library ...

  4. 用于列出选项的Windows窗体控件

    可以提供选项列表的控件有ListBox.ComboBox.CheckedListBox,如何正确的使用和选择这些控件,下面对此进行讨论.首先对这三种控件的功能分别进行说明: ListBox ListB ...

  5. c#中跨线程调用windows窗体控件

    c#中跨线程调用windows窗体控件解决. 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来 ...

  6. Delphi一共封装(超类化)了8种Windows基础控件和17种复杂控件

    超类化源码: procedure TWinControl.CreateSubClass(var Params: TCreateParams; ControlClassName: PChar); con ...

  7. c#中如何跨线程调用windows窗体控件

    c#中如何跨线程调用windows窗体控件?   我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...

  8. 如何跨线程调用Windows窗体控件

    通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它.那么,如何解决跨 ...

  9. [UE4]继承标准控件

    可以继承自标准控件的自定义控件中把常用的方法封装,比如设置字体大小: 调用自定义控件的自定义函数 还可以继续创建子蓝图控件

随机推荐

  1. session和cookie的异同

    Cookie是服务器发给客户端的一小段文本,保存在浏览器所在客户端的内存和磁盘上.服务器可以从客户端读出这些cookie.通过cookie,客户端可以和服务器端建立起一种联系,也就是说,Cookie是 ...

  2. POI2014 RAJ-Rally

    Description 给定一个\(N\)个点\(M\)条边的\(DAG(N,M\leq10^6)\),边权为\(1\).删去一个点,使剩余图中的最长路径最短,求删去的点和最长路径长度. Soluti ...

  3. ssh 登陆 端口转发

    man ssh ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] ...

  4. Flask从入门到精通之大型程序的结构一

    尽管在单一脚本中编写小型Web 程序很方便,但这种方法并不能广泛使用.程序变复杂后,使用单个大型源码文件会导致很多问题.不同于大多数其他的Web 框架,Flask 并不强制要求大型项目使用特定的组织方 ...

  5. [Swift实际操作]七、常见概念-(4)范围CGRect的使用详解

    本文将为你演示区域对象CGRect的使用.你可以将区域对象,看作是点对象和尺寸对象的组合 首先导入需要使用到底界面工具框架 import UIKit 然后初始化一个区域对象,它的原点位于(0,0),宽 ...

  6. 使用git工具将本地电脑上的代码上传至GitHub

    本文教你如果使用git工具将本地电脑上的代码上传至GitHub 1.安装git工具 安装git链接 2.使用git工具上传自己的代码到GitHub中 安装完git工具之后,我们会得到两个命令行工具,一 ...

  7. 【PKUSC2018】【loj6433】最大前缀和 状压dp

    这题吼啊... 然而还是想了$2h$,写了$1h$. 我们发现一个性质:若一个序列$p$能作为前缀和,那么在序列$p$中,包含序列$p$最后一个数的所有子序列必然都是非负的. 那么,我们 令$f[i] ...

  8. QuantLib 金融计算——高级话题之模拟跳扩散过程

    目录 QuantLib 金融计算--高级话题之模拟跳扩散过程 跳扩散过程 模拟算法 面临的问题 "脏"的方法 "干净"的方法 实现 示例 参考文献 如果未做特别 ...

  9. document文档对象

    document 文挡对象 - JavaScript脚本语言描述———————————————————————注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写否则会提示你一 ...

  10. Web开发常用在线工具

    http://tool.oschina.net/ 爬去网页工具: http://www.keydatas.com/product