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

时间: 2024-10-07 17:46:11

Windows标准控件的相关文章

深入浅出CChart 每日一课——必也正名,Win32标准控件ChartCtrl之初识

各位用过CChart的小伙伴们,笨笨的这个控件还算好使吧. 慢着,慢着,让我想想,CChart是一个控件吗?好像顶多就是一个类库吧,根本就不是正儿八经的控件. 呵呵,本节课就给大家介绍一下CChart怎么作为一个Windows标准控件来使用. 还是按前面的规矩吧. 第一步,建立一个基于对话框的MFC程序LessonA12. 第二步,在LessonA12.h文件的头部加入CChart头文件和函数库的引用. 第三步,在主对话框中删除掉原来那个标签,并添加一个Custom Control控件.设置其I

在DXScene中加入标准控件

DXScene里面只能加入它自己定义的Object对象,不能增加其他的控件到它的布局中,请问有什么办法可以加入比如StringGrid之内的其他控件到DXScene的布局空间 可以绑定的,有一个叫 TvgNonVGLayout layout菜单里  设置NonVGControl为StringGrid,StringGrid就可以随着TvgNonVGLayout的显示而显示,随着它的大小而变化了 可是当vgScene设置成透明之后,非vgScene的控件就显示不出来了,包括在NonVGControl

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

可以提供选项列表的控件有ListBox.ComboBox.CheckedListBox,如何正确的使用和选择这些控件,下面对此进行讨论.首先对这三种控件的功能分别进行说明: ListBox ListBox用于显示项列表,用户可以从中选择一项或多项.如果项目总数超出可以显式的项目数,则ListBox会自动添加滚动条.当MultiColumn属性为true时,列表框以多列形式显示条目,并且会出现一个水平滚动条.当MultiColumn为false时,列表框以单列形式显示条目,并且会出现一个垂直滚动条

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

通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它.那么,如何解决跨线程调用Windows窗体控件呢?可以用线程委托实现跨线程调用Windows窗体控件.下面将上一个例子进行一下改动.代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using Sys

DrawFrameControl 绘制标准控件

BOOL DrawFrameControl( HDC hDC,        // 设备环境句柄    LPRECT lpRect,  // 矩形区域    UINT nType,     // 控件类型    UINT nState     // 控件状态); // 控件类型 uType 参数 DFC_CAPTION   = 1; // 标题DFC_MENU      = 2; // 菜单DFC_SCROLL    = 3; // 滚动条DFC_BUTTON    = 4; // 标准按钮DF

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

超类化源码: procedure TWinControl.CreateSubClass(var Params: TCreateParams; ControlClassName: PChar); const {CS_OWNDC标志,属于此窗口类的窗口实例都有自己的DC(称为私有DC) } {CS_CLASSDC标志,所有属于该类的窗口实例共享相同的DC(称为类DC).类DC有一些私有DC的优点,而更加节约内存} {CS_PARENTDC标志,属于这个类的窗口都使用它的父窗口的句柄.和CS_CLAS

Workflow_标准控件Wait_For_Flow和Contiune_Flow的用法(案例)

2014-06-04 BaoXinjian 一.汇总 1. 设定Wait_For_Flow 2. Contiune_Flow的属性 3. 分步测试 二.分部解析 1. 设定Wait_For_Flow 的Continuation Activity为ContiuneFlow 2. 设定ContiuneFlow 的WaitingFlow为Wait_For_Flow 3. 分步测试 3.1 启动Workflow,程式停留在Wait_For_Flow中,等待设定的activity的状态 3.2 系统停留在

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

c#中跨线程调用windows窗体控件解决. 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thre

[UE4]继承标准控件

可以继承自标准控件的自定义控件中把常用的方法封装,比如设置字体大小: 调用自定义控件的自定义函数 还可以继续创建子蓝图控件 原文地址:https://www.cnblogs.com/timy/p/9142640.html