文本输入框_jq文本框输入其他文本框跟着变动 - CSDN
  • 一、 概述在Windows Form应用中,Windows界面系统通过消息与应用程序进行交互,每个窗口都有相应的消息处理器,处理各自的...Windows也为我们准备了文本输入框,对于简单的文本输入,这个功能已经很完美了,不过如果我

    一、             概述<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    Windows Form应用中,Windows界面系统通过消息与应用程序进行交互,每个窗口都有相应的消息处理器,处理各自的用户输入及界面重绘等逻辑。窗口都有自己的类名,需要先把该类名及它对应的消息处理器注册到Windows界面系统中,再根据该类名来创建自己的窗口。

    Windows也为我们准备了文本输入框,对于简单的文本输入,这个功能已经很完美了,不过如果我们要做一个功能强大的文本编辑器,就像开发环境的IDE那样,那么从头来写它会更好,可以实现我们想要的任何逻辑。

    文本框是这样一个窗口,它响应键盘消息,并实时重绘窗口中的文本,还要响应鼠标消息来移动光标位置。

    我尝试着用Windows API来实现了一个简单的单行文本框,它仅有以下几个功能:

    1、  响应用户的普通字符输入

    2、  可以用光标键及HOMEEND键来移动光标

    3、  可以用鼠标键来移动光标

    4、  可以用BACKSPACEDELETE键来删除输入的内容

    另外,它不具有选择文本的功能及剪切、复制、粘贴等功能,这个文本框是用纯C来写的,不具有对象化的特征,也就是说,没有将代码封装成类,不能在界面上放置两个文本框,这是为了简化代码,只说明它的原理,如果要封装成类,可以采用MFC等类库来编写这个文本框。

    在本文的最后,附带了本程序的全部代码,为了书写方便,把所有的代码都放在了一个代码文件中了。

    本文本框运行界面如下:

     

     

     

    二、             技术要点

    1、 注册文本框类并创建文本框窗口

    可以使用API函数RegisterClassEx来注册文本框类,如下:

    WNDCLASSEX wc;

         ::ZeroMemory(&wc, sizeof(wc));

         wc.cbSize     = sizeof(wc);

         wc.style      = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;   // 指定当窗口尺寸发生变化时重绘窗口,并且响应鼠标双击事件

         wc.hInstance  = _HInstance;

         wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 指定窗口背景颜色为系统颜色“窗口背景”

         wc.lpszClassName = _T("MySimpleTextBox"); // 指定要注册的窗口类名,创建窗口时要以此类名为标识符

         wc.lpfnWndProc     = _TextBoxWndProc; // 处理窗口消息的函数

    ::RegisterClassEx(&wc);              // 调用API函数注册文本框窗口

    在注册文本框类的时候,需要为其指定消息处理过程,就是那个名为_TextBoxWndProc的函数,函数原型如下:

    LRESULT CALLBACK _TextBoxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

    使用类名“MySimpleTextBox”来注册了一个文本框类,并且为其指定了消息处理过程,下一步就是要使用这个类名来创建一个文本框了,使用CreateWindow可以创建该窗口:

    HWND hWnd = ::CreateWindow(__T("MySimpleTextBox"), NULL, WS_CHILDWINDOW | WS_VISIBLE,

    left, top, width, height, hParentWnd, NULL, _HInstance, NULL);

    其中的lefttop为、widthheight为文本框的位置及尺寸,_HInstance为父窗口的句柄。

     

    2、 绘制文本框及文本

    在文本框的消息处理过程中,响应消息WM_PAINT,可以实现对文本的绘制,假设使用默认的字体及字号,则代码如下:

         static PAINTSTRUCT ps;

         static RECT rect;

         HDC hDC = ::BeginPaint(hWnd, &ps);  // 开始绘制操作

         ::GetClientRect(hWnd, &rect);        // 获取客户区的尺寸

         ::DrawEdge(hDC, &rect, EDGE_SUNKEN, BF_RECT);  // 绘制边框,EDGE_SUNKEN表示绘制样式为内嵌样式,BF_RECT表示绘制矩形边框

         int len = ::_tcslen(_String);

    ::TextOut(hDC, 4, 2, _String, len);

    ::EndPaint(hWnd, &ps);               // 结束绘制操作

    其中,_String为定义的一个全局变量:TCHAR _String[TEXTBOX_MAXLENGTH+1];

    其中API函数DrawEdge可以绘制文本框的边缘。

     

    3、 光标操作

    我们可以自己一绘制闪烁的光标,不过Windows为我们提供了一套和光标有关的API函数,可以省去我们绘制光标的繁琐过程:

    CreateCaret(HWND hWnd, HBITMAP hBitmap, int width, int height);

    API函数用于创建一个光标,第一个参数是窗口的句柄,第二个参数是光标的位图,用于定义光标的形状,第三、四个参数为光标的尺寸。

    我们通常见到的光标是一个黑色的竖线,在Insert模式下(按了Insert键)为一个黑色的方块,如果是使用这种简单的光标,就把第二个参数设置为NULL就可以了。

    ShowCaret(HWND hWnd);

    API函数用于显示光标,其中并没有指定显示哪个光标的参数,这是因为光标是与当前线程有关的资源,一个线程只能创建一个光标,在该线程中创建的光标,可以在该线程中对它执行其它的操作。

    SetCaretPos(int x, int y);

    API函数用于设置光标的位置,当输入字符后或响应光标键时,可以调用该函数重新设置光标的位置。

    在调用CrateCaret创建了光标时,它是隐藏状态,要显示它需要调用ShowCaret函数。

    HideCaret(HWND hWnd);

    API函数用于隐藏光标。如果两次调用了HideCaret来隐藏光标,也需要调用两次ShowCaret才能显示它。

    DestroyCaret(HWND hWnd);

    API函数用于销毁光标。

     

    通常来说,我们需要在文本框得到焦点的时候创建并显示光标,而在文本框失去焦点的时候隐藏并销毁光标。

    通过处理两个Windows Form消息可以实现上面的逻辑:

    处理WM_SETFOCUS消息创建并显示光标:

    ::CreateCaret(hWnd, (HBITMAP)NULL, 1, TEXTBOX_HEIGHT-5); // 创建光标

    ::SetCaretPos(x, y);                  // 设置光标位置

    ::ShowCaret(hWnd);                    // 显示光标

     

    处理WM_KILLFOCUS消息隐藏并销毁光标:

    ::HideCaret(hWnd);                    // 隐藏光标

    ::DestroyCaret();                     // 销毁光标

    在窗口绘制之前,我们需要先隐藏光标,绘制完成之后再显示光标,否则屏幕上将会残留光标的痕迹,但在处理WM_PAINT消息时我们并没有这样做,是因为BeginPaintEndPaint已经为我们做了这件事情。

     

    4、 响应按键消息

    Windows有若干与键盘相关的消息,例如:WM_KEYDOWNWM_KEYUPWM_CHAR等,我们需要处理WM_CHAR消息在光标的位置显示所输入的字符,消息处理过程的参数wParam即为所输入的字符,显示出字符之后,需要调用SetCaretPos来重新设置光标位置。

    如何将字符立即显示出来呢,首先要指定文本框上的无效区域,按照Windows Form的编程约定,当Windows发现某个窗口上出现无效区域时,会向该窗口发送WM_PAINT消息来通知消息处理过程重绘这个区域。

    API函数InvalidateRect可以指定窗口的某个区域无效,最简单的办法是让整个窗口都无效,如下:

         RECT rect;

         ::GetClientRect(hWnd, &rect);

         ::InvalidateRect(hWnd, &rect, TRUE);

    ::UpdateWindow(hWnd);

    API函数UpdateWindow在执行时会立即重绘窗口,以便让用户的输入会在界面上及时做出响应。

    光标键及HOMEEND等键不会产生WM_CHAR消息,我们可以响应WM_KEYDOWN消息来移动光标的位置。

     

    5、 响应鼠标消息

    我们需要处理鼠标的单击消息WM_LBUTTONDOWN来移动光标,如何知道鼠标点击在哪个字符上呢,也就是如何取得指定位置处的字符呢?Windows API并没有为我们提供现成的功能,好在写一个这样的功能也不复杂,API函数GetTextExtentPoint(HDC hDc, LPCSTR lpString, int count, LPSIZE lpSize)可以获取指定的设置描述表下,指定字符串的尺寸。

    基于这样的原理,我们可以逐渐求得每个字符所在的位置,与鼠标单击的位置来对照,便可以计算出鼠标是单击了哪个字符,如下:

         int x = LOWORD(lParam);

         HDC hDc = ::GetDC(hWnd);

         int strLen = ::_tcslen(_String), strPos = 0;

         SIZE size;

         for (strPos=0; strPos<strLen; strPos++)

         {

             ::GetTextExtentPoint(hDc, _String, strPos, &size);

             if(size.cx + 4 >= x)

                  break;

         }

         _StringPosition = strPos;

         ::GetTextExtentPoint(hDc, _String, strPos, &size);

         ::SetCaretPos(size.cx + 4, 3);

         ::ReleaseDC(hWnd, hDc);

     

    三、             遗留问题

    1、 文本缓冲区问题

    本示例中为了简单起见,定义了一个固定大小的文本缓冲区,当输入的字符数量到达固定大小时,将忽略字符消息的处理。显然这种处理方式不实用,当文本较少时会造成内存缓存区的浪费,当文本较多时内存缓冲区不能够满足要求,并且插入和删除字符时,都会移动大量的文本,效率也比较慢。

    我们需要用变长的字符串来解决字符缓冲区大小这个问题,变长字符串会有许多逻辑,可以用类来封装这些逻辑,例如MFC中的CString类。

     

    2、 如何用面向对象的思维来写一个文本框

    本简单的文本框显示不具有重用特征,字符串缓冲区、光标位置等数据都定义为全局变量,这导致无法在界面上放置两个文本框。如果采用面向对象的逻辑,应该把这些数据封装在一个类中,之所以没有采用面向对象的方式来写,是因为Windows API本身就是面向过程的,从整体架构上来讲,我们需要实现一套面向对象的开发框架,定义各种窗口共有的基类,在这个基类上派出生各种窗口,例如MFC就是这样做的。

     

    3、 文本选择的逻辑

    实现这个逻辑的关系在于以下两点:

    一是当用户拖拽鼠标或用Shift+光标键等进行选择时,消息处理过程需要对这些鼠标和键盘的消息正确地响应,确定出当前所选择的区域

    二是如何向用户呈现所选择的文本区域,通常它们具有指定颜色的底色,这牵涉到界面重绘的问题。可以对这部分文本设置好背景色和前景色进行绘制。

     

    4、 重绘的效率问题

    本示例中每次输入和删除都要重绘整个文本区域,实际上,我们可以判断窗口哪个位置无效了,一般是光标后面的文本无效。在绘制时先取得其无效区域,仅对这一小部分进行绘制,可以提高重绘效率。

     

    5、 多行文本的问题

    显然,该示例程序只能输入单行文本,如果要输入多行文本,可以响应回车键另起一行,在窗口绘制时,如果遇到回车键,便跳到下一行的最左侧区域进行绘制。

    也可以采取每行文本使用一个字符串缓冲区的办法,以防止在大量文本时引起的大量内存移动,这需要定义一个文本管理器的类来处理多个缓冲区的逻辑。

     

    6、 其它问题

    围绕文本编辑器可以展开若干问题,例如字体、字号、颜色、行间距等,更高级的,像开发环境的IDE,会自动把关键字突出显示,如果要做这样一个文本编辑器,就是非常复杂的事情了,不过办法总比问题多,这些有激情的问题会带领我们进入一个广阔的思维空间。

     

    7、 最后一个问题

    我写文章的水平不咋的,多多见谅。

    全部的代码请见《用Windows API实现一个简单的文本输入框(下)》

     

    展开全文
  • input type属性 text 单行文本框 passworld 密码文本框 button 按钮 reset 重置按钮 image 图像形式的提交按钮 radio 单选按钮 checkbox 复选框 ...inp...
    input type属性
    text 单行文本框
    passworld 密码文本框
    button 按钮

    reset

    重置按钮
    image 图像形式的提交按钮
    radio 单选按钮
    checkbox 复选框
    hidden 隐藏字段
    file

    文件上传

    语法:    <input type="表单类型">

    单行文本框

    语法:    <input type="text">

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
    </head>
    <body>
    
        <form name="my_Form" method="POST">
            姓名:<input type="text">
        </form>
    
    </body>
    </html>

    text 几个重要属性

    value : 定义文本框的默认值,也就是文本框内的文字

    siae : 定义文本框的长度,以字符为单位

    maxlength : 设置文本框中最多可以输入的字符数

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
    </head>
    <body>
    
        <form name="my_Form" method="POST">
            姓名:<input type="text" value="zql" size="15" maxlength=""><br>
            年龄:<input type="text" value="18" size="15" maxlength="3">
        </form>
    
    </body>
    </html>

    多行文本框:

    语法:

    <textarea cols="行数" rows="列数">内容</textarea>

    实例:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
    </head>
    <body>
    
        <form name="my_form" method="POST">
            <textarea cols="8" rows="20">介绍一下自己</textarea>
        </form>
    
    </body>
    </html>

     

    展开全文
  • 当用户要在表单中键入字母、数字等内容时,就会用到文本输入框。文本框也可以转化为密码输入框。 语法: 1、type:  当type="text"时,输入框为文本输入框;  当type="password"时, 输入框为密码输入框。 ...

    当用户要在表单中键入字母、数字等内容时,就会用到文本输入框。文本框也可以转化为密码输入框

    语法

    <form>
       <input type="text/password" name="名称" value="文本" />
    </form>

    1、type:

       当type="text"时,输入框为文本输入框;

       当type="password"时, 输入框为密码输入框。

    2、name:为文本框命名,以备后台程序ASP 、PHP使用。

    3、value:为文本输入框设置默认值。(一般起到提示作用)

    举例

    <form>
      姓名:
      <input type="text" name="myName">
      <br/>
      密码:
      <input type="password" name="pass">
    </form>

    在浏览器中显示的结果:

    展开全文
  • HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,但大小在浏览器中(firefox、chrome)还是可以调节的,在他的右下角会有一个拖动标志。...

    HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,但大小在浏览器中(firefox、chrome)还是可以调节的,在他的右下角会有一个拖动标志。
    可以通过以下两种方式控制大小

    1. textarea style=”height: 50px;width: 70px;resize: none;”
    2. textarea rows=”3” cols=”10” style=”resize: none;”
    展开全文
  • Bootstrap 支持最常见的表单控件,主要...最常见的表单文本字段是输入框 input Bootstrap 提供了对所有原生的 HTML5 的 input 类型的支持,包括:text、password、datetime、datetime-local、date、month、time、w...
  • HTML文本框

    2019-02-18 16:16:09
    开发工具与关键技术:DW 作者:文泽钦 撰写时间:2019年2月18日 想写出一篇好文章,有感觉但没有情绪怎么办;一个抒情的网页,希望能给爱写做的朋友带来灵感,首先写一个div包裹整个页面: &...
  • 1、选中去除文本框文字,离开后显示原有文字: &lt;input name="key" type="text" id="key" value="关键词" size="30" onmouseover=this.focus...this.st
  • 何创建html文本输入框?html文本输入框代码是什么?HTML表单是获取用户输入所需的内容。但是首先,你需要制作一个文本框,那么如何创建是一个问题,下面我们来讲一下Windows系统是如何创建html文本输入框。 打造...
  • 当用户要在表单中键入字母、数字等内容时,就会用到文本输入框。文本框也可以转化为密码输入框。 语法: &lt;form&gt; &lt;input type="text/password" name="名称" value=&...
  • CSS表单-文本输入框美化CSS教程 [code]昨天我做了一个表单模板给大家看,眩目漂亮的时尚表单模板,今天我就来仔细分解一下文本输入框的美化步骤,高手就飘过了。 css美化其实就是一个原理的问题,如果把...
  • 一、文本输入框的介绍 从用户那里获取文字信息是与用户进行交互的一个重要组成部分, 输入框的作用则是搭建起用户与软件交互的一个直接桥梁之一。 通常, 当我们点击输入框的编辑区域时, 输入框中会出现插入光标,...
  • 网页自动填表——文本输入框及多行文本输入框
  • Form表单input文本输入框回车键提交问题 当Form表单只有一个inupt文本输入框时,那个文本输入框存在着回车键按下提交from表单事件 而往往我们在使用from表单时为了方便一般都会在输入完文本框后进行给文本框添加键盘...
  • 在WEB测试中,经常会碰到很多表单输入框,大体有两种,一种是数值型文本框,一种是字符型的普通文本输入框。针对普通的文本输入框,通常要检查以下几点:1、输入中英文空格2、输入超长字符3、输入字符串中间含空格4...
  • 文本输入框包括两种,单行文本输入框(JTextField) 和多行文本输入框 (JTextArea)。密码输入框则只有一种(JPasswordField)。JPasswordField 是 JTextField 的子类,它们的主要区别是JPasswordField 不会显示出用户...
  • 当用户要在表单中键入字母、数字等内容时,就会用到文本输入框。文本框也可以转化为密码输入框。 语法: <form> <input type="text/password" name="名称" value="文本" /> </form> 1、type...
  • 4 文本输入框(TextBox)的定制 4.1增加公共的属性和函数 文本输入框也是常使用的组件,App Inventor2提供的组件已经包含了许多属性和函数,但有些常用的属性并未提供。 如用户在文本框中输入字符的时候,常会有...
  • 天继续给大家带来比较骚气的操作,js实现文本输入框的特效,演示:http://www.sdfymj.com/ 把以下代码放置网站底部即可 光标喷水类似粒子动画效果 输入的文字飞出动态效果 输入框动画 炫酷搜索框 <...
  • 在WEB测试中,经常会碰到很多表单输入框,大体有两种,一种是数值型文本框,一种是字符型的普通文本输入框。上次提到了测试用例共享能提高测试人员的工作效率,节省时间,我们可以将这种普遍的校验提取出来放入公共库...
  • 本文内容比较简单,给大家介绍一下微信的文本输入框是如何实现的,其实那只是个普通的文本框设了一个特殊的背景而已。具体微信怎么实现的,大家可以反编译下,这里介绍下如何实现这个背景。 可以先看下文章末尾的...
1 2 3 4 5 ... 20
收藏数 97,061
精华内容 38,824
关键字:

文本输入框