10.3 编辑框控件

特殊说明:版权归个人所有,请勿转载,谢谢合作。

编辑框(Edit Box)控件是一个能够接受输入的控件。可以在编辑框中输入英文、中文或一些符号,它是一个简易的文本编辑器。接收的文本可以是单行,也可以是多行。

g_hEditWnd = CreateWindow("EDIT", "MyEdit", 
  WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 50, 100, 20, 
  hWnd, (HMENU)ID_BUTTON_PUSH, g_hIns, NULL);

 

编辑框创建过程中,CreateWindow函数的第三个参数dwStyle用来指定编辑框控件的风格(可以是风格的组合),如表10.3所示。

 

  • 表10.3 编辑框控件风格
风格 描述
ES_AUTOHSCROLL 自动增加水平滚动条
ES_AUTOVSCROLL 自动增加垂直滚动条,当按下Enter键后,自动切换到下一页
ES_CENTER 文本居中
ES_LEFT 文本左对齐
ES_LOWERCASE 把输入的字母全部转换成小写字母
ES_MULTILINE 支持多行,若不指定ES_AUTOVSCROLL风格,则会在窗口中正文装满时发出警告
ES_NOHIDESEL 默认时,当编辑框失去焦点时,选中的文本将隐藏,当编辑框获得输入焦点时又显示出来
ES_OEMCONVERT 使编辑框中的正文内容可以在ANSI码转与OEM码相互转换
ES_PASSWORD 所有输入内容以“*”显示
ES_RIGHT 文本右对齐
ES_UPPERCASE 把输入的字母全部转换成大写字母
ES_READONLY 设置正文文本内容为只读
ES_WANTRETURN 接收回车符。如果不指定该风格,在按回车时,响应默认的按钮命令

 

多行显示编辑框的内容时,风格取值为 ES_MULTILINE。一般对于多行文本编辑框还需设置 ES_AUTOVSCROLL,这样可以输入多行文本,并自动滚动。在默认的状况下,编辑框是没有边框的,如果需要边框,需要设置WS_BORDER。另外还可规定编辑框里的文本是否为只读,风格属性设置为ES_READONLY为只读模式。当需要建立密码编辑框时,只要设置ES_PASSWORD风格属性即可。

Win32 SDK编程中,编辑框是以WM_COMMAND的方式发送消息给窗口,在捕获消息的同时,过程处理函数中的wParam与lParam参数具有一定的含义。wParam的低位字节包含编辑框的标识符,高位字节包含通知消息的类型,lParam包含编辑框的句柄。编辑框的消息有很多种,如表10.4所示,列出了编辑框的通知消息(通知消息为wParam的高位字节)。

 

  • 表10.4 编辑框通知消息
通知消息 描述
EN_CHANGE 编辑框改变消息,有内容修改或输入时响应
EN_ERRSPACE 编辑框无法申请足够的动态内存时,发送该消息
EN_KILLFOCUS 编辑框失去焦点时,发送该消息
EN_SETFOCUS 编辑框获得输入焦点时,发送该消息
EN_MAXTEXT 输入的字符超过了规定的最大字符时,发送该消息
EN_UPDATE 当编辑框被改变时发送该消息,与EN CHANGE不同,它在编辑框重画前发送
EM_CANUNDO 检验编辑框是否可以执行取消操作
EM_GETHANDLE 得到内存区文本的句柄,不适用于单行文本模式
EM_GETLIMITTEXT 获得文本最大允许长度
EM_GETLINE 将指定行文本拷贝到字符串指针中
EM_GETLINECOUNT 获得编辑框中行的数量,即多少行
EM_GETMARGINS 获得编辑框的边框宽度
EM_GETMODIFY 确认编辑框是否被修改
EM_GETPASSWORDCHAR 获得密码编辑框设置的密码字符
EM_GETRECT 获得文本矩形区域
EM_GETSEL 获得选中的文本
EM_GETTHUMB 获得编辑框滚动条的位置
EM_GETWORDBREAKPROC 获得换行函数的地址
EM_LIMITTEXT 限定用户能够输入的字符数目
EM_LINEINDEX 获得字符所在的行号
EM_LINELENGTH 获得行的长度
EM_LINESCROLL 文本加入滚动模式
EM_SCROLL 多行编辑框中垂直滚动文本
EM_SCROLLCARET 将插入符移到编辑框的可见区域
EM_SETHANDLE 设置文本内存缓冲区句柄
EM_SETPASSWORDCHAR 设置密码字符
EM_SETTABSTOPS 多行编辑框里设置制表符停止位置,不适用于单行编辑框
EM_UNDO 取消上一次操作
WM_COPY 拷贝消息
WM_CTLCOLOREDIT 只读编辑框,重绘时向父窗口发送该消息
WM_CUT 剪切消息
WM_PASTE 粘贴消息
WM_UNDO 取消上一次操作消息

编辑框控件的内容同样可以使用SetWindowText函数来设置显示的内容,使用GetWindowText函数来获得显示的内容。

 

【例10-3】实现了,当点击【MyButton】按钮时,显示编辑框中的内容;当对编辑框内容更改时,提示“改变事件。”信息框。

//**************************************************************
// NAME 	: Demo_10
//**************************************************************
// POWER 	: Copyright (c) 2012 for lixinghua.
// AUTHOR 	: 2012-8-3 11:00 Create by lixinghua for functions.
// VERSION	: V1.0.0.1
// NOTE 	: 手工整理的创建窗口的代码,本程序只创建一个名称为MyWin的窗口。
//**************************************************************
//
#include <windows.h>
#include <stdio.h>

// 宏定义,分别定义按钮的ID
#define ID_BUTTON_PUSH 0x01
#define ID_EDIT_TEXT 0x02

// 回调函数,用于系统消息的处理。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hIns = NULL;

HWND g_hButtonWnd = NULL;			// 按钮句柄
HWND g_hEditWnd = NULL;				// 编辑框句柄

//-----------------------------------------------------------------------------
//	FUNC	:	入口函数
//-----------------------------------------------------------------------------
//	IN	:	hInstance,进程的实例句柄;
//			hPrevInstance,前一个进程实例句柄,默认为NULL即可;
//			lpCmdLine,命令行参数;
//			nCmdShow,当前窗口显示状态。
//	OUT	:	void
//	RETURN	:	返回为整型,代表窗口的状态,其中APIENTRY描述了
//               	压栈的顺序。
//	AUTHOR	:	2012-2-6 11:18 Create by lixinghua for functions.
//	NOTE	:	此函数为Win32入口函数。
//-----------------------------------------------------------------------------
//
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // 定义所用到的参数
  //
  char szWindowClass[] = { "WinClsName" };
                // 窗口类的名称
  HWND hWnd = NULL;					// 用于存放窗口句柄
  //char szTitle[] = { "五子棋" };				// 窗口标题名称
  char szTitle[] = { "MyWin" };				// 窗口标题名称
  MSG  msg;						// 存放消息的结构体,
                // 由系统提供

  // 保存进程实例句柄
  g_hIns = hInstance;

  // 1. 设计一个窗口类
  //
  WNDCLASSEX wcex;
  
  wcex.cbSize = sizeof(WNDCLASSEX); 
  
  wcex.style		= CS_HREDRAW | CS_VREDRAW;
  wcex.lpfnWndProc	= (WNDPROC)WndProc;
  wcex.cbClsExtra		= 0;
  wcex.cbWndExtra		= 0;
  wcex.hInstance		= hInstance;
  wcex.hIcon		= NULL;
  wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
  wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
  wcex.lpszMenuName	= NULL;
  wcex.lpszClassName	= szWindowClass;
  wcex.hIconSm		= NULL;

  // 2. 注册窗口
  //
  RegisterClassEx(&wcex);

  // 3. 创建窗口
  //
  HMENU hMenu = NULL;
  hWnd = CreateWindow(szWindowClass, szTitle, 
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
0, CW_USEDEFAULT, 0, NULL, hMenu, hInstance, NULL);

  // 判断创建是否成功
  if (!hWnd)
  {
     return FALSE;
  }//end if

  // 4. 显示并更新窗口
  ShowWindow(hWnd, nCmdShow);		// 请注意 nCmdShow 参数
  UpdateWindow(hWnd);



  // 5. 进入消息循环
  while (GetMessage(&msg, NULL, 0, 0)) 
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }//end while
  
  return 0;
}

//-----------------------------------------------------------------------------
//	FUNC	:	回调函数
//-----------------------------------------------------------------------------
//	IN	:	hWnd,窗口句柄;
//			message,要处理的消息ID,以此来区分消息;
//			wParam,消息参数,根据消息的不同内容也有所不同;
//			lParam,消息参数,根据消息的不同内容也有所不同。
//	OUT	:	void
//	RETURN	:	void
//	AUTHOR	:	2012-2-6 11:36 Create by lixinghua for functions.
//	NOTE	:	此函数用于系统消息的处理。
//-----------------------------------------------------------------------------
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  PAINTSTRUCT ps;						// 结构体包含了用于绘制
                // 窗口客户区的信息
  HDC  hdc;						// 设备环境句柄
  int wmId, wmEvent;
  char szContext[512] = { 0 };

  // 消息处理
  //
  switch (message) 
  {

    // 创建窗口时响应的事件
  case WM_CREATE:

    // 创建按钮
    g_hButtonWnd = CreateWindow("BUTTON", "MyButton", 
      WS_CHILD | WS_VISIBLE, 160, 50, 100, 20, 
      hWnd, (HMENU)ID_BUTTON_PUSH, g_hIns, NULL);

    g_hEditWnd = CreateWindow("EDIT", "MyEdit", 
      WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 50, 100, 20, 
      hWnd, (HMENU)ID_EDIT_TEXT, g_hIns, NULL);

    break;

    // 菜单响应事件
  case WM_COMMAND:
    wmId    = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 

    // Parse the menu selections:
    // 捕获改变事件消息,编辑框中内容改变时触发此消息。
    if(wmId == ID_EDIT_TEXT && wmEvent == EN_CHANGE)
    {
      MessageBox(hWnd, "改变事件。", "提示", MB_OK);
    }//end if

    switch (wParam)
    {
    // 点击按钮时,捕获编辑框的内容,并显示。
    case ID_BUTTON_PUSH:

      // 获得EDIT中的内容
      GetWindowText(g_hEditWnd, szContext, 512);

      // 显示提示信息
      MessageBox(hWnd, szContext, "提示", MB_OK);
      
      break;

    default:
      return DefWindowProc(hWnd, message, wParam, lParam);
    }//end switch

    break;

    // 图形绘制事件
  case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);

    EndPaint(hWnd, &ps);
    break;
  
    // 窗口销毁消息,关闭窗口时响应。
  case WM_DESTROY:
    PostQuitMessage(0);
    break;

  default:
    // 调用系统默认消息处理,即交给系统处理。
    return DefWindowProc(hWnd, message, wParam, lParam);
  }//end switch

  return 0;
}

 

点击【MyButton】按钮后显示如图10.3所示。

  • 图10.3 点击按钮后的界面

 

修改编辑框中的内容时,显示如图10.4所示。

  • 图10.4 修改编辑框内容界面

 

转载请附上原文出处链接及本声明
李老师的博客 » 10.3 编辑框控件

发表评论

提供最优质的文章集合

立即查看 了解详情