如何在 MFC(或仅 C++)中将 Table 写入剪贴板以粘贴到 Word 中?
How to write a Table to clipboard in MFC (or just c++) to be pasted into word?
我正在编写一个 MFC 程序,希望能够以 table 形式输出一些数据,最好是将其写入剪贴板,然后将其粘贴到 word 中。
到目前为止,我研究过使用富文本格式来绘制 table。我已经成功地完成了一个 .rtf 文件,如下所示:
std::string s = "{\rtf \par \trowd \trqc\trgaph108\trrh280\trleft36"
"\clbrdrt\brdrth \clbrdrl\brdrth \clbrdrb\brdrdb"
"\clbrdrr\brdrdb \cellx3636\clbrdrt\brdrth"
"\clbrdrl\brdrdb \clbrdrb\brdrdb \clbrdrr\brdrdb"
"\cellx7236\clbrdrt\brdrth \clbrdrl\brdrdb"
"\clbrdrb\brdrdb \clbrdrr\brdrdb \cellx10836\pard \intbl "
"First Cell"
" \cell \pard \intbl "
"Second Cell"
" \cell \pard \intbl "
"Third Cell"
" \cell \pard \intbl \row"
"\trowd \trqc\trgaph108\trrh280\trleft36 \clbrdrt\brdrdb"
"\clbrdrl\brdrth \clbrdrb \brdrsh\brdrs \clbrdrr\brdrdb"
"\cellx3636\clbrdrt\brdrdb \clbrdr \brdrdb"
"\clbrdrb\brdrsh\brdrs \clbrdrr\brdrdb"
"\cellx7236\clbrdrt\brdrdb \clbrdr \brdrdb"
"\clbrdrb\brdrsh\brdrs \clbrdrr\brdrdb \cellx10836\pard"
"\intbl "
"Fourth Cell"
" \cell \pard \intbl "
"Fifth Cell"
" \cell \pard \intbl "
"Sixth Cell"
"\cell \pard"
"\intbl \row \pard}";
ofstream file("f.rtf");
if(file.is_open())
{ file << s; file.close}
我想将 table 写到剪贴板,例如:
::OpenClipboard(NULL);
EmptyClipboard();
HGLOBAL hg = GlobalAlloc(GMEM_MOVEABLE, s.size());
if (!hg){
CloseClipboard();
return;
}
memcpy(GlobalLock(hg), s.c_str(), s.size());
GlobalUnlock(hg);
SetClipboardData(CF_TEXT, hg);
CloseClipboard();
GlobalFree(hg);
但我找不到富文本的剪贴板格式。可以这样做吗?是否有任何 MFC 技巧可以做到这一点?
您需要注册格式(或获取已经注册的格式):
CLIPFORMAT cfRTF = RegisterClipboardFormat(_T("Rich Text Format"));
我正在编写一个 MFC 程序,希望能够以 table 形式输出一些数据,最好是将其写入剪贴板,然后将其粘贴到 word 中。
到目前为止,我研究过使用富文本格式来绘制 table。我已经成功地完成了一个 .rtf 文件,如下所示:
std::string s = "{\rtf \par \trowd \trqc\trgaph108\trrh280\trleft36"
"\clbrdrt\brdrth \clbrdrl\brdrth \clbrdrb\brdrdb"
"\clbrdrr\brdrdb \cellx3636\clbrdrt\brdrth"
"\clbrdrl\brdrdb \clbrdrb\brdrdb \clbrdrr\brdrdb"
"\cellx7236\clbrdrt\brdrth \clbrdrl\brdrdb"
"\clbrdrb\brdrdb \clbrdrr\brdrdb \cellx10836\pard \intbl "
"First Cell"
" \cell \pard \intbl "
"Second Cell"
" \cell \pard \intbl "
"Third Cell"
" \cell \pard \intbl \row"
"\trowd \trqc\trgaph108\trrh280\trleft36 \clbrdrt\brdrdb"
"\clbrdrl\brdrth \clbrdrb \brdrsh\brdrs \clbrdrr\brdrdb"
"\cellx3636\clbrdrt\brdrdb \clbrdr \brdrdb"
"\clbrdrb\brdrsh\brdrs \clbrdrr\brdrdb"
"\cellx7236\clbrdrt\brdrdb \clbrdr \brdrdb"
"\clbrdrb\brdrsh\brdrs \clbrdrr\brdrdb \cellx10836\pard"
"\intbl "
"Fourth Cell"
" \cell \pard \intbl "
"Fifth Cell"
" \cell \pard \intbl "
"Sixth Cell"
"\cell \pard"
"\intbl \row \pard}";
ofstream file("f.rtf");
if(file.is_open())
{ file << s; file.close}
我想将 table 写到剪贴板,例如:
::OpenClipboard(NULL);
EmptyClipboard();
HGLOBAL hg = GlobalAlloc(GMEM_MOVEABLE, s.size());
if (!hg){
CloseClipboard();
return;
}
memcpy(GlobalLock(hg), s.c_str(), s.size());
GlobalUnlock(hg);
SetClipboardData(CF_TEXT, hg);
CloseClipboard();
GlobalFree(hg);
但我找不到富文本的剪贴板格式。可以这样做吗?是否有任何 MFC 技巧可以做到这一点?
您需要注册格式(或获取已经注册的格式):
CLIPFORMAT cfRTF = RegisterClipboardFormat(_T("Rich Text Format"));