编辑控件分为单行和多行两种样式
编辑控件的创建
创建单行控件
// 创建单行编辑控件
HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("edit"), TEXT("edit1"),
WS_VISIBLE | WS_CHILD | ES_LEFT,
10, 10, 200, 30, hWnd, (HMENU)10001, hInstance, 0);
HWND hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("edit"), TEXT("edit2"),
WS_VISIBLE | WS_CHILD | ES_LEFT,
10, 50, 200, 30, hWnd, (HMENU)10002, hInstance, 0);
要响应Tab顺序就要加上WS_TABSTOP样式
创建多行编辑控件
// 创建多行编辑控件
HWND hEdit3 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("edit"), TEXT("edit3"),
WS_VISIBLE | WS_CHILD | ES_MULTILINE | WS_VSCROLL | ES_WANTRETURN,
10, 90, 200, 200, hWnd, (HMENU)10003, hInstance, 0);
多行风格样式有:
ES_MULITLINE 多行编辑样式
ES_WANTRETURN 接收回车键
WS_VSCROLL 显示垂直滚动条
效果图
Edit控件样式
ES_AUTOHSCROLL 自动在行末向右滚动10个字符
ES_AUTOVSCROLL 自动向上滚动一行
ES_CENTER 将文本居中显示(单行/多行)
ES_LEFT 文本居左显示
ES_LOWERCASE 将字符转为小写
ES_MULTILINE 多行编辑
ES_NOHIDESEL 控件失去焦点时,也选中所选文本
ES_NUMBER 只允许输入数字
ES_OEMCONVERT 转换编辑控件中输入的文本字符集
ES_PASSWORD 显示密码样式(*****),只用于单行编辑控件
ES_READONLY 编辑控件为只读样式
ES_RIGHT 文本靠右显示
ES_UPPERCASE 将所有字符转为大写字符
ES_WANTRETURN 接收回车键,只有多行编辑才有效
Edit 控件消息
EM_GETSEL 获得选中文本的起始位置和结束位置(WPARAM=起始位置,LPARAM=结束位置)
EM_SETSEL 设置文本选中的起始位置和结束位置(WPARAM=起始位置,LPARAM=结束位置)
EM_GETCHARFROMPOS 返回光标所在位置的行的索引和字符从0开始的索引(WPARAM=0,LPARAM=L(pt.x),H(pt.y);返回值:(DWORD),L(行的索引),H(字符索引)
EM_LINEFORMCHAR 返回指定字符所在行的索引,WPARM=指定字符索引/-1(当前光标所在行),LPARAM=0;
EM_GEETLINEINDEX 返回指定字符索引所在行第一个字符的索引(即指定字符串的索引-第一个字符索引=指定字符在行中的第几个字符列),WPARAM=指定字符的索引/-1(当前光标所在位置),LPARAM=0;
EM_GETMODIFY 获得编辑控件是否修改的标记,WPARAM=0,LPARAM=0, 返回BOOL
EM_SETMODIFY 设置控件的修改标记,WPARAM=BOOL,LPARAM=0; 无返回
EM_GETLINELENGTH 返回指定字符索引的行中字符串的长度(-1为当前光标所在行),WPARAM=字符索引/(-1当前光标);返回行中字符串的长度
EM_GETLINE 获得指定行的字符串,WPARAM=指定行的索引/(-1),LPARAM=接收字符串的缓存指针(指针第一个字符要=缓存大小),返回实际字符串长度
EM_REPLACESEL 替换选中文本为指定的字符串, WPARAM=BOOL(是否可撤销),LPARAM=要替换的字符串,返回无
EM_GETLINECOUNT 获得控件中行的总数, WPARAM=0,LPARAM=0;返回行的总数(int);
EM_SETREADONLY 设置控件为只读模式.WPARAM=BOOL(真为只读,假为可编辑);LPARAM=0; 返回无
EM_GETMARGINS 获得文本编辑左右边距WPARAM=0,LPARAM=0; 返回: (DWORD)L=左边距,H=右边距
EM_SETMARGINS 设置文本左右边距WPARAM=EC_LEFTMARGIN|EC_RIGHTMARGIN,LPARAM=(L左边距,H右边距),返回无
EM_COPY 复制WM_COPY
EM_CUT 剪贴WM_CUT
EM_PASTE 粘贴WM_PASTE
Edit 控件通知消息
EN_CHENGE // 文本内容改变消息
EN_HSCROLL // 水平滚动条消息
EN_KILLFOCUS // 失去焦点消息
EN_MAXTEXT // 超出最大文本长度消息
EN_SETFOCUS // 获得焦点消息
EN_UPDATE // 控件重绘自身前发送的消息,文本设置成功后在显示前发送
EN_VSCROLL // 垂直滚动条消息
WM_CTLCOLOREDIT // 重绘控件背景色和文本颜色
备注:
Edit通知消息是通过发送WM_COMMAND消息到父窗口中的,
所以要在父窗口的WM_COMMAND消息中捕获控件通知消息
WPARAM: LOWORD(控件id), HIWORD(通知消息)
LPARAM: 控件句柄
实例:
1. 修改控件背景色
LRESULT OnCtlColorEdit(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HDC hdc = (HDC)wParam;
if ((HWND)lParam == GetDlgItem(hWnd, 10001))
{
SetTextColor(hdc, RGB(0, 120, 215));
SetBkMode(hdc, TRANSPARENT);//OPAQUE,TRANSPARENT
SetBkColor(hdc, RGB(241, 239, 228));
g_hBkBrush1= CreateSolidBrush(RGB(241, 239, 228));
return (LRESULT)g_hBkBrush1; // 返回的画刷要是成员变量或是全局变量,方便后面删除
}
if ((HWND)lParam == GetDlgItem(hWnd, 10003))
{
SetTextColor(hdc, RGB(0, 0, 255));
SetBkMode(hdc, OPAQUE);
SetBkColor(hdc, RGB(241, 239, 228));
g_hBkBrush3 = CreateSolidBrush(RGB(241, 239, 228));
return (LRESULT)g_hBkBrush3;
}
return 0;
}
多行编辑控件的文本背景模式为TRANSPARENT就是下面这样式,滚动的时候背景没擦除
多行编辑控件文本背景模式为OPAQUE,滚动的时候就没有重影