怎样生成位图,然后还在位图上写字!背景色是黑色,字体颜色安行交替显示(红黄交替)
VC的问题,我应该使用那个函数?
谢谢各位的帮忙!

解决方案 »

  1.   

    CImage问题,
    CImage自己创建Create参数不多,查MSDN就成,创建位图简单。
    设置背景色:SetBkColor(),不知道是不是这么写,也可以GetClientRect ,然后FillRect弄背景色。
    字体颜色的话,CPen,可以选择颜色,然后CDC::SelectObject()选入再写。
      

  2.   

    使用GetDC()取得屏幕dc.
    使用CreateCompatibleDC()创建内存DC.
    使用CreateCompatibleBitmap()创建内存兼容位图.
    使用SelectObject()把位图选入内存DC.
    使用SetBkMode()把字体背景设为透明.
    使用SetTextColor()设置字体颜色.
    使用TextOut()写字使用BitBlt()显示刚写完的字.释放资源:
    使用SelectObject()把位图选出内存DC.
    使用DeleteDC()把CompatibleDC del掉.
    使用DeleteObject()把bmp del掉.
    使用ReleaseDC()把GetDC()得回来的dc释放~~
      

  3.   

    直接用CImage比较方便,在头文件中包含atlimage.h
    CImage newimg;
    if(!newimg.CreateEx(nWidth, nHeight, 24, BI_RGB))
    {
    oldimg.Destroy();
    return;
    }
    然后得到newimg的DC后,调用Rectangle,TextOut等函数绘制相应图元。
    最后调用newimg.Save("d:\\abc.bmp");保存成bmp文件就行了。
      

  4.   

    1. 创建MemDC 
    2. 创建位图 
    3. 将位图选入DC 
    4. 在MemDC上使用DrawText或者TextOut 
    5. 保存完成的位图。 
    大致的步骤就是这样吧。 为了方便你甚至可以这样;
    //先搞一幅图,自己画成黑色底的存为C:\1.bmp
    CImage image;
    image.Load(TEXT("C:\\1.bmp")); //加载图片
    CDC*pDC = CDC::FromHandle(image.GetDC());
    pDC->SetBkMode(TRANSPARENT);
    pDC->TextOut); //字体颜色和背景色根据实际需要随时修改就可以了。
    image.ReleaseDC();
    image.Save("C:\\1.bmp");
    这样就ok了,设置写的模式是“背景透明”
      

  5.   

    使用GetDC()取得屏幕dc. 
    使用CreateCompatibleDC()创建内存DC. 
    使用CreateCompatibleBitmap()创建内存兼容位图. 
    使用SelectObject()把位图,画笔,画刷选入内存DC. 
    使用SetBkMode(TRANSPARENT)把字体背景设为透明. 
    使用SetTextColor()设置字体颜色. 
    使用TextOut()写字 使用BitBlt()显示刚写完的字. 释放资源: 
    使用DeleteDC()把CompatibleDC del掉. 
    使用DeleteObject()把bmp del掉. 
    使用…
      

  6.   


    CImage  是VC的类么?  我在MSDN上占满找不到啊!?
      

  7.   

    但是没有被识别啊!error C2065: 'CImage' : undeclared identifier
      

  8.   

    这几个函数可以完全搞定,颜色你自己可以修改下
    BOOL C**Dlg::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 C**Dlg::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 );
        //得到屏幕位图的句柄 
        hBitmap = ( HBITMAP )SelectObject( hMemDC, hOldBitmap ); 
        //清除
        DeleteDC( hMemDC ); 
        DeleteObject( hOldBitmap ); 
        //返回位图句柄 
        return hBitmap;
    }void C**Dlg::OnbuildBitmap( )
    {
        CDC *pdc=GetDC();
    //----------------------------------------------------
    // 下面是创建兼容DC和兼容DC使用的CBitmap,并规定兼容
    // DC的绘图绘制在创建的CBitmap上。
    // 经过这一句:MenDC.SelectObject(&bm);以后,不管使用
    // MenDC绘制什么,实际上都是绘制在了CBitmap bm;这个内
    // 存位图上了.
    //----------------------------------------------------    CDC MenDC; 
        CBitmap bm;    
        MenDC.CreateCompatibleDC( pdc ); 
        bm.CreateCompatibleBitmap( pdc, WD+2, HT+2 ); //设定背景位图大小,最好是整个客户区大小
        MenDC.SelectObject( &bm );//----------------------------------------------------
    // 下面使用MenDC绘制你想要的任何东西,这里只添加了一个文本
    //----------------------------------------------------    MenDC.TextOut( 1, 1, "safds"); 
            //MenDC.MoveTo
            //MenDC.Ellipse  //所有绘图都在这个区间进行
    //----------------------------------------------------
    // 下面设定你要从CBitmap bm;上截取哪一部分。
    //----------------------------------------------------    RECT rt;
        rt.left = 0; rt.right  = cutWD+2;
        rt.top  = 0; rt.bottom = cutHT+2;//----------------------------------------------------    HBITMAP hBmp = CopyDCToBitmap( MenDC.GetSafeHdc(), &rt ); 
        SaveBmp( hBmp, "MM.bmp" );
        
    //----------------------------------------------------    bm.DeleteObject();
        MenDC.DeleteDC();
        ReleaseDC(pdc);
    }
      

  9.   

    生成位图:1.在资源视图(ResourceView)中import一个位图(.bmp)
      2.在Onpaint()函数或Ondraw()中添加下面代码
       CDC *pDC = GetDC();
       CDC memdc;
       CBitmap bitmap;
       BITMAP bmp;
       CRect rect;
       GetClientRect(rect);
       bitmap.LoadBitmap(IDB_BITMAP1);//import进来的位图ID:IDB_BITMAP1
       memdc.CreateCompatibleDC(pDC);
       memdc.SelectObject(&bitmap);
       bitmap.GetBitmap(&bmp);
       pDC->StretchBlt(rect.left,rect.top,
       bmp.bmWidth,bmp.bmHeight,
       &memdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
      

  10.   

    位图上写字:
    在上面的代码下面添加:
    CFont font;
    VERIFY(font.CreateFont(
    35,                        // nHeight
    0,                         // nWidth
    0,                         // nEscapement
    0,                         // nOrientation
    FW_NORMAL,                 // nWeight
    FALSE,                     // bItalic
    FALSE,                     // bUnderline
    0,                         // cStrikeOut
    ANSI_CHARSET,              // nCharSet
    OUT_DEFAULT_PRECIS,        // nOutPrecision
    CLIP_DEFAULT_PRECIS,       // nClipPrecision
    DEFAULT_QUALITY,           // nQuality
    DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
    "Arial"));  // lpszFacename
    CDC *pDC;
    CString str1 = "生 成 位 图";
    CString str2 = "添 加 字 体";
    pDC = GetDC();
    ASSERT(pDC);
    pDC->SelectObject(&font);
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(255,255,255));
    pDC->TextOut(90,2,str1);
    pDC->TextOut(120,35,str2);
    pDC->DeleteDC();