要求:
1.字符串足够长:至少100个字符吧,不能换行.
2.生成的位图必须是256色的.
3.可以设置字符串的字体,颜色等.
4.位图长宽和字符串的长宽相等.谢谢了.

解决方案 »

  1.   

    其实只要一个dc把你的字textout一下,接着把这个dc保存成一个位图不就可以了吗
      

  2.   

    billy145533(冰龙) 的办法不错。
      

  3.   

    创建一个对应属性的memory dc,然后在里面搞
      

  4.   

    // 创建一个位图
    CBitmap bitmap;
    bitmap.creat.........// 创建一个内存DC
    CDC memDC;
    memDC.CreateCompatible........
    memDC.SelectObject(bitmap);// 输出文字到位图
    memDC.TextOut(...........)// bitmap中的内容即为你需要的
      

  5.   

    刚刚测试通过。在C**View里面:BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
    {
    HDC hDC;
    //当前分辨率下每象素所占字节数
    int iBits;
    //位图中每象素所占字节数
    WORD wBitCount;
    //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 
    DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; 
    //位图属性结构 
    BITMAP Bitmap;  
    //位图文件头结构
    BITMAPFILEHEADER bmfHdr;  
    //位图信息头结构 
    BITMAPINFOHEADER bi;  
    //指向位图信息头结构  
    LPBITMAPINFOHEADER lpbi;  
    //定义文件,分配内存句柄,调色板句柄 
    HANDLE fh, hDib, hPal,hOldPal=NULL; 

    //计算位图文件每个像素所占字节数 
    hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); 
    DeleteDC(hDC); 
    if (iBits <= 1) wBitCount = 1; 
    else if (iBits <= 4)  wBitCount = 4; 
    else if (iBits <= 8)  wBitCount = 8; 
    else   wBitCount = 24; 

    GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = Bitmap.bmWidth;
    bi.biHeight = Bitmap.bmHeight;
    bi.biPlanes = 1;
    bi.biBitCount = wBitCount;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrImportant = 0;
    bi.biClrUsed = 0;

    dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;

    //为位图内容分配内存 
    hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); 
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); 
    *lpbi = bi;  // 处理调色板  
    hPal = GetStockObject(DEFAULT_PALETTE); 
    if (hPal) 

    hDC = ::GetDC(NULL); 
    //hDC = m_pDc->GetSafeHdc();
    hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); 
    RealizePalette(hDC); 
    }
    // 获取该调色板下新的像素值 
    GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) 
    +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); 

    //恢复调色板  
    if (hOldPal) 

    ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); 
    RealizePalette(hDC); 
    ::ReleaseDC(NULL, hDC); 

    //创建位图文件  
    fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 

    if (fh == INVALID_HANDLE_VALUE)  return FALSE; 

    // 设置位图文件头 
    bmfHdr.bfType = 0x4D42; // "BM" 
    dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;  
    bmfHdr.bfSize = dwDIBSize; 
    bmfHdr.bfReserved1 = 0; 
    bmfHdr.bfReserved2 = 0; 
    bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; 
    // 写入位图文件头 
    WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 
    // 写入位图文件其余内容 
    WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); 
    //清除  
    GlobalUnlock(hDib); 
    GlobalFree(hDib); 
    CloseHandle(fh);  return TRUE;
    }
    HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect)
    {
    HDC        hMemDC;      
    // 屏幕和内存设备描述表
    HBITMAP    hBitmap,hOldBitmap;   
    // 位图句柄
    int       nX, nY, nX2, nY2;      
    // 选定区域坐标
    int       nWidth, nHeight;      
    // 位图宽度和高度 // 确保选定区域不为空矩形
    if (IsRectEmpty(lpRect))
    return NULL;

    // 获得选定区域坐标
    nX = lpRect->left;
    nY = lpRect->top;
    nX2 = lpRect->right;
    nY2 = lpRect->bottom;
    nWidth = nX2 - nX;
    nHeight = nY2 - nY;
    //为屏幕设备描述表创建兼容的内存设备描述表
    hMemDC = CreateCompatibleDC(hScrDC);
    // 创建一个与屏幕设备描述表兼容的位图
    hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
    // 把新位图选到内存设备描述表中
    hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
    // 把屏幕设备描述表拷贝到内存设备描述表中
    StretchBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,nWidth,nHeight,SRCCOPY);
    //BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);
    //得到屏幕位图的句柄  hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
    //清除 

    // DeleteDC(hScrDC);
    DeleteDC(hMemDC);
    DeleteObject(hOldBitmap);
    // 返回位图句柄
    return hBitmap;
    }
    void CDcToBmpView::OnEditUndo() 
    {
    CDC *pdc=GetDC();
    // HDC hdc=(HDC)pdc;
    HBITMAP hBmp;
    pdc->TextOut (100,100,"asfd");
    CRect rt(100,100,200,200); LPRECT lprt=&rt;
     
    pdc->Ellipse (rt); hBmp=CopyDCToBitmap(pdc->GetSafeHdc (), lprt);
    SaveBmp(hBmp, "f:\\1.bmp");
    WinExec("mspaint.exe F:\\1.bmp",SW_SHOW);
    }
    注意,最后CDcToBmpView::OnEditUndo是一个消息,当心不要直接拷进去!
      

  6.   

    有点长,呵呵
    就是两个函数而已,最后那个消息处理函数只是调用。HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect)BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
      

  7.   

    不是,我是要做电影的字幕!
    上面这个 rainfall19831109(恩恩) 兄弟猜对了!
      

  8.   

    图像与文字的合成作者:kylin下载本文示例工程前几天要做一段程序,把文字和位图图像合成并保存为位图文件。但问了好久都没人给一个满意的答复,只好在黑暗中摸索,费了一番功夫,实现了图像与文字的合成,并且可用鼠标拖动文字。现在我把代码贴出,希望能给需要的朋友以帮助。 一、关键函数 1. int SetDIBits(
            HDC hdc,                  // 兼容DC的句柄
            HBITMAP hbmp,             // 兼容位图的句柄
            UINT uStartScan,          // 扫描起始行的编号
            UINT cScanLines,          // 扫描的行的数目
            CONST VOID *lpvBits,      // 位图缓冲区的指针,要求已经分配空间
            CONST BITMAPINFO *lpbmi,  // 位图信息
            UINT fuColorUse           // 颜色格式
           );这个函数把位图数据一个像素一个像素的贴到一个兼容位图上,hdc是选择了兼容位图的兼容DC。 2.int GetDIBits(
              HDC hdc,           // 兼容DC的句柄
              HBITMAP hbmp,      // 兼容位图的句柄
              UINT uStartScan,   // 扫描起始行的编号
              UINT cScanLines,   // 扫描的行的数目
              LPVOID lpvBits,    // 位图缓冲区的指针,要求已经分配空间
              LPBITMAPINFO lpbi, // 位图信息
              UINT uUsage        // 颜色格式
             );这个函数的作用和SetDIBits刚好相反,它把兼容位图内已存在的数据一个像素一个像素的拷贝到数据缓冲区(lpvBits)中。这样程序的实现就比较明朗了,首先根据位图的尺寸,创建一个兼容位图,然后把图片绘制到兼容位图,接着把文字也写到兼容位图上,然后再从兼容位图得到合成的数据。二、关键程序段
    CreateMemObject(CDC *pDC, BITMAPINFO *lpbmi, int* pnLineChar)
    {
    if (NULL == m_pMemDC)
    {
    m_pMemDC = new CDC();
    m_pMemDC->CreateCompatibleDC(pDC);
    } if (m_pMemBmp != NULL)
    {
    m_pMemDC->SelectObject(m_pOldBmp);
    delete m_pMemBmp;
    m_pMemBmp = NULL;
    } m_pMemBmp = new CBitmap();       //根据图片的大小创建一个兼容位图
    m_pMemBmp->CreateCompatibleBitmap(pDC, m_lpBMPHdr->biWidth, m_lpBMPHdr->biHeight);
    m_pOldBmp = m_pMemDC->SelectObject(m_pMemBmp);
    m_pMemDC->FillSolidRect(0, 0, m_lpBMPHdr->biWidth, m_lpBMPHdr->biHeight, RGB(255, 255, 255)); 
            
    //把图像的数据绘制到兼容位图上

        SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject, 
    0, m_lpBMPHdr->biHeight, (LPVOID)m_lpDIBits, (BITMAPINFO*)m_lpBMPHdr, DIB_RGB_COLORS);
    }
    SetBmpText(const CString &strText, BOOL bRepaint)
    {
    //本函数在位图上添加文本 m_strBmpText = strText;

    SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject, 
    0, m_lpBMPHdr->biHeight, (LPVOID)m_lpDIBits, (BITMAPINFO*)m_lpBMPHdr, DIB_RGB_COLORS);
    if (m_strBmpText.GetLength() > 0)
    {
    //制造透明和重影效果 m_pMemDC->SetBkMode(TRANSPARENT);
    m_pMemDC->SetTextColor(RGB(0, 0, 0));
    m_pMemDC->TextOut(10, 10, m_strBmpText);
    m_pMemDC->SetTextColor(RGB(255, 255, 255));
    m_pMemDC->TextOut(11, 11, m_strBmpText);
    } if (bRepaint)
    {
    Invalidate();
    }}
    SetSaveBmpPath(LPCTSTR pszPath)
    {
    //从兼容位图中取出合成的数据 BYTE *pTemp = new BYTE[m_dwImageSize];
    ZeroMemory(pTemp, m_dwImageSize);

    int nCount = GetDIBits(m_pMemDC->GetSafeHdc(), 
    (HBITMAP)m_pMemBmp->m_hObject, 0, m_lpBMPHdr->biHeight, 
    (LPVOID)pTemp, (BITMAPINFO*)m_lpBMPHdr, DIB_RGB_COLORS);
    }
      

  9.   

    是VC知识库上面的吧?
    我帮你把结束语也拷了下来:四、结束语
    有关位图的读写,参考了VC知识库在线杂志第21期中胡卓玮朋友写的《位图文件读写综述》一文。
    本程序在win2000、vc6、174*218 24位真彩色图片下调试通过。
    本程序存在以下问题:
    1.不能在兼容DC里选择画笔、字体;
    2.从兼容位图里取数据,仅对真彩色位图有效。
    如果您知道如何解决以上问题,欢迎赐教。我的四个条件好像没有一个这个程序能做到的呀!
    不过还是非常感谢你的回复!
      

  10.   

    先把字符串写到某个DC上,然后可以用GetTextExtentPoint32获得字符串的宽度和高度。制作256色位图的话,Featured(阿卓仔)的代码需要改一下,不要获得屏幕色深,而是直接指定wBitCount = 8。
      

  11.   

    楼主研究研究这个吧:http://lzdbh.blogchina.com/blog/article_92634.481083.html
    http://www.csdn.com.cn/program/6038.htm
      

  12.   

    如果直接把这段代码改成这样就位图就"移位"了,圆也不是圆了,它先画右半圆再画左边,这是为什么呀?
    /*if (iBits <= 1) wBitCount = 1; 
    else if (iBits <= 4)  wBitCount = 4; 
    else if (iBits <= 8)  wBitCount = 8; 
    else   wBitCount = 24; */
    wBitCount = 8;了:谢谢你了羽战士!!
      

  13.   

    Featured(阿卓仔) pomelowu(羽战士) 
    为什么呀?为什么我改为8,位图生成的就不对了?怎么改呀?
      

  14.   

    不好意思,没时间研究Featured(阿卓仔)的代码,不过他的代码默认是给真彩图的吧,可能要改的地方不止一处。
    看看我给你的地址http://www.csdn.com.cn/program/6038.htm,研究一下其中的CreateBitmap就是了。
      

  15.   

    没办法!
    我只有先做一个有BUG的程序了再说,时间太紧了!总结一下:主要还是1,2两点无法解决.
    1.字符串足够长:至少100个字符吧,不能换行.一般的字符串如果超出屏幕宽度,生成的BMP就看不到超出的部分,我只好不让用户输入那么多字符了!
    2.生成的位图必须是256色的.如果系统是32位的,那么生成的BMP就是32位;如果系统是256色的,生成的BMP就是256色,所以我只有要求用户使用这个程序前将系统设为256色了!两个大大的BUG啊,没办法,兄弟们都搞不定,我也只好先这样做着先了!
    期待高手!!!!!!!!!!!!!!!!!!!!!!!!
      

  16.   

    汗~~那你想如何?前面说了,先计算出字符串的长度,然后构造bmp的时候根据这个来设置宽度啊,似乎你也没有这样处理。
      

  17.   

    DrawText()可能可以自动换行的吧?求证.