在Windows中,带格式的文本都是通过OLE剪贴板来进行拷贝的。在工程中经常会遇到此类问题。本文介绍如何处理"HTML Format"格式的剪贴板数据。当在网页中进行拷贝操作时,便会产生此类数据。
1]相关头文件及初始化操作
#include"afxole.h"
#include "afxadv.h"
//在程序初始化部分加入如下代码
if(!AfxOleInit())
{
AfxMessageBox("OLE FAILD");
returnFALSE;
}
2]数据的读取
关键在于用HTML Format格式对数据进行读取,可以通过注册的方式或者直接指定CF_HTML。
本文将数据存放到变量buffer中。OLE剪贴板中以UTF-8格式存放数据,因此要对其进行相应的
编码转换操作。
UINThtmlformat = RegisterClipboardFormat("HTML Format");
COleDataObject odo ;
odo.AttachClipboard() ;
//read
CString buffer;
if( odo.IsDataAvailable(htmlformat)){
HANDLEh = odo.GetGlobalData(htmlformat);
CMemFile sf((BYTE*) ::GlobalLock(h), ::GlobalSize(h));
LPSTRstr = buffer.GetBufferSetLength(::GlobalSize(h));
sf.Read(str, ::GlobalSize(h));
inta=buffer.GetLength();
::GlobalUnlock(h) ;
::GlobalFree(h) ;
}
odo.Release() ;
ConvertUtf8ToGBK(buffer);
3]数据的准备
数据由包头及HTML代码两部分组成。
包头有四个变量:StartHTML,EndHTML,StartFragment,EndFragment分别表示HTML及要复制的内容的开始及结束位置。下面为其操作代码,contain为要进行复制的HTML格式内容。如"<
b>Hello World"。
CString head="Version:1.0/r/nStartHTML:0000000sh/r/nEndHTML:0000000eh/r/nStartFragment:0000000sf/r/nEndFragment:0000000ef/r/n";
CString html="HTML PUBLIC /"-//W3C//DTD HTML 4.0 Transitional//EN/">/r/n/
/r/n/"+contain+"/r/n/r/n";ConvertGBKToUtf8(head);
ConvertGBKToUtf8(html);
intsh,eh,sf,ef;
sh=head.GetLength();
eh=sh+html.GetLength();
sf=sh+html.Find("");
ef=sh+html.Find("");
CString tmp;
tmp.Format("%0.9d",sh);
head.Replace("0000000sh",tmp);
tmp.Format("%0.9d",eh);
head.Replace("0000000eh",tmp);
tmp.Format("%0.9d",sf);
head.Replace("0000000sf",tmp);
tmp.Format("%0.9d",ef);
head.Replace("0000000ef",tmp);
CString clip;
clip=head+html;
4]数据的写入
将准备好的数据写入到剪贴板中是操作的最后一步。若没有对OLE进行初始化,则无法完成对
数据的写入!!
COleDataSource *pCods =newCOleDataSource();
HGLOBALh = GlobalAlloc(GHND|GMEM_SHARE,clip.GetLength()+1);
_tcscpy(LPSTR(GlobalLock(h)), clip ) ;
::GlobalUnlock(h);
pCods->CacheGlobalData(htmlformat,h) ;
pCods->SetClipboard() ;
5]编码的转换
UTF-8=>GBK
ConvertUtf8ToGBK(CString& strUtf8)
{
intlen=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
LPWSTR wszGBK=newWCHAR[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char*szGBK=newchar[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);
strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}
GBK=>UTF-8
ConvertGBKToUtf8(CString& strGBK)
{
intlen=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
LPWSTRwszUtf8 =newWCHAR[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
char*szUtf8=newchar[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}