什么是富文本编辑控件?
富文本编辑控件不仅能输入、编辑、打印和保存文本,还可以设置文本、段落格式等,并可包含嵌入式组件模型COM对象。富文本编辑控件几乎支持所有用于多行编辑控件的消息通知代码,因此已使用编辑控件的应用程序可以轻松更改为使用富文本编辑控件。
富文本编辑控件具有多个版本,我们采用4.1版本,动态链接库为Msftedit.dll,窗口类名为MSFTEDIT_CLASS。
常用控件样式有ES_MULTILINE和ES_PASSWORD等。
创建富文本编辑控件
#include<Richedit.h>//富文本编辑控件的头文件
case WM_CREATE:
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
//必须加载动态库
LoadLibrary(L"Msftedit.dll");
HWND hRichEdit=CreateWindow(MSFTEDIT_CLASS, L"这是一个富文本编辑控件!!!",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE|ES_AUTOVSCROLL, 30, 30, 200, 200, hWnd, (HMENU)111, pcs->hInstance, NULL);
//选中索引2-7的文本
SendMessage(hRichEdit, EM_SETSEL, 2, 7);
//显示选择背景色
SendMessage(hRichEdit, EM_HIDESELECTION,0 , 0);
//先获取默认的字符格式
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
SendMessage(hRichEdit, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cf);
//让选择的文字加粗
cf.dwMask |= CFM_BOLD;
cf.dwEffects |= CFE_BOLD;
//设置下划线
cf.dwMask |= CFM_UNDERLINE;
cf.dwEffects |= CFE_UNDERLINE;
//设置字体大小
cf.dwMask |= CFM_SIZE;
cf.yHeight =20*20;
//设置字体
cf.dwMask |= CFM_FACE;
wcscpy(cf.szFaceName , L"楷体");
//设置字体颜色
cf.dwMask |= CFM_COLOR;
cf.dwEffects &= ~CFE_AUTOCOLOR;
cf.crTextColor = RGB(255, 0, 0);
//设置选择字符的格式
SendMessage(hRichEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
//取消选择
SendMessage(hRichEdit, EM_SETSEL, -1, -1);
//设置富文本编辑框的背景色
SendMessage(hRichEdit, EM_SETBKGNDCOLOR, 0, (LPARAM) RGB(0,255,0));
//发送控件内容改变事件、选择改变事件掩码
SendMessage(hRichEdit, EM_SETEVENTMASK, 0, (LPARAM)ENM_CHANGE| ENM_SELCHANGE);
}break;
通知消息
控件会以向父窗口发送WM_COMMAND或WM_NOTIFY消息的形式发送通知代码。
EN_CHANGE:富文本编辑控件主窗口发生更改,要接收EN_CHANGE通知,需要在EM_SETEVENTMASK掩码中指定ENM_CHANGE。
EN_SELCHANGE:通知富文本编辑控件的父窗口,当前选择已经更改,以WM_NOTIFY的形式发送通知码,需要在掩码中指定ENM_SELCHANGE。
case WM_NOTIFY:
{
//先看公共头部
NMHDR *pHDR = (NMHDR *)lParam;
if (pHDR->code == EN_SELCHANGE)
{
SELCHANGE * pSC= (SELCHANGE *)lParam;
TCHAR buf[64];
wsprintf(buf, L"选择文本索引%d - %d\n", pSC->chrg.cpMin, pSC->chrg.cpMax);
OutputDebugString(buf);
}
}break;
case WM_COMMAND:
{
WORD CtrlID = LOWORD(wParam);
HWND hCtrl = (HWND)lParam;
if (CtrlID == 111)
{
WORD code= HIWORD(wParam);
if (code == EN_CHANGE)
{
TCHAR buf[64];
GetWindowText(hCtrl, buf, 64);
MessageBox(NULL, buf,L"提示",MB_OK);
}
}
}break;