VC++:SetDIBitsToDevice 及StretchDIBits

SetDIBitsToDevice :该函数使用DIB位图和颜色数据对与目标设备环境相关的设备上的指定矩形中的像素进行设置。

StretchDIBits 函数将DIB中矩形区域内像素使用的颜色数据拷贝到指定的目标矩形中。如果目标矩形比源矩形大小要大,那么函数对颜色数据的行和列进行拉伸,以与目标矩形匹配。如果目标矩形大小要比源矩形小,那么该函数通过使用指定的光栅操作对行列进行压缩。

GetDIBits : 检索指定的位图位,并将它们,设备无关的格式复制到 lpBits 参数中指定的缓冲区。

原文:http://blog.csdn.net/craigyang/article/details/4483311

void CDibView::OnDraw(CDC* pDC)
{
       
    BITMAPINFO bmpinfo = {0};  
    bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); //必须,初始化bmpinfo.bmiHeader中的第一个参数  

    HBITMAP hBitmap = LoadBitmap(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDB_CLASS_VIEW));  
    if(NULL == hBitmap)  
        MessageBoxA(HWND_TOP, "LoadBitmap error", "WM_PAINT", MB_OK);  

    int scanline = GetDIBits(pDC->m_hDC, hBitmap, 0, 0, NULL, &bmpinfo, DIB_RGB_COLORS);//初始化bmpinfo.bmiHeader中第二到第四3个参数  
    if(0 == scanline)   //windows API  
        MessageBoxA(HWND_TOP, "GetDIBits error", "WM_PAINT", MB_OK);  

    bmpinfo.bmiHeader.biCompression = BI_RGB;       //必须  
    bmpinfo.bmiHeader.biPlanes = 1;                 //必须  
     //      bmpinfo.bmiHeader.biXPelsPerMeter = 10000;      //可以有可以木有  
    //      bmpinfo.bmiHeader.biYPelsPerMeter = 10000;      //可以有可以木有  
    //      bmpinfo.bmiHeader.biSizeImage   = 0;            //可以有可以木有  
    //总共初始化bmpinfo.bmiHeader中前六个参数,接下来可以利用初始化过得bmpinfo结构将位图数据copy进大小分配好的内存中  


    char buff[MAX_PATH];  
    sprintf(buff, "width: %d/nheight: %d/nbiBitCount: %d/nXPerMeter: %d/nYPerMeter: %d",   
        bmpinfo.bmiHeader.biWidth, bmpinfo.bmiHeader.biHeight, bmpinfo.bmiHeader.biBitCount,
        bmpinfo.bmiHeader.biXPelsPerMeter, bmpinfo.bmiHeader.biYPelsPerMeter);  
    //      MessageBoxA(hWnd, buff, "WM_PAINT", MB_OK);  

    void* pdata = malloc(LINE_BYTES(bmpinfo.bmiHeader.biWidth,bmpinfo.bmiHeader.biBitCount)*bmpinfo.bmiHeader.biHeight);  
    if(pdata == NULL)  
    {  
        MessageBoxA(HWND_TOP, "Malloc Memory Error!", "WM_PAINT", MB_OK);  
        return ;  
    }  
    scanline = GetDIBits(pDC->m_hDC, hBitmap, 0, bmpinfo.bmiHeader.biHeight, (LPVOID)pdata, &bmpinfo, DIB_RGB_COLORS);  
    if(0 == scanline)   //windows API  
        MessageBoxA(HWND_TOP, "GetDIBits error2", "WM_PAINT", MB_OK);  

    sprintf(buff, "scanline: %d", scanline);  
    //      MessageBoxA(hWnd, buff, "WM_PAINT", MB_OK);  

    sprintf(buff, "width: %d/nheight: %d/nbiBitCount: %d/nXPerMeter: %d/nYPerMeter: %d",   
        bmpinfo.bmiHeader.biWidth, bmpinfo.bmiHeader.biHeight, bmpinfo.bmiHeader.biBitCount,   
        bmpinfo.bmiHeader.biXPelsPerMeter, bmpinfo.bmiHeader.biYPelsPerMeter);  


    //贴图
    ::SetDIBitsToDevice(pDC->m_hDC,  0, 0,bmpinfo.bmiHeader.biWidth,   
        bmpinfo.bmiHeader.biHeight, 0, 0, 0, bmpinfo.bmiHeader.biHeight,  
        pdata, (BITMAPINFO*)&bmpinfo, DIB_RGB_COLORS);
     //拉伸
    ::StretchDIBits(pDC->GetSafeHdc(),0,0,bmpinfo.bmiHeader.biWidth * 4,bmpinfo.bmiHeader.biHeight * 4,
                    0,0,bmpinfo.bmiHeader.biWidth,bmpinfo.bmiHeader.biHeight,pdata,
                    (BITMAPINFO*)&bmpinfo,DIB_RGB_COLORS,SRCCOPY );

    free(pdata);  

    //EndPaint(m_hWnd, &ps);  
}

你可能感兴趣的:(api,null,Class,Path,vc++,colors)