win32sdk学习-Richedit组件使用

Richedit组件使用

Richedit组件可以使用CreateWindow来创建,也可以使用对话框模板资源,在创建对话框的同时,自动创建richedit

在使用richedit组件之前,需要先使用LoadLibrary("RichEd20.dll"),因为richedit是作为一个单独的dll保存的,如果不事先调用这个函数,会出现组件不显示的情况。Richedit有多个版本,RICHED20.DLL表示的是2.03.0版本的dllRICHED32.DLL表示的是1.0的版本,通常使用2.0的版本就可以使用大部分功能了。

对话框资源模板:

DLG_MAIN DIALOGEX 6, 5, 265, 285

STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_GROUP | WS_MAXIMIZEBOX | WS_POPUP | WS_THICKFRAME | WS_SYSMENU | WS_TABSTOP

EXSTYLE WS_EX_WINDOWEDGE

CAPTION "Notepad"

MENU IDR_MENU1

CLASS "DLG_MAIN"

FONT 12, "Tahoma", 400, 0, 0

{

    CONTROL         "", IDC_RICHEDIT1, RICHEDIT_CLASS, WS_VSCROLL | NOT WS_BORDER | NOT WS_TABSTOP | ES_MULTILINE | ES_NOHIDESEL | ES_WANTRETURN, 0, 33, 265, 230, WS_EX_CLIENTEDGE

}

CONTROL 部分就是richedit组件一些属性设置,IDC_RICHEDIT1是组件资源id标示符,

RICHEDIT_CLASSrichedit组件的窗口类名称。后面的一些就是组件的样式了。

2个常用的样式:

ES_MULTILINE  多行文本模式

ES_WANTRETURN回车键直接换号,默认是CTRL+回车换行。

ES_NOHIDESEL  防止Rich Edit控件在失去焦点时隐藏选中区域的高亮显示,通常在查找字符的时候,我们希望richedit选中查找的字符。

Richedit的消息很多,这个msdn有详细介绍,这里列出几个文本编辑常用的.

1.EM_SETEVENTMASK

SendMessage(hwndrich,EM_SETEVENTMASK,0,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_CHANGE|ENM_KEYEVENTS|ENM_SCROLL|ENM_DROPFILES)

EM_SETEVENTMASK 用于设置richedit需要响应那些事件消息的。通过指定参数,来是richedit响应事件,并发送消息给父窗口处理,

ENM_SELCHANGE 选择内容改变

ENM_MOUSEEVENTS 鼠标移动和点击

ENM_KEYEVENTS 键盘事件

2.EM_GETTEXTLENGTHEX

GETTEXTLENGTHEX lengthstrust={GTL_NUMCHARS,1200};

 SendMessage(hwndrich,EM_GETTEXTLENGTHEX,(WPARAM)&lengthstrust,(LPARAM)0);

EM_GETTEXTLENGTHEX 消息,用于获取richedit组件中的文本长度,消息附带的参数WPARAM是一个GETTEXTLENGTHEX结构类型,该结构用来决定编辑器文本的长度如何计算。

typedef struct _gettextlengthex {   

DWORD flags;

UINT  codepage;

} GETTEXTLENGTHEX;

Flags的值用来标记该如何计算长度。如GTL_NUMCHARS表示返回字符数

Codepage通常就两种值 ANSI代码页 CP_ACP ,Unicode 1200

方法返回计算的长度值

3.EM_REPLACESEL

SendMessage(hwndrich,EM_REPLACESEL,0,(LPARAM)TEXT("\t"));

消息用于替换当前选择的文本,LPARAM是一个字符指针。

4.EM_UNDOEM_REDO

SendMessage(hwndrich,EM_UNDO,0,0);

撤销当前操作

SendMessage(hwndrich,EM_REDO,0,0);

恢复上一次撤销

5.WM_COPYWM_PASTEWM_CUT

SendMessage(hwndrich,WM_COPY,0,0);

SendMessage(hwndrich,WM_CUT,0,0);

SendMessage(hwndrich,WM_PASTE,0,0);

用于剪切,复制,和粘贴,这个是edit组件的消息,richedit也可以使用

6.EM_GETSELEM_EXGETSEL

SendMessage(hwndrich,EM_GETSEL,(WPARAM)&lindex,0);

获取当前选择的开始字符和结束字符的位置,使用两个DWORD型指针接收。

SendMessage(hwndrich,EM_EXGETSEL,0,(LPARAM)&CHARRANGE);

这个消息同样获取当前选择的字符位置,不过他是用一个CHARRANGE结构来保存选择范围。

typedef struct _charrange {

LONG cpMin;

LONG cpMax;

} CHARRANGE;

结构成员分别表示了起始和结束位置。

7.EM_GETSELTEXT

SendMessage(hwndrich,EM_GETSELTEXT,0,(LPARAM)buffer);

获取当前选择的字符文本,buffer是一个字符缓冲数组,用于接收选择的文本。

8.EM_REPLACESEL

SendMessage(hwndrich,EM_REPLACESEL,0,(LPARAM)buffer);

替换当前选择的文本,buffer中保存了用于替换选择的字符串。

9.EM_FINDTEXTEX

SendMessage(hwndrich,EM_FINDTEXTEX,(wParam)Flags,(LPARAM)&FINDTEXTEX);

查找当前richedit中的文本,参数flags指明查找条件。LPARAM参数是一个FINDTEXTEX

包含了信息查找结果。

typedef struct _findtextex {

CHARRANGE chrg; CHARRANGE CHRG; //要搜索查找的范围

LPCTSTR   lpstrText; LPCTSTR lpstrText; //要查找的字符串

CHARRANGE chrgText; CHARRANGE chrgText; //找到后的字符串选择范围。

} FINDTEXTEX; } FINDTEXTEX;

10.EM_EXSETSEL

SendMessage(hwndrich,EM_EXSETSEL,0,(LPARAM)CHARRANGE);

设置richedit组件选择文本,CHARRANGE指定选择范围,选择部分会高亮显示。

ES_NOHIDESEL这个需要设定,否则组件失去焦点的时候会不高亮显示。

11.EM_GETCHARFORMATEM_SETCHARFORMAT

CHARFORMAT cformat;

SendMessage(hwndrich,EM_GETCHARFORMAT,SCF_SELECTION,(LPARAM)&cformat);

获取当前选择文本的字符格式属性。wParam参数指定选择范围,它有两种值:SCF_SELECTION当前选择的字符格式,SCF_DEFAULT 默认的字符格式。

LPARAM参数是一个CHARFORMAT 结构指针,用于保存接收的字符属性。

SendMessage(hwndrich,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cformat);

用于设置当前选择的文本字符属性。参数和上面一样,不过CHARFORMAT结构中保存了需要进行设置的字符属性,主要包括颜色,字体大小,字体名称等。

12.EM_STREAMOUTEM_STREAMIN

EDITSTREAM stream;

SendMessage(hwndrich,EM_STREAMOUT,SF_TEXT,(LPARAM)&stream);

消息指定richedit使用流的方式将组件的内容进行输出。wParam指定输出格式,

有SF_RTF ,SF_TEXT, SF_RTFNOOBJS 等常用格式。

EDITSTREAM结构用来控制输出和输入。

typedef struct _editstream {

DWORD_PTR dwCookie; //通常是一个文件句柄,用于流读写

DWORD   dwError; //表示流读写结果,0表示没错误

EDITSTREAMCALLBACK pfnCallback; //流读写回调函数,用于控制读写

} EDITSTREAM;

EDITSTREAMCALLBACK函数原型:

DWORD CALLBACK SaveStreamCallback(DWORD dwCookie,LPBYTE pbBuff,LONG cb,LONG *pcb)

dwCookie就是EDITSTREAM的成员,pbBuff是一个读写缓冲区,,LONG cb,表示将要读写的数据长度。*pcb表示的是实际读写的长度,*pcb通常是不会大于cb的。

SendMessage(hwndrich,EM_STREAMIN,SF_TEXT,(LPARAM)&stream);

指定richedit使用流的方式将内容读入组件显示,参数和上面一样。

13.EM_SETPARAFORMAT

PARAFORMAT paraformat;

SendMessage(hwndrich,EM_SETPARAFORMAT,0,(LPARAM)&format);

设置段落文本的格式,如果有选择的多行,则设置多行格式,LPARAM参数是一个PARAFORMAT指针,用于保存设置的文本段落格式信息。

你可能感兴趣的:(Stream,buffer,dll,border,scroll,文本编辑)