《Windows API 每日一练》8.4 edit控件

编辑类是最简单的预定义窗口类,而另一方面却又是最复杂的。当你用“edit”作为类名创建子窗口时,可以基于CreateWindow调用的x坐标、y坐标、宽度和高度参数定义一个矩形。这个矩形包含可编辑的文本。一旦子窗口控件获得输入焦点,你就可以输入文本,移动光标,使用鼠标或Shift键和光标键选择部分文本,按快捷键 Ctrl - X删除选中的文本并将其放入剪贴板中,按快捷键Ctrl - C复制文本,按快捷键Ctrl - V 从剪贴板粘贴文本。

本节必须掌握的知识点:

        编辑类

        第53练:编辑控件

8.4.1 编辑类

       ■编辑类的样式

编辑类窗口(Edit Control)是用于接收和显示文本输入的窗口控件。可以使用样式设置来改变编辑类窗口的外观和行为。

以下是一些常用的编辑类窗口样式:

ES_LEFT:文本左对齐(默认)。

ES_CENTER:文本居中对齐。

ES_RIGHT:文本右对齐。

ES_MULTILINE:多行编辑框,允许输入多行文本。

ES_READONLY:只读模式,禁止编辑。

ES_PASSWORD:密码模式,输入的文本以密码字符显示。

ES_NUMBER:数字模式,只允许输入数字。

ES_AUTOHSCROLL:自动水平滚动,当文本超出控件宽度时自动水平滚动。

ES_AUTOVSCROLL:自动垂直滚动,当文本超出控件高度时自动垂直滚动。

ES_WANTRETURN:希望回车键产生换行效果,适用于多行编辑框。

这些样式可以通过在创建编辑类窗口时使用 CreateWindowEx 或 CreateWindow 函数的 dwStyle 参数来设置。例如:

HWND hEdit = CreateWindowEx(

    0,                      // 扩展窗口样式

    L"EDIT",                  // 窗口类名

    L"Sample Text",            // 窗口标题(初始文本)

    WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,  // 窗口样式

    x, y, width, height,            // 窗口位置和尺寸

    hWndParent,             // 父窗口句柄

    (HMENU)IDC_EDIT,        // 控件标识符

    hInstance,                 // 应用程序实例句柄

    NULL                   // 创建参数

);

在上述示例中,我们创建了一个编辑类窗口,并设置了一些常用的样式,如可见、子窗口、带边框和左对齐。可以根据需求自由组合和设置其他样式。

除了创建时设置样式,还可以使用 SetWindowLongPtr 或 SetWindowLongPtr 函数来动态修改编辑类窗口的样式。例如:

DWORD dwStyle = GetWindowLongPtr(hEdit, GWL_STYLE);

dwStyle |= ES_READONLY;  // 设置只读样式

SetWindowLongPtr(hEdit, GWL_STYLE, dwStyle);

在上述示例中,我们首先获取编辑类窗口的当前样式,然后通过按位或运算符将 ES_READONLY 样式添加到样式中,最后使用 SetWindowLongPtr 函数设置新的样式。

需要注意的是,应在窗口创建之前或之后进行样式修改。有些样式只能在创建时设置,而有些样式可以在创建后动态修改。

编辑控件的通知消息

编辑控件向其父窗口过程发送WM_COMMAND消息。相应的wParam和IParam变量的含义与其在按钮控件中的含义一致:

LOWORD (wParam)     子窗口 ID

HIWORD (wParam)      通知码

IParam    子窗口句柄

通知码如下所示:      

EN_SETFOCUS      编辑控件得到了输入焦点

ENJ_KILLFOCUS    编辑控件失去了输入焦点

EN_CHANGE         编辑控件的内容将变化

EN_UPDATE          编辑控件的内容已变化

EN_ERRSPACE       编辑控件没有空间了

EN_MAXTEXT        编辑控件没有空间完成插入了

EN_HSCROLL        编辑控件水平滚动条被单击了

EN_VSCROLL        编辑控件垂直滚动条被单击了

使用编辑控件

如果在主窗口上使用了多个单行编辑控件,则需要利用窗口子类来将输入焦点从一个 控件移到另一个控件。这可以通过拦截Tab和Shifl-Tab击键来完成,就和COLORS 1程序 一样。(另一个窗口子类的例子会在本章稍后的HEAD程序中讨论* )如何处理回车键由你 自己决定。可以使用和处理Tab键相同的方式,或将其作为一个信号传递给程序,通知程 序所有的编辑框已经准备就绪。

如果要把文本插入编辑框,可以使用SetWindowText函数。从编辑控件中读取文本涉 及调用GetWindowTextLength和GetWindowText。我们会在以后改进的POPPAD版本中看见一些这方面的实例。

传递给编辑控件的消息

可以使用SendMessage发送给编辑控件的消息,因为这些消息太多了,下面是一个概括的介绍。

●下面这些消息可以让你剪切、复制或清除当前选择的内容。用户可以使用鼠标或Shift 键加光标键来选择需要的文本,从而高亮显示编辑控件中所选的文本:

SendMessage (hwndEdit, WM_CUT, 0, 0);

SendMessage (hwndEdit, WM_COPY, 0, 0) ;

SendMessage (hwndEdit, WM_CLEAR, 0, 0);

WM_CUT把当前选择从编辑控件中移走并发送给剪贴板。WM_COPY把当前选择从编辑 控件_中复制到剪贴板并保留在原地。WM_CLEAR把当前选择从编辑控件中删除并且不传递给剪貼板。

还可以把剪貼板上的文本插入到编辑控件的当前位置:

SendMessage (hwndEdit, WM_PASTE, 0, 0);

●可以用如下函数获得当前选择文本的初始位置和终止位置:

SendMessage (hwndEdit, EM_GETSEL, (WPARAM) &iStart, (LPARAM) &iEnd) ;

终止位置其实是你选择的最后一个字符的位置加1。

●可以如下选择文本:

SendMessage (hwndEdit, EM_SETSEL, iscart, iEnd);

也可以用其他文本取代当前选择的文本:

SendMessage (hwndEdit, EM_REPLACESEL, 0, (LPARAM) szString);

●对于多行编辑器,可以如下得到编辑器的行数:

iCount = SendMessage (hwndEdit,EM_GETLINECOUNT, 0, 0);

●对于某一个指定的行,可以获得从编辑缓冲区的起点到这行的位移量:

iOffset = SendMessage (hwndEdit, EM_LINEINDEX, iLine, 0) ;

行从0开始计数。如果传入-1给iLine,可以返回插入符号所在行的位移量。如下可得到行的长度:

iLength = SendMessage (hwndEdit, EM_LINELENGTH, iLine, 0);

●可以用如下函数来复制某行到缓冲区:

iLength = SendMessage (hwndEdit, EM_GETLINE, iLine, (LPARAM) szBuffer);

8.4.2 第53练:编辑控件

/*------------------------------------------------------------------

053  WIN32 API 每日一练

     第53个例子POPPAD1.C:编辑控件

     创建编辑控件

     WM_COMMAND消息处理

(c) www.bcdaren.com, 2020

----------------------------------------------------------------*/

#include <windows.h>

#define ID_EDIT 1

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

TCHAR szAppName[] = TEXT ("PopPad1") ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

 PSTR szCmdLine, int iCmdShow)

{

     HWND hwnd;

    (略)

     return msg.wParam;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM

lParam)

{

     static HWND hwndEdit;

     switch (message)

     {

     case WM_CREATE:

          hwndEdit = CreateWindow(TEXT("edit"),NULL,

               WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL |

               WS_BORDER | ES_LEFT | ES_MULTILINE |

               ES_AUTOHSCROLL | ES_AUTOVSCROLL,

               0, 0, 0, 0, hwnd, (HMENU)ID_EDIT,

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

//输入的最大文本量(TCHAR)默认大小32,767 个字符(包括空字符)

          SendMessage(hwndEdit,EM_SETLIMITTEXT,0,1);

          return 0;

     case WM_SETFOCUS:

          SetFocus(hwndEdit);//设为焦点

          return 0;

     case WM_SIZE:

//重新绘制编辑框

          MoveWindow(hwndEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);

          return 0;

     case WM_COMMAND:

          if (LOWORD(wParam) == ID_EDIT)

          {//编辑控件中输入的文本量的默认限制为32,767 个字符(包括空字符)。

//应用程序可以通过发送 _ SETLIMITTEXT 消息的控件来更改默认限制。

               if (HIWORD(wParam) == EN_ERRSPACE || HIWORD(wParam)

== EN_MAXTEXT)//已满

               {

                    MessageBox(hwnd,TEXT("Edit control out of space."),

                    szAppName,MB_OK | MB_ICONSTOP);

               }

          }

          return 0;

     case WM_DESTROY:

          PostQuitMessage(0);

          return 0;

     }

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

}

/******************************************************************************

创建编辑控件

hwndEdit = CreateWindow(TEXT("edit"), NULL,

     WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |

     WS_BORDER | ES_LEFT | ES_MULTILINE |

     ES_AUTOHSCROLL | ES_AUTOVSCROLL,

     0, 0, 0, 0, hwnd, (HMENU)ID_EDIT,

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

窗口样式是WS_CHILD,外加几个选项。和在静态子窗口控件中一样,

编辑控件中的文本也可以左对齐、右对齐或居中。

这些格式可以通过ES_LEFT, ES_RIGHT或ES_CENTER窗口样式来指定。

ES_MULTILINE:创建一个多行编辑控件

ES_AUTOHSCROLL:自动水平滚动

ES_AUTOVSCROLL:自动垂直滚动

*******************************************************************************

WM_COMMAND消息处理

//字符已满情形的处理

if (LOWORD(wParam) == ID_EDIT)

   if (HIWORD(wParam) == EN_ERRSPACE || HIWORD(wParam) == EN_MAXTEXT)//空间不足

          MessageBox(hwnd, TEXT("Edit control out of space."),

               szAppName, MB_OK | MB_ICONSTOP);

*/

       运行结果:

图8-6 编辑控件

 

总结

       实例POPPAD1.C非常简单。窗口过程处理WM_CREATE消息时,创建一个”edit”控件,窗口样式为WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL。接着调用SendMessage向编辑控件发送一个EM_SETLIMITTEXT消息,设置编辑控件输入最大字符数为默认值32767个字符。

       WM_SETFOCUS消息:调用SetFocus函数将焦点交给编辑控件。

       WM_SIZE消息:调整编辑控件大小。

       WM_COMMAND消息:WM_COMMAND消息参数wParam低字为控件ID,高字为控件通知码。如果通知码为EN_ERRSPACE 或 EN_MAXTEXT时,表示空间不足或者超出最大输入字符数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/370784.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(南京观海微电子)——MOS管原理及应用区别

MOS管&#xff1a; 全称为金属氧化物半导体场效应管&#xff08;Metal Oxide Semiconductor Field Effect Transistor&#xff09;&#xff0c;也被称为MOSFET&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;。它是一种半导体器件&#xff0c;常用…

【PB案例学习笔记】-27制作一个控制任务栏显示与隐藏的小程序

写在前面 这是PB案例学习笔记系列文章的第27篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

240706_昇思学习打卡-Day18-基于MindSpore的GPT2文本摘要

240706_昇思学习打卡-Day18-基于MindSpore的GPT2文本摘要 今天做一个根据一段文章提取摘要的提取器&#xff0c;基于nlpcc2017摘要数据&#xff0c;内容为新闻正文及其摘要&#xff0c;就是训练集及标签。 首先我们来预装以下MindSpore环境 %%capture captured_output # 实验…

vb.netcad二开自学笔记2:认识vs编辑器

认识一下宇宙第一编辑器的界面图标含义还是很重要的&#xff0c;否则都不知道面对的是什么还怎么继续&#xff1f; 一、VS编辑器中常见的图标的含义 变量 长方体&#xff1a;变量 局部变量 两个矩形块&#xff1a;枚举 预定义的枚举 紫色立方体&#xff1a;方法 橙色树状结构…

数据结构——二叉树相关题目

1.寻找二叉树中数值为x的节点 //寻找二叉树中数值为x的节点 BTNode* TreeFind(BTNode* root, BTDataType x)//传过来二叉树的地址和根的地址&#xff0c;以及需要查找的数据 {if (root Null){return Null;}//首先需要先判断这个树是否为空&#xff0c;如果为空直接返回空if (…

筛选Github上的一些优质项目

每个项目旁都有标签说明其特点&#xff0c;如今日热捧、多模态、收入生成、机器人、大型语言模型等。 项目涵盖了不同的编程语言和领域&#xff0c;包括人工智能、语言模型、网页数据采集、聊天机器人、语音合成、AI 代理工具集、语音转录、大型语言模型、DevOps、本地文件共享…

《Programming from the Ground Up》阅读笔记:p19-p48

《Programming from the Ground Up》学习第2天&#xff0c;p19-p48总结&#xff0c;总计30页。 一、技术总结 1.object file p20, An object file is code that is in the machine’s language, but has not been completely put together。 之前在很多地方都看到object fi…

IDEA中使用Maven打包及碰到的问题

1. 项目打包 IDEA中&#xff0c;maven打包的方式有两种&#xff0c;分别是 install 和 package &#xff0c;他们的区别如下&#xff1a; install 方式 install 打包时做了两件事&#xff0c;① 将项目打包成 jar 或者 war&#xff0c;打包结果存放在项目的 target 目录下。…

C++_STL---list

list的相关介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 list的底层是带头双向循环链表结构&#xff0c;链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。…

Google重大更新--解读Android Auto认证4.3

Google在今年五月更新了Android Auto 4.2.2版本&#xff0c;而在2024年7月他们推出了Android Auto 4.3版本&#xff0c;这是自2023年9月以来对Android Auto 4.2版本的一次重大更新。 为了确保合规性和顺利认证&#xff0c;OEM和Tire1必须确保PDK组件版本与正在认证的主机的Rece…

Docker学习笔记(二)镜像、容器、仓库相关命令操作

一、docker镜像操作 列出镜像列表 我们可以使用 docker images 来列出本地主机上的镜像。 各个选项说明: REPOSITORY&#xff1a;表示镜像的仓库源 TAG&#xff1a;镜像的标签 IMAGE ID&#xff1a;镜像ID CREATED&#xff1a;镜像创建时间 SIZE&#xff1a;镜像大小 查…

存储结构与管理磁盘

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、一切从“/”开始 二、物理设备的命名规则 三、文件系统与数据资料 四、挂载硬件设备 五、添加硬盘设备 六、添加交换分区 七、磁盘容…

uniapp报错--app.json: 在项目根目录未找到 app.json

【问题】 刚创建好的uni-app项目&#xff0c;运行微信小程序控制台报错如下&#xff1a; 【解决方案】 1. 程序根目录打开project.config.json文件 2. 配置miniprogramRoot&#xff0c;指定小程序代码的根目录 我的小程序代码编译后的工程文件目录为&#xff1a;dist/dev/mp…

评价ChatGPT与强人工智能的未来

在人工智能领域&#xff0c;ChatGPT的出现无疑是一个里程碑事件。它不仅展示了自然语言处理技术的巨大进步&#xff0c;也引发了人们对于强人工智能&#xff08;AGI&#xff09;的无限遐想。本文将从多个角度评价ChatGPT&#xff0c;并探讨强人工智能距离我们还有多远。 ChatGP…

Google RichHF-18K 文本到图像生成中的丰富人类反馈

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

IDA*——AcWing 180. 排书

IDA* 定义 IDA*&#xff08;Iterative Deepening A*&#xff09;是一种结合了深度优先搜索&#xff08;DFS&#xff09;的递归深度限制特性和A搜索的启发式估价函数的搜索算法。它主要用于解决启发式搜索问题&#xff0c;尤其是当搜索空间很大或者搜索成本不确定时。 IDA* 是…

场景管理分析平台介绍

在数字化浪潮的推动下&#xff0c;数据已成为企业决策的重要依据。特别是在智能驾驶、虚拟现实和物联网等领域&#xff0c;场景数据的高效管理和利用至关重要。在智能驾驶领域面对海量的场景数据&#xff0c;如何高效处理、精准分析&#xff0c;并将其转化为有价值的决策支持&a…

C++基础(十一):STL简介

从今天开始&#xff0c;我们正式步入STL的学习&#xff0c;STL&#xff08;标准模板库&#xff0c;Standard Template Library&#xff09;是C标准库的重要组成部分&#xff0c;提供了一系列通用的类和函数模板&#xff0c;包括容器、算法、迭代器等。它的设计极大地提高了代码…

AI让大龄程序员重新焕发活力

AI是在帮助开发者还是取代他们&#xff1f; 在软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试&#xff0c;AI工具正在成为开发者的得力助手。然而&#xff0c;这也引发了对开发者职业…

Python爬虫零基础实战,简洁实用!

1.爬虫简介 简单来讲&#xff0c;爬虫就是一个探测机器&#xff0c;它的基本操作就是模拟人的行为去各个网站溜达&#xff0c;点点按钮&#xff0c;查查数据&#xff0c;或者把看到的信息背回来。就像一只虫子在一幢楼里不知疲倦地爬来爬去。 你可以简单地想象&#xff1a;每个…