如题,我在一个文字处理程序如word中ctrl+c复制了一串文本到剪贴板后,按ctrl+v正常情况是粘贴文本,但我想实现,把剪贴板中的文本由vc处理后再粘贴就成为一张图片(bitmap,jpg等任意格式都行),如何用vc实现?

解决方案 »

  1.   

    你得自己处理了,得到文字内容,然后DrawText,TextOut绘制文字
      

  2.   


    /****************************************************************************
    一、功能:
    文本转成位图。二、说明:
    (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;
    }