al.CreateHalftonePalette( &dc );
else
{
// 颜色数 <= 256 RGBQUAD *prgb="new" RGBQUAD[ncolors]; CDC memdc; memdc.CreateCompatibleDC(&dc); memdc.SelectObject( &bitmap ); ::GetDIBColorTable( memdc, 0, ncolors, prgb ); UINT nsize="sizeof(LOGPALETTE)" + (sizeof(PALETTEENTRY) * ncolors); LOGPALETTE *plp="(LOGPALETTE" *) new byte[nsize]; plp->palVersion = 0x300;
plp- >palNumEntries = ncolors;
for( int i=0; ipalPalEntry[i].peRed = prgb[i].rgbRed;
plp- >palPalEntry[i].peGreen = prgb[i].rgbGreen;
plp- >palPalEntry[i].peBlue = prgb[i].rgbBlue;
plp- >palPalEntry[i].peFlags = 0;
}
pal.CreatePalette( plp );
delete plp;
delete prgb;
}
return TRUE;
}
2.显示位图
在WM_PAINT消息的响应函数OnPaint()中实现。
void OnPaint()
{
CPaintDC dc(this); // device context for painting
// create a memory dc compatible with the paint dc
CDC memdc;
memdc.CreateCompatibleDC( &dc );
CBitmap bitmap;
CPalette palette;
long nWidth;
long nHeight;
//调用该函数
GetBitmapandPalette("e:\\project\\
showimage\\bitmap1.bmp",bitmap,palette ,
&nWidth,&nHeight);
memdc.SelectObject( &bitmap );
// select and realize the palette
if( dc.GetDeviceCaps(RASTERCAPS) &
RC_PALETTE && palette.m_hObject != NULL )
{
dc.SelectPalette( &palette, FALSE );
dc.RealizePalette();
}
//显示位图
dc.BitBlt(0, 0, nWidth,nHeight, &memdc, 0, 0,SRCCOPY);
}
---- 以上
程序只是简单的从一个固定路径(e:\\project\\showimage\\bitmap1.bmp)装入位图,读者可以将其功能扩充,如通过对话框选取等等,在此不多赘述。
---- 最后还要补充的一点是,如果要显示的位图是作为位图资源与程序联系在一起的,对以上
程序稍作修改即可显示出来,修改方法如下:
首先将GetBitmapandPalette()函数改为:
BOOL GetBitmapandPalette(UINT nidresource,
CBitmap &bitmap, CPalette &pal,long *w,long *h)
其中nidresource是该位图的ID。
然后将GetBitmapandPalette()中的第一句改为:
LPCTSTR lpszresourcename = (LPCTSTR)nidresource;
并将LoadImage函数改为:
HBITMAP hbmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(),
nidresourcename,IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION);
最后,在OnPaint函数中调用GetBitmapandPalette()时,
将位图的ID
通过nidresource传入即可