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","这是编辑框,\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标准控件的更多相关文章
- Windows窗体应用开发3--配置标准控件1
1.掌握主要的Windows窗体控件的功能 2.掌握使用SplitContainer控件的方法 3.掌握使用TreeView控件的方法 注:新建一个WindowsForm 命名为Form2.cs 主要 ...
- KRBTabControl(中文)Windows选项卡控件
本文阐述了如何在C#使自定义Windows选项卡控件. Download demo project - 82.4 KB Download source - 252 KB 介绍 本文讨论如何使用.NET ...
- 如何:对 Windows 窗体控件进行线程安全调用
http://msdn.microsoft.com/zh-cn/library/ms171728(VS.90).aspx http://msdn.microsoft.com/zh-cn/library ...
- 用于列出选项的Windows窗体控件
可以提供选项列表的控件有ListBox.ComboBox.CheckedListBox,如何正确的使用和选择这些控件,下面对此进行讨论.首先对这三种控件的功能分别进行说明: ListBox ListB ...
- c#中跨线程调用windows窗体控件
c#中跨线程调用windows窗体控件解决. 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来 ...
- Delphi一共封装(超类化)了8种Windows基础控件和17种复杂控件
超类化源码: procedure TWinControl.CreateSubClass(var Params: TCreateParams; ControlClassName: PChar); con ...
- c#中如何跨线程调用windows窗体控件
c#中如何跨线程调用windows窗体控件? 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...
- 如何跨线程调用Windows窗体控件
通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它.那么,如何解决跨 ...
- [UE4]继承标准控件
可以继承自标准控件的自定义控件中把常用的方法封装,比如设置字体大小: 调用自定义控件的自定义函数 还可以继续创建子蓝图控件
随机推荐
- leetcode 120. 三角形最小路径和 JAVA
题目: 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和 ...
- django 实现全局支持跨域请求
Django 实现允许跨域请求 1.安装django-cors-headers pip install django-cors-headers 2.配置settings.py文件 INSTALLED_ ...
- sql语句应考虑哪些安全性?
(1)少使用root账户,应该为不同的动作分配不同的账户: (2)sql执行出错后,不能把数据库中显示的出错信息,直接展示给用户.防止泄露服务器和数据库相关信息: (3)防止sql注入,对特殊字符进行 ...
- [CSS3] 几种分割线实现方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- objc_msgSend 作用
C 的函数调用方式 C 语言使用静态绑定,即在编译器就可以决定运行时所应调用的函数. 编译器在编译代码的时候就已经知道程序中有相应的函数,并直接生成调用函数的指令.函数地址硬编码在指令之中. OC 中 ...
- 手机端布局,rem布局动态获取根字体大小
手机端布局,rem布局动态获取根字体大小. 以下代码: //rem布局动态获取根字体大小 function remDynamicLayout(){ var $windowWidth = $(windo ...
- Maven与Hudson集成
Hudson是一款优秀的持续集成产品,本文阐述Maven于Hudson的集成 Hudson的下载和安装 Hudson有两种安装模式,1:自运行(Hudson内建netty容器),2:放到如tomc ...
- Win7中安装EclipsePHP
1. 安装WarmServer(一键式安装apache+php+mysql); 2. 将安装后的EclipsePHP工作目录workspace指向WarmServer安装目录下的www目录下即可 异常 ...
- 初始JAVA中浅拷贝和深拷贝
1. 简单变量的复制 public static void main(String[] args) { int a = 5; int b = a; System.out.println(a); Sys ...
- alloca() 是什么?为什么不提倡使用它?
在调用 alloca() 的函数返回的时候, 它分配的内存会自动释放.也就是说, 用 alloca 分配的内存在某种程度上局部于函数的 ``堆栈帧" 或上下文中. alloca() 不具可 ...





