似乎是全网首发?反正我没找到比较好的博客。
禁止转载
我不用垃圾 vs,我只爱 devcpp!
1. 表格
方法一
使用 EM_INSERTTABLE
消息(官方文档):SendMessage(h, EM_INSERTTABLE, (WPARAM)参数1, (LPARAM)参数2);
参数1(wParam):
指向 TABLEROWPARMS 结构的指针。
参数2(lParam):
指向 TABLECELLPARMS 结构的指针。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| TABLEROWPARMS trp; memset(&trp, 0, sizeof(trp)); trp.cbRow = sizeof(trp); trp.cbCell = sizeof(TABLECELLPARMS); trp.cCell = 1; trp.cRow = 2; trp.dxCellMargin = 100; trp.dyHeight = 100; trp.cpStartRow = 0;
TABLECELLPARMS tcp; memset(&tcp, 0, sizeof tcp); tcp.dxWidth = 100; tcp.wShading = 100; tcp.dxBrdrLeft = 0; tcp.dyBrdrTop = 0; tcp.dxBrdrRight = 0; tcp.dyBrdrBottom = 0; tcp.crBrdrLeft = RGB(255,255,255); tcp.crBrdrTop = RGB(255,255,255); tcp.crBrdrRight = RGB(255,255,255); tcp.crBrdrBottom = RGB(0,0,0); tcp.crBackPat = RGB(255,255,255); tcp.crForePat = RGB(0,0,0);
SendMessage(h, EM_INSERTTABLE, (WPARAM)&trp, (LPARAM)&tcp);
|
方法二(推荐)
使用 RTF 格式制作表格,然后直接插入
1 2 3 4 5 6 7
| SETTEXTEX ste; ste.codepage = 0; ste.flags = ST_SELECTION; SendMessage(output, EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)R"-({\rtf1\ansi \trowd\intbl 111 \cell 222 \cell\row \trowd\intbl 333 \cell 444 \cell\row })-");
|
注:R 开头的是原始字符串字面量,见 cppreference。
注2:对齐方式
控制字 |
意义 |
\qc |
居中 |
\ql |
左对齐 |
\qr |
右对齐 |
2. 图片
就几个参数,都在官方文档里。直接放代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| int InsertImage(HWND h, const char* imagepath) { IStream* pStream = nullptr; HRESULT hr = SHCreateStreamOnFile(imagepath, STGM_READ, &pStream); if(pStream) { Gdiplus::Image image(pStream); RICHEDIT_IMAGE_PARAMETERS rip; rip.xWidth = image.GetWidth(); rip.yHeight = image.GetHeight(); rip.Ascent = 0; rip.Type = TA_TOP; rip.pwszAlternateText = L"[pic]"; rip.pIStream = pStream; int old_style = GetWindowLongPtr(h, GWL_STYLE);
SendMessage(h, EM_SETSEL, -1, -1); SendMessage(h, EM_INSERTIMAGE, 0, (LPARAM)&rip); pStream->Release(); } return 0; }
|
注意:READONLY 模式下可能会插入失败,使用 EM_SETREADONLY
事件关闭只读即可。编译失败可能是因为没有链接库。
当然使用 rtf 也是可以的(通常使用16进制文本),见参考文档。
3. 文字
rtf 法:你可以直接输入文本,注意 \
{
}
需要用斜杠转义。常见的控制字有 \b
(粗体),\i
(斜体)等
winapi 法:EM_SETSEL 取消选中,然后 EM_REPLACESEL 即可追加文本,设置格式用 EM_SETCHARFORMAT。(这就是老版 cbs markdown 的写法)
参考资料:
关于富编辑控件(Microsoft)
rtf 文档 v1.7 中文
rtf 文档 v1.9.1 英文