C语言Windows程序设计 -> 第十四天 -> 文本输入框
一、文本输入框的介绍
从用户那里获取文字信息是与用户进行交互的一个重要组成部分, 输入框的作用则是搭建起用户与软件交互的一个直接桥梁之一。
通常, 当我们点击输入框的编辑区域时, 输入框中会出现插入光标,我们可以直接在输入框中输入文字或文本信息。 我们还可以使用一些快捷键例如Ctrl + C(复制)、Ctrl + V(粘贴)等快捷键操作, 前提是如果你想允许用户这么做的话。
文本输入框分为单行输入框和多行输入框, 单行输入框即不能进行换行操作, 所有内容都将在一行写完, 常用来输入一些较短的文本, 例如常见的用户名/密码输入框。
多行文本输入框常用于输入较长的段落时文本, 用户可以使用回车键进行换行, 例如Windows自带的记事本的文本编辑窗口。
多行文本输入框通常会在紧靠右侧的地方带上一个垂直滚动条, 或者在底部带上一个水平滚动条, 方面用户快速查看输入框中的内容。图示中是一个带有水平滚动条和垂直滚动条的多行文本输入框:
在本篇随笔的最后, 我们还将使用输入框以及按钮、组合框等已学到的控件来完成一个简易的文本编辑器。
二、文本输入框的创建
创建文本输入框的步骤与创建一个按钮类似, 只需要调用CreateWindows创建一个输入框子窗口控件就可以了, 如果已经掌握了如何创建一个按钮, 那么创建一个文本输入框就会感觉很简单。
创建一个编辑类控件的窗口类名为"edit", 例如创建一个上图中所演示的输入框的CreateWindow函数中的参数为:
case WM_CREATE: hwndInput = CreateWindow( TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 20, 20, 350, 100, hwnd, (HMENU)1, ((LPCREATESTRUCT) lParam) -> hInstance, NULL ) ; return 0 ;
创建一个带有输入框的窗口, 完整示例代码如下(已折叠):
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 /*C语言Windows程序设计 -> 创建文本输入框 -> 演示*/ 2 3 #include <windows.h> 4 5 LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ; 6 7 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) 8 { 9 static TCHAR szAppName[] = TEXT( "demo" ) ; 10 HWND hwnd ; 11 MSG msg ; 12 WNDCLASS wndclass ; 13 14 wndclass.lpfnWndProc = WndProc ; 15 wndclass.style = CS_HREDRAW | CS_VREDRAW ; 16 wndclass.hInstance = hInstance ; 17 wndclass.cbClsExtra = 0 ; 18 wndclass.cbWndExtra = 0 ; 19 wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH) ; 20 wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ) ; 21 wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ) ; 22 wndclass.lpszClassName = szAppName ; 23 wndclass.lpszMenuName = NULL ; 24 25 if( !RegisterClass(&wndclass) ) 26 { 27 MessageBox( NULL, TEXT("无法注册窗口类!"), TEXT("错误"), MB_OK | MB_ICONERROR ) ; 28 return 0 ; 29 } 30 31 hwnd = CreateWindow( szAppName, TEXT("C语言Windows程序设计 -> 创建文本输入框 -> 演示"), WS_OVERLAPPEDWINDOW, 32 CW_USEDEFAULT, CW_USEDEFAULT, 33 CW_USEDEFAULT, CW_USEDEFAULT, 34 NULL, NULL, hInstance, NULL ) ; 35 36 ShowWindow( hwnd, iCmdShow ) ; 37 UpdateWindow( hwnd ) ; 38 39 while( GetMessage(&msg, NULL, 0, 0) ) 40 { 41 TranslateMessage( &msg ) ; 42 DispatchMessage( &msg ) ; 43 } 44 45 return msg.wParam ; 46 } 47 48 LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) 49 { 50 static HWND hwndInput ; 51 52 switch( message ) 53 { 54 case WM_CREATE: 55 hwndInput = CreateWindow( TEXT("edit"), NULL, 56 WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | WS_BORDER | 57 ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 58 20, 20, 350, 100, 59 hwnd, (HMENU)1, ((LPCREATESTRUCT) lParam) -> hInstance, NULL ) ; 60 return 0 ; 61 62 case WM_DESTROY: 63 PostQuitMessage(0) ; 64 return 0 ; 65 } 66 67 return DefWindowProc( hwnd, message, wParam, lParam ) ; 68 }
如果想创建一个单行输入框, 很简单, 去掉 ES_MULTILINE 属性就行了, 当然, 在单行输入的情况下也就没必要使用 ES_AUTOVSCROLL 属性了。
关于CreateWindow函数部分的一些解释:
1>. 输入框的样式:
除了 WS_CHILD 样式外, 该子窗口控件还具有以下属性:
WS_VISIBLE //初始时是可见的
WS_VSCROLL //带有一个垂直滚动条
WS_HSCROLL //带有一个水平滚动条
WS_BORDER //拥有四周的边界线
ES_LEFT //编辑区的文本为左对齐
ES_MULTILINE //多行输入框
ES_AUTOHSCROLL //当单行输入的文本总宽度大于输入框的宽度时自动水平滚动
ES_AUTOVSCROLL //当输入行数总高度大于输入框的高度时自动垂直滚动
其中, 以 WS_ (Windows Style)为前缀的标识符为窗口样式, 以 ES_ (Edit Style)为前缀的标识符为编辑类样式。
更多窗口样式以及编辑框样式的介绍可以参见笔者的另一篇补充博文: C语言Windows程序设计 -> 补充 -> Windows窗口样式与编辑框样式