专栏中心

EEPW首页 > 专栏 > bmp文件的显示(好像以前没写过)

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

发布人:0750long 时间:2009-07-14 来源:工程师 发布文章
bmp文件的显示(好像以前没写过)

    以前写的代码,最近发现自己在同一个界面显示多个图片的时候出现了问题,才回来重新看着个函数,其实原来自己根本不理解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;
}
/**********************************

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

2025年第三季度,全球开放式耳机(OWS)出货量突破1,000万台,华为领跑,TWS市场逐渐转向价值创造

2025 Christmas LED 圣诞耳环

嵌入式系统 2025-12-12

基于MSP430单片机的虚拟I2C总线软件包VIIC_M1.0

CES 2010:XSTREAMHD 展位的演示视频

视频 2010-01-18

表面贴装X、Y型电容首次获得AEC-Q200认证

CES 2010:enTourage正式发布双屏电子书eDGe

视频 2010-01-18

CES 2010:外星人...Alienware M11X 推出

视频 2010-01-18

Cincoze Din-Rail电脑(MD-3000)为机器视觉打造可靠的实时运算核心

基于MSP430F149单片机实现的步进电机通用控制器

借助TOLL GaN突破太阳能系统的界限

CES 2010:海信周厚健在CES高峰论坛发表主题演讲

视频 2010-01-18

CES 2010:WiFi充电器 利用无线信号为手机充电

视频 2010-01-18

基于P87LPC764单片机的电压表

基于P87LPC762 单片机的电子时间继电器

视觉-语言-行动模型为自动驾驶开辟了四级前沿

中国汽车月度产量首次超过350万辆,车市消费热度持续上升

DIY 3D-打印 String Shooter —— 深度技术解析与电机/摩擦/电路的工程原理

嵌入式系统 2025-12-12

Snapdragon Ride Flex加速舱驾融合落地,多款新车型集中发布

现代电源设计工具

基于P87LPC764单片机的ADC应用设计方法初探

资源下载 2007-02-16
更多 培训课堂
更多 焦点
更多 视频

技术专区