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

news2024/11/28 14:49:07

编辑类是最简单的预定义窗口类,而另一方面却又是最复杂的。当你用“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.coloradmin.cn/o/1902948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑色矩形块检测数据集VOC+YOLO格式2000张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2000 标注数量(xml文件个数)&#xff1a;2000 标注数量(txt文件个数)&#xff1a;2000 标注…

使用ifconfig命令获取当前服务器的内网IP地址

如何使用ifconfig命令获取当前服务器的内网IP地址呢&#xff1f; ifconfig eth0 | grep inet | awk {print $2}

Zookeeper分布式锁原理说明【简单易理解】

Zookeeper 非公平锁/公平锁/共享锁 。 1.zookeeper分布式锁加锁原理 如上实现方式在并发问题比较严重的情况下&#xff0c;性能会下降的比较厉害&#xff0c;主要原因是&#xff0c;所有的连接都在对同一个节点进行监听&#xff0c;当服务器检测到删除事件时&#xff0c;要通知…

2007-2022年 国内各上市公司绿色化转型数据.(Excel文件、dta文件、参考文献、计算方法与说明)

上市公司绿色化转型数据为研究者提供了评估企业在生态文明建设、循环经济和绿色管理方面表现的重要视角。以下是对中国各上市公司绿色化转型数据的介绍&#xff1a; 数据简介 定义&#xff1a;上市公司绿色化转型是指企业在发展模式上向可持续发展转变&#xff0c;实现资源节…

如何确保 PostgreSQL 在高并发写操作场景下的数据完整性?

文章目录 一、理解数据完整性二、高并发写操作带来的挑战三、解决方案&#xff08;一&#xff09;使用合适的事务隔离级别&#xff08;二&#xff09;使用合适的锁机制&#xff08;三&#xff09;处理死锁&#xff08;四&#xff09;使用索引和约束&#xff08;五&#xff09;批…

《linux系统内核设计与实现》-内核空间和用户空间的概念以及内核空间和用户空间的数据拷贝

1 内核空间和用户空间的概念 用户空间&#xff1a;0-3G 内核空间&#xff1a;3-4G PAGE_OFFSET配置用户空间和内核空间的界限 分离的原因&#xff1a; &#xff08;1&#xff09;处理器模式不同&#xff0c;权限不同 对于x86体系的cpu&#xff0c;用户空间代码运行在Ring3…

时间、查找、打包、行过滤与指令的运行——linux指令学习(二)

前言&#xff1a;本节内容标题虽然为指令&#xff0c;但是并不只是讲指令&#xff0c; 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法&#xff0c; 很抱歉&#xff0c; 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的&#xff0c;…

如何创建和规划 PMO 团队,并发挥其最大实际价值

在当今复杂多变的商业环境中&#xff0c;项目管理办公室&#xff08;PMO&#xff09;已成为许多组织中不可或缺的一部分。PMO 团队能够为企业的项目管理提供战略指导、资源协调、流程优化等支持&#xff0c;从而提升项目的成功率和组织的整体绩效。那么&#xff0c;如何创建和规…

【React】React18 Hooks 之 useReducer

目录 useReducer案例1&#xff1a;useReducer不带初始化函数案例2&#xff1a;useReducer带初始化函数注意事项1&#xff1a;dispatch函数不会改变正在运行的代码的状态注意事项2&#xff1a;获取dispatch函数触发后 JavaScript 变量的值注意事项3&#xff1a;触发了reducer&am…

【沐风老师】3DMAX样条线增强工具SplinePro使用方法详解

3DMAX样条线增强工具SplinePro使用教程 3DMAX样条线增强工具SplinePro&#xff0c;允许创建选定的多条样条曲线形状的轮廓并删除交叉点。 【适用版本】 3dMax2019 - 2025 【安装方法】 1.解压缩后&#xff0c;确认SplinePro-0.2.0.mse和logo.png两个文件在同一文件夹中。 2.…

移动校园(4):数据处理(sql server数据库)

昨天写入数据库后的数据 可以看到classname和timeandlocation有多个值&#xff0c;所以需要进行数据处理 let reawait req.app.locals.db.query(select distinct classname from courses)let data[]re.recordset.map((value)>{let namesvalue.classname.split(,)names.map(…

那你真的了解方法调用吗?

方法调用是不是很熟悉&#xff1f;那你真的了解它吗&#xff1f;今天就让我们来盘一下它。 首先大家要明确一个概念&#xff0c;此处的方法调用并不是方法中的代码被执行&#xff0c;而是要确定被调用方法的版本&#xff0c;即最终会调用哪一个方法。 之前我们了解到&#xff…

【Android】自定义换肤框架05之Skinner框架集成

引入依赖 api("io.github.hellogoogle2000:android-skinner:1.0.0")初始化Skinner 在所有功能前调用即可&#xff0c;建议在Application中初始化 SkinnerKit.init(application)安装皮肤包 在应用该皮肤包前安装即可&#xff0c;建议预安装&#xff0c;或应用皮肤…

【反悔堆 反悔贪心】2813. 子序列最大优雅度

本文涉及知识点 反悔堆 反悔贪心 LeetCode 2813. 子序列最大优雅度 给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可…

如何在 PostgreSQL 中实现数据的增量备份和恢复?

文章目录 一、增量备份的原理二、准备工作&#xff08;一&#xff09;环境配置&#xff08;二&#xff09;创建测试数据库和表&#xff08;三&#xff09;插入初始数据 三、全量备份四、基于时间点的增量备份&#xff08;一&#xff09;开启 WAL 归档&#xff08;二&#xff09…

网页封装APP:让您的网站变身移动应用

网页封装APP&#xff1a;让您的网站变身移动应用 随着移动设备的普及&#xff0c;越来越多的人开始使用移动设备浏览网站。但是&#xff0c;传统的网站设计并不适合移动设备的屏幕尺寸和交互方式&#xff0c;这导致了用户体验不佳和流失。 有没有办法让您的网站变身移动应用&…

TXT文本处理新篇章:告别繁琐,一键批量删除单号间空白行,引领高效管理新潮流!

在繁忙的商务环境中&#xff0c;文本处理往往占据了大量的时间和精力。特别是那些充斥着订单、单号等关键信息的TXT文本文件&#xff0c;一旦处理不当&#xff0c;就可能引发一系列问题。空白行&#xff0c;这个看似微不足道的小细节&#xff0c;却常常成为我们高效处理文本的绊…

C++ | Leetcode C++题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; class Solution { public:int getID(int x, long w) {return x < 0 ? (x 1ll) / w - 1 : x / w;}bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {unordered_map<int, int> mp;int n nums.si…

python根据父母身高预测儿子身高

题目 从键盘输入父母的升高&#xff0c;并使用eval()或float()转换输入的数据类型。计算公式&#xff1a;儿子身高&#xff08;父亲身高母亲身高&#xff09;*0.54. father_heighteval(input(请输入爸爸的身高&#xff1a;)) mother_heighteval(input(请输入妈妈的身高&#…

普通Java工程如何在代码中引用docker-compose.yml中的environment值

文章目录 一、概述二、常规做法1. 数据库配置分离2. 代码引用配置3. 编写启动类4. 支持打包成可执行包5. 支持可执行包打包成docker镜像6. docker运行 三、存在问题分析四、改进措施1. 包含environment 变量的编排文件2. 修改读取配置文件方式3. 为什么可以这样做 五、运行效果…