原创 bmp文件的显示(好像以前没写过)

2009-7-9 23:22 2797 7 7 分类: 软件与OS
    以前写的代码,最近发现自己在同一个界面显示多个图片的时候出现了问题,才回来重新看着个函数,其实原来自己根本不理解SetDIBitsToDevice的含义
   点击看大图

这个函数里面xdest ydest决定显示的位置
dwwidth dwheigth xsrc ysrc决定图片显示的区域
原来自己的错误就是没理解xdest ydest dwwidth dwheigth的关系,才出错

/**********************************************
如果要显示图片的一块,lpDCRect和lpDIBRect的快高相等
计算方法
    LONG  DCWIDTH  = lpDCRect->right - lpDCRect->left;

    LONG  DCHEIGTH = lpDCRect->bottom;



    LONG  DIBWIDTH  = lpDIBRect->right - lpDIBRect->left;

    LONG  DIBHEIGTH = lpDIBRect->bottom - lpDIBRect->top;
xsrc ysrc决定开始的位置
//**********************************************
/*
hDC:      设备句柄
lpDCRect: left 和 top决定显示区域的起始点,bottom 和 right 决定显示的方式,如果
           与lpDIBRect的宽高相等,那么使用SetDIBitsToDevice否则使用StretchDIBits
lpDIBRect:图片的显示区域,决定图片的显示区域
pbmpinfo: 图片的信息头
pbmpdata: 图片数据
*/
//************************************************
BOOL PrintDIB(HDC hDC,LPRECT lpDCRect,LPRECT lpDIBRect,BITMAPINFO *pbmpinfo,BYTE *pbmpdata)
{
    BOOL bSuccess=TRUE;
  
    if (lpDCRect->bottom == 0 || lpDCRect->right == 0)
    {
        return FALSE;
    }

    if (lpDIBRect->bottom == 0 || lpDIBRect->right == 0)
    {
        return FALSE;
    }

    LONG  DCWIDTH  = lpDCRect->right - lpDCRect->left;
    LONG  DCHEIGTH = lpDCRect->bottom;

    LONG  DIBWIDTH  = lpDIBRect->right - lpDIBRect->left;
    LONG  DIBHEIGTH = lpDIBRect->bottom - lpDIBRect->top;
    //如果不是24位色彩
    HPALETTE temp_pPal;
    HPALETTE HPal;
    if (GetNumColors(pbmpinfo))
    {
        CPalette* pPal;
        pPal=CreateBmpPalatte(pbmpinfo);
        HPal=(HPALETTE)(pPal->m_hObject);
        temp_pPal = ::SelectPalette(hDC,HPal,TRUE);
        ::RealizePalette(hDC);       
    }
    // 设置显示模式
    ::SetStretchBltMode(hDC, COLORONCOLOR);
    /* Determine whether to call StretchDIBits() or SetDIBitsToDevice() */
    if (DCWIDTH == DIBWIDTH && DCHEIGTH == DIBHEIGTH)
    {
    bSuccess = ::SetDIBitsToDevice(    
                                        hDC,                       // hDC
                                        lpDCRect->left,            // DestX
                                        lpDCRect->top,             // DestY

                                          DIBWIDTH,                  // nDestWidth
                                        DIBHEIGTH,                 // nDestHeight

                                         lpDIBRect->left,           // SrcX
                                          lpDIBRect->top,            // Srcy

                                           0,                           // nStartScan
                                          lpDIBRect->bottom,        
                                         pbmpdata,                  // lpBits
                                          pbmpinfo,                  // lpBitsInfo
                                           DIB_RGB_COLORS             // wUsage
                                     );   
    }
 

//    CRect DCRect1=CRect(0,0,320,256);
//    CRect DCRect2=CRect(400,0,720,256);
//    CRect DCRect3=CRect(0,300,320,256);
//    CRect DCRect4=CRect(400,300,720,256);
    else
    {
        bSuccess = ::StretchDIBits(
                                      hDC,                       // hDC
                                      lpDCRect->left,            // DestX
                                      lpDCRect->top,             // DestY
                                      DCWIDTH,                     // nDestWidth
                                      DCHEIGTH,                     // nDestHeight

                                      lpDIBRect->left,           // SrcX
                                      lpDIBRect->top,            // SrcY
                                      DIBWIDTH,
                                      DIBHEIGTH,        
                                      pbmpdata,                  // lpBits
                                      pbmpinfo,                  // lpBitsInfo
                                      DIB_RGB_COLORS,            // wUsage
                                      SRCCOPY
                                  );  
    }
      
   
    ::SelectPalette(hDC,temp_pPal,TRUE);
    //delete temp_pPal;
    return bSuccess;
}
/**********************************
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /1 下一条