《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.mzph.cn/web/41139.shtml

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

相关文章

【文献解析】Voxelmap——一种自适应体素地图

Efficient and Probabilistic Adaptive Voxel Mapping for Accurate Online LiDAR Odometry 论文地址&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9813516 代码&#xff1a;GitHub - hku-mars/VoxelMap: [RA-L 2022] An efficient and probabili…

制冷软件SOLKANE单级制冷循环计算

SOLKANE软件下载 单级制冷循环参数介绍 输入数据&#xff1a; 1.蒸发器&#xff1a; 温度&#xff1a;蒸发温度t6&#xff08;露点温度&#xff09;。 过热&#xff1a;制冷剂t6-t6在蒸发器中过热。 压力损失&#xff1a;蒸发器入口和出口之间的压力下降。 制冷量&#x…

Android12 MultiMedia框架之MediaExtractorService

上节学到setDataSource()时会创建各种Source&#xff0c;source用来读取音视频源文件&#xff0c;读取到之后需要demux出音、视频、字幕数据流&#xff0c;然后再送去解码。那么负责进行demux功能的media extractor模块是在什么时候阶段创建的&#xff1f;这里暂时不考虑APP创建…

深圳晶彩智能ESP32-2432S028R实时观察LVGL9效果

深圳晶彩智能ESP32-2432S028R概述&#xff1a; 深圳晶彩智能出品ESP32-32432S028R为2.8寸彩色屏采用分辨率320x240彩色液晶屏&#xff0c;驱动芯片是ILI9431。板载乐鑫公司出品ESP-WROOM-32&#xff0c;Flash 4M。型号尾部“R”标识电阻膜的感压式触摸屏&#xff0c;驱动芯片是…

基于MATLAB对线阵天线进行泰勒加权

相控阵天线——基于MATLAB对线阵进行泰勒加权 目录 前言 一、泰勒综合 二、单元间距的改变对泰勒阵列方向图的影响 三、单元数的改变对泰勒阵列激励分布的影响 四、副瓣电平SLL对泰勒阵列激励幅度的影响 五、副瓣电平SLL对泰勒阵列方向图的影响 六、泰勒阵列和切比雪夫阵…

量化交易在不同经济周期中的表现

量化交易&#xff0c;作为一种基于算法和数学模型的交易方法&#xff0c;其在不同经济周期中的表现受到了市场参与者的广泛关注。量化交易策略的设计使其能够在多种市场环境中寻找投资机会&#xff0c;无论是经济扩张期还是衰退期&#xff0c;都能够展现出其独特的适应性和效率…

7.6数据结构作业

// 练习一 struct K { double a; //8 char b; //1 char c; //1 double d; //8 };//24 // 练习二 struct L { int a; //4 double b; //8 char c; //1 };//24 // 练习三 struct M { char a;//1 int b; //4 char c; //1 double d; //8 };//24 /…

(5) 深入探索Python-Pandas库的核心数据结构:Series详解

目录 前言1. Series 简介2. Series的特点3. Series的创建3.1 使用列表创建Series3.2 使用字典创建Series3.3 使用列表和自定义索引创建Series3.4 指定数据类型和名称 4. Series的索引/切片4.1 下标索引&#xff1a;基于整数位置的索引4.2 基于标签的索引4.3 切片4.4 使用.loc[]…

触感网络:WebKit 振动(Vibration API)的交互新维度

触感网络&#xff1a;WebKit 振动&#xff08;Vibration API&#xff09;的交互新维度 在数字化时代&#xff0c;用户体验的追求已经不仅限于视觉和听觉&#xff0c;触觉反馈也逐渐成为网页交互设计的重要组成部分。WebKit 作为众多现代浏览器的核心技术引擎&#xff0c;对振动…

Linux 文件描述符 fd

当然&#xff0c;以下是一些关于 Linux 文件描述符&#xff08;fd&#xff09;的示例&#xff0c;以清晰、分点表示和归纳的形式给出&#xff1a; 1. 文件描述符的基本概念和用途 定义&#xff1a;文件描述符是一个非负整数&#xff0c;用于指代被进程所打开或使用的文件、套…

Leetcode 59. 螺旋打印矩阵

题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 示例 2&#xff1a; 输入&#xff1a;n…

c++中new和delete重载的一点介绍

通义千问中作答的&#xff0c;感觉回答的比自己总结的好&#xff1a; 实际上&#xff0c;你可以在C中重载new和delete运算符。重载new和delete允许你自定义内存分配和释放的行为&#xff0c;这对于实现特殊的内存管理策略非常有用&#xff0c;例如&#xff1a; 内存池&#xf…

系统迁移从CentOS7.9到Rocky8.9

我有两台阿里云上的服务器是CentOS7.9&#xff0c;由于CentOS7已经停止支持&#xff0c;后续使用的话会有安全漏洞&#xff0c;所以需要尽快迁移&#xff0c;个人使用的话目前兼容性好的还是RockyLinux8&#xff0c;很多脚本改改就能用了。 一、盘点系统和迁移应用 查看当前系…

AI在软件开发中的革新与未来挑战

目录 前言 AI工具的广泛应用与优势 AI与开发者技能需求的互动关系 AI的未来展望与面临的挑战 结语 前言 在当今快速发展的技术领域中&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正以前所未有的方式改变着软件开发的面貌。从代码生成到错误检测&#xff0c;再…

linux内核源码学习所需基础

1.面向对象的思想&#xff0c;尤其是oopc的实现方式。 2.设计模式。 这两点需要内核源码学习者不仅要会c和汇编&#xff0c;还要接触一门面向对象的语言&#xff0c;比如c&#xff0b;&#xff0b;/java/python等等任意一门都行&#xff0c;起码要了解面向对象的思想。 另外li…

MyBatis 框架核心及面试知识要点

1、什么是 MyBatis? MyBatis 是一款优秀的支持自定义 SQL 查询、存储过程和高级映射的持久层框架&#xff0c;消除了 几乎所有的 JDBC 代码和参数的手动设置以及结果集的检索 。 MyBatis 可以使用 XML,或注解进 行配置和映射&#xff0c;MyBatis 通过将参数映射到配置的 SOL,形…

FastSpeech2中文语音合成就步解析:TTS数据训练实战篇

参考github网址&#xff1a; GitHub - roedoejet/FastSpeech2: An implementation of Microsoft’s “FastSpeech 2: Fast and High-Quality End-to-End Text to Speech” 数据训练所用python 命令&#xff1a; python3 train.py -p config/AISHELL3/preprocess.yaml -m confi…

ida动态调试-cnblog

ida动态调试 传递启动ida服务 android_server在ida\dbgsrv目录中 adb push android_server /data/local/tmp/chmod 755 /data/local/tmp/android_server /data/local/tmp/android_serveradb forward tcp:23946 tcp:23946ida报错:大多是手机端口被占用 报错提示&#xff1a; …

java面试-java基础(下)

文章目录 一、和equals区别&#xff1f;二、hashcode方法作用&#xff1f;两个对象的hashCode方法相同&#xff0c;则equals方法也一定为true吗&#xff1f;三、为什么重写equals方法就一定要重写hashCode方法&#xff1f;四、Java中的参数传递时传值呢还是传引用&#xff1f;五…

期末上分站——计组(3)

复习题21-42 21、指令周期是指__C_。 A. CPU从主存取出一条指令的时间 B. CPU执行一条指令的时间 C. CPU从主存取出一条指令的时间加上执行这条指令的时间。 D. 时钟周期时间 22、微型机系统中外设通过适配器与主板的系统总线相连接&#xff0c;其功能是__D_。 A. 数据缓冲和…