怎样用程序在内存生成一个灰色的bmp图片?

解决方案 »

  1.   

    生成一个灰度的BMp吧!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);
    }