现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

文本转换成图片

2012-08-21 05:28 工业·编程 ⁄ 共 4010字 ⁄ 字号 暂无评论

一、功能
    文本转成位图。

二、说明:
    (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);
}

给我留言

留言无头像?