您的位置:首页 > 编程语言 > C语言/C++

C语言Windows程序设计 -> 第十四天 -> 文本输入框

2012-12-31 18:15 651 查看
[b]C语言Windows程序设计 -> 第十四天 -> 文本输入框[/b]

[b]一、文本输入框的介绍[/b]
从用户那里获取文字信息是与用户进行交互的一个重要组成部分, 输入框的作用则是搭建起用户与软件交互的一个直接桥梁之一。

通常, 当我们点击输入框的编辑区域时, 输入框中会出现插入光标,我们可以直接在输入框中输入文字或文本信息。 我们还可以使用一些快捷键例如Ctrl + C(复制)、Ctrl + V(粘贴)等快捷键操作, 前提是如果你想允许用户这么做的话。

文本输入框分为单行输入框和多行输入框, 单行输入框即不能进行换行操作, 所有内容都将在一行写完, 常用来输入一些较短的文本, 例如常见的用户名/密码输入框。
多行文本输入框常用于输入较长的段落时文本, 用户可以使用回车键进行换行, 例如Windows自带的记事本的文本编辑窗口。

多行文本输入框通常会在紧靠右侧的地方带上一个垂直滚动条, 或者在底部带上一个水平滚动条, 方面用户快速查看输入框中的内容。图示中是一个带有水平滚动条和垂直滚动条的多行文本输入框:

View Code - SimpleEdit-Demo.c

/*C语言Windows程序设计 -> 简易文本编辑器 -> 演示*/

#include <windows.h>
#include <stdio.h>

/*各控件所使用的ID*/
#define ID_EDITBOX    1        //文本编辑框控件
#define ID_TXTPATH    2        //路径编辑框控件
#define ID_SAVEBTN    3        //保存文件按钮
#define ID_CLSBTN    4        //清空编辑区按钮
#define ID_GROUP    5        //组合框

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;
int CreateChildWindow(HWND, HWND *, LPARAM ) ;                //创建将使用到的子窗口控件
int SavaInputContent( TCHAR *, TCHAR * ) ;                    //保存输入的文字到文件

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
{
static TCHAR szAppName[] = TEXT( "demo" ) ;
HWND        hwnd ;
MSG            msg ;
WNDCLASS    wndclass ;

wndclass.lpfnWndProc    = WndProc ;
wndclass.style            = CS_HREDRAW | CS_VREDRAW ;
wndclass.hInstance        = hInstance ;
wndclass.cbClsExtra        = 0 ;
wndclass.cbWndExtra        = 0 ;
wndclass.hbrBackground    = CreateSolidBrush(RGB(236, 233, 216)) ;
wndclass.hCursor        = LoadCursor( NULL, IDC_ARROW ) ;
wndclass.hIcon            = LoadIcon( NULL, IDI_APPLICATION ) ;
wndclass.lpszClassName    = szAppName ;
wndclass.lpszMenuName    = NULL ;

if( !RegisterClass(&wndclass) )
{
MessageBox( NULL, TEXT("无法注册窗口类!"), TEXT("错误"), MB_OK | MB_ICONERROR ) ;
return 0 ;
}

hwnd = CreateWindow( szAppName, TEXT("C语言Windows程序设计 -> 简易文本编辑器 -> 演示"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL ) ;

ShowWindow( hwnd, iCmdShow ) ;
UpdateWindow( hwnd ) ;

while( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage( &msg ) ;
DispatchMessage( &msg ) ;
}

return msg.wParam ;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
static        HWND hwndChild[5] ;
HDC            hdc ;
PAINTSTRUCT ps ;

RECT    rect ;
static    TCHAR *szBuffer ;        //缓冲区
static    TCHAR szPath[256] ;        //文本路径
static  TCHAR szLineNum[32] ;
static    TCHAR szCharNum[32] ;
static int        iLength ;
int iLineCount, iCharCount ;

switch( message )
{
case WM_CREATE:
CreateChildWindow( hwnd, hwndChild, lParam ) ;
return 0 ;

case WM_SIZE:
GetClientRect(hwnd, &rect) ;
MoveWindow( hwndChild[ID_EDITBOX], 0, 0, rect.right, rect.bottom-50, TRUE ) ;        //调整文本编辑区
MoveWindow( hwndChild[ID_TXTPATH], 60,  rect.bottom-31, 200, 20, TRUE ) ;            //调整文本路径输入框
MoveWindow( hwndChild[ID_SAVEBTN], 280, rect.bottom-35, 50,  25, TRUE ) ;            //调整保存按钮
MoveWindow( hwndChild[ID_CLSBTN ], 400, rect.bottom-35, 50,  25, TRUE ) ;            //调整清空按钮
MoveWindow( hwndChild[ID_GROUP  ], 10,  rect.bottom-50, 330, 48, TRUE ) ;            //调整组合框
return 0 ;

case WM_PAINT:
GetClientRect(hwnd, &rect) ;
hdc = BeginPaint( hwnd, &ps ) ;
TextOut( hdc, 20, rect.bottom-30, TEXT("路径:"), lstrlen(TEXT("路径:")) ) ;
TextOut( hdc, 500, rect.bottom-30, szLineNum, lstrlen(szLineNum) ) ;
EndPaint( hwnd, &ps ) ;
return 0 ;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_EDITBOX:
switch(HIWORD(wParam))
{
case EN_UPDATE:
iLineCount = SendMessage( hwndChild[ID_EDITBOX], EM_GETLINECOUNT, 0, 0 ) ;
iCharCount = GetWindowTextLength( hwndChild[ID_EDITBOX] ) ;
wsprintf(szLineNum, "行数: %i    字符数量: %i", iLineCount, iCharCount) ;
InvalidateRect(hwnd, NULL, FALSE) ;
break ;
default:
break ;
}
return 0 ;

case ID_SAVEBTN:
iLength = GetWindowTextLength(hwndChild[ID_EDITBOX]) ;
if( iLength != 0)
szBuffer = malloc(iLength*2) ;
else
return -1 ;
GetWindowText( hwndChild[ID_EDITBOX], szBuffer, GetWindowTextLength(hwndChild[ID_EDITBOX]) + 1 ) ;
if(GetWindowText( hwndChild[ID_TXTPATH], szPath, 256 ) < 1)
{
MessageBox(NULL, TEXT("路径不能为空"), TEXT("提示"), MB_OK | MB_ICONINFORMATION) ;
return -1 ;
}
SavaInputContent( szPath, szBuffer ) ;
return 0 ;

case ID_CLSBTN:
SetWindowText( hwndChild[ID_EDITBOX], TEXT("") ) ;
return 0 ;

default:
break ;
}
return 0 ;

case WM_DESTROY:
PostQuitMessage(0) ;
return 0 ;
}

return DefWindowProc( hwnd, message, wParam, lParam ) ;
}

int CreateChildWindow(HWND hwnd, HWND *hwndChild, LPARAM lParam)
{
HINSTANCE hInst = ((LPCREATESTRUCT) lParam) -> hInstance ;

//创建编辑区
hwndChild[ID_EDITBOX] = CreateWindow( TEXT("edit"), NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL |
ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
0, 0, 0, 0,
hwnd, (HMENU)ID_EDITBOX, hInst, NULL ) ;

//路径输入框
hwndChild[ID_TXTPATH] = CreateWindow( TEXT("edit"), NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL,
0, 0, 0, 0,
hwnd, (HMENU)ID_TXTPATH, hInst, NULL ) ;

//保存按钮
hwndChild[ID_SAVEBTN] = CreateWindow( TEXT("button"), TEXT("保存"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0,
hwnd, (HMENU)ID_SAVEBTN, hInst, NULL) ;

//清空按钮
hwndChild[ID_CLSBTN] = CreateWindow( TEXT("button"), TEXT("清空"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0,
hwnd, (HMENU)ID_CLSBTN, hInst, NULL) ;

//组合框
hwndChild[ID_GROUP] = CreateWindow( TEXT("button"), NULL,
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 0, 0, 0, 0,
hwnd, (HMENU)ID_GROUP, hInst, NULL) ;

return 0 ;
}

int SavaInputContent( TCHAR *path, TCHAR *content )
{
FILE *fSvae ;

fSvae = fopen( path, "w" ) ;
if(fSvae == NULL)
{
MessageBox(NULL, TEXT("文件创建失败!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION) ;
return -1 ;
}
fputs( content, fSvae ) ;
fclose(fSvae) ;
MessageBox(NULL, TEXT("保存成功!"), TEXT("成功"), MB_OK | MB_ICONINFORMATION) ;

return 0 ;


运行效果:



本篇随笔中所有的DEMO代码下载: http://files.cnblogs.com/mr-wid/Learn_WinC_day_14.rar

再长的路, 一步步也能走完, 再短的路, 不迈开双脚也无法到达。2013, 期待你的到来!

--------------------

wid, 2012.12.31

上一篇: C语言Windows程序设计 -> 第十三天 -> 按钮类控件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: