如何处理"html format"格式的剪贴板数据,用VC操作"HTML Format"格式的OLE剪贴板

在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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值