一、功能:
文本转成位图。
二、说明:
(1)记得添加头文件
#include <string>
using namespace std;
(2)可以修改每一行的最大字符个数
#define LINE_MAX 400 //一行最多的字符个数
(3)TAB制表符的默认宽度是8个字符。实际操作中还是不够精确
三、复制以下代码后可以直接使用。
四、调用示例:(将文本保存成图片并且放在剪贴板里)
void CDemoDlg::OnButton2()
{
string text=GetClipBoardText(NULL);
HBITMAP bitmap=StringToBitmap(text.c_str());
BitmapToClipboard(bitmap);
DeleteObject(bitmap);
}
将以下代码复制到对话框工程或者参考上面提供的示例程序
/****************************************************************************
获取文本的矩形范围,即是将来生成位图的大小
****************************************************************************/
#define LINE_MAX 400 //一行最多的字符个数
SIZE GetTextSize(HDC hdc,const TCHAR* p)
{
SIZE TextSize;
const TCHAR* strpos=p;
int RowCount=1;
for(;*p;p++)
{
if (*p=='/r') //换行符
{
RowCount++;
//get a line string
TCHAR line[LINE_MAX];
int num=__min(p-strpos,LINE_MAX-1);
_tcsncpy(line,strpos,num);
line[num]=NULL;
//count how many "tab" in this line
int TabCount=0;
const TCHAR* pp=line;
for(;*pp;pp++) { if (*pp=='/t') TabCount++;}
//get the line width(pixel)
SIZE size;
GetTextExtentPoint(hdc,line,num+7*TabCount,&size);
if (size.cx>TextSize.cx)
TextSize.cx=size.cx;
strpos=p+2;
}
}
//━━━━━━━━━━━━━━━━━━━━━━最后一行的计算━━━━━━━━━━━
//count how many "tab" in this line
int TabCount=0;
const TCHAR* pp=strpos;
for(;*pp;pp++) { if (*pp=='/t') TabCount++;}
//get the line width(pixel)
SIZE size;
GetTextExtentPoint(hdc,strpos,(p-strpos)+7*TabCount,&size);
if (size.cx>TextSize.cx)
TextSize.cx=size.cx;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//获取行高度
TEXTMETRIC tm;
::GetTextMetrics(hdc, &tm);
int LineHeight = tm.tmHeight;
TextSize.cy=LineHeight*RowCount;
return TextSize;
}
/****************************************************************************
文本转BITMAP
****************************************************************************/
HBITMAP StringToBitmap(const TCHAR* str)
{
HDC hScrDC=::GetDC(NULL); //创建屏幕DC
//获取字符串的矩形范围。
SIZE TextSize=GetTextSize(hScrDC,str);
TextSize.cx+=5; //行首添加5个空白像素
HDC hMemDC=CreateCompatibleDC(hScrDC); //创建内存DC
HBITMAP bitmap=::CreateCompatibleBitmap(hScrDC,TextSize.cx,TextSize.cy); //创建兼容位图
HBITMAP OldBitmap=(HBITMAP)::SelectObject(hMemDC,bitmap); //把位图选进内存DC
//输出字符串的矩形区域
RECT rect={0,0,TextSize.cx,TextSize.cy};
//填充背景
::FillRect(hMemDC,&rect,(HBRUSH)GetStockObject(WHITE_BRUSH));
//输出文本
rect.left=5; //行首添加5个空白像素
::DrawText (hMemDC,str,-1,&rect,DT_EDITCONTROL|DT_EXPANDTABS|DT_LEFT |DT_NOCLIP ) ;
bitmap=(HBITMAP)::SelectObject(hMemDC,OldBitmap);
::DeleteDC(hMemDC) ; //删除内存DC
::ReleaseDC(NULL,hScrDC) ; //释放屏幕DC
return bitmap;
}
/****************************************************************************
BITMAP 放到 剪贴板
****************************************************************************/
void BitmapToClipboard(HBITMAP hBitmap)
{
::OpenClipboard(NULL);
::EmptyClipboard() ;
::SetClipboardData(CF_BITMAP,hBitmap);
::CloseClipboard();
}
/****************************************************************************
获取剪贴板文本
****************************************************************************/
string GetClipBoardText(HWND hWnd)
{
// ASSERT(hWnd);
string ClipBoardText;
//判断剪贴板的数据格式是否可以处理。
if (!IsClipboardFormatAvailable(CF_TEXT))
return ClipBoardText;
//打开剪贴板。
if (!::OpenClipboard(hWnd))
return ClipBoardText;
//获取数据
HGLOBAL hMem = GetClipboardData(CF_TEXT);
if (hMem != NULL)
{
//获取字符串。
LPTSTR lpStr = (LPTSTR)GlobalLock(hMem);
if (lpStr != NULL)
{
ClipBoardText=lpStr;
//释放锁内存
GlobalUnlock(hMem);
}
}
//关闭剪贴板
CloseClipboard();
return ClipBoardText;
}
void CDemoDlg::OnButton1()
{
string text=GetClipBoardText(NULL);
HBITMAP bitmap=StringToBitmap(text.c_str());
BitmapToClipboard(bitmap);
DeleteObject(bitmap);
}