在Windows窗口上显示BMP图像代码如下所示。这里主要用到了StretchDIBits()函数,此函数将BMP图像像素拷贝到显示设备上下文中,拉伸并显示出来。如果是索引图像,则需要先创建逻辑调色板,并调用SelectPalette()函数选用这个逻辑调色板;如果是真彩色图像,则没有调色板。Windows系统中调色板使用CPalette类,调色板大小一般由信息头的biClrUsed成员指定,如果biClrUsed值为0,则没有调色板。 在Windows窗口中显示BMP图像功能:在Windows窗口中显示BMP图像输入:hDC,显示设备上下文句柄;rectDC,图像显示在设备中的位置;输入:bmpHeader,BITMAPINFO结构体指针,包含位图信息头和调色板;输入:pBmp,图像像素数据;返回值:显示成功返回TRUEdefinePALVERSION0x300BOOLDisplayBMPImg(constHDChDC,constCRectrectDst,constBITMAPINFObmpHeader,constunsignedcharpBmpBits){BITMAPINFOHEADERinfoHeaderbmpHeaderbmiH创建Windows调色板CPHPALETTEpOldPaletteNULL;LOGPALETTEpLPNULL;if(infoHeader。biBitCount0infoHeader。biBitCount16){intnNumClrsinfoHeader。biClrU从信息头得到调色板大小if(0nNumClrs){如果没有调色板大小为0直接计算得到图像所用颜色数nNumClrspow(float(2),infoHeader。biBitCount);}计算逻辑调色板所需空间DWORDnSizesizeof(LOGPALETTE)sizeof(PALETTEENTRY)nNumCpLP(LOGPALETTE)newunsignedchar〔nSize〕;初始化逻辑调色板pLPpalVersionPALVERSION;固定值pLPpalNumEntriesnNumCfor(inti0;inNumCi){pLPpalPalEntry〔i〕。peRedbmpHeaderbmiColors〔i〕。rgbRpLPpalPalEntry〔i〕。peGreenbmpHeaderbmiColors〔i〕。rgbGpLPpalPalEntry〔i〕。peBluebmpHeaderbmiColors〔i〕。rgbBpLPpalPalEntry〔i〕。peFlags0;}创建调色板palette。CreatePalette(pLP);HPALETTEhPal(HPALETTE)palette。mhO系统选用新的调色板,并保存旧的调色板pOldPalette::SelectPalette(hDC,hPal,FALSE);}设置图像显示的拉伸模式,解决位图显示的失真问题::SetStretchBltMode(hDC,COLORONCOLOR);调用WindowsAPI函数显示位图图像BOOLbSuccess::StretchDIBits(hDC,设备上下文句柄rectDst。left,目标矩形x坐标rectDst。top,目标矩形y坐标rectDst。Width(),目标矩形宽度rectDst。Height(),目标矩形高度0,图像起点x坐标0,图像起点y坐标infoHeader。biWidth,图像宽度abs(infoHeader。biHeight),图像高度pBmpBits,图像像素指针bmpHeader,BITMAPINFO结构体指针DIBRGBCOLORS,wUsageSRCCOPY);dwROP恢复原有调色板if(NULL!pOldPalette){pOldPalette::SelectPalette(hDC,pOldPalette,FALSE);}palette。DeleteObject();删除调色板对象if(NULL!pLP){delete〔〕pLP;}returnTRUE;}