Programming °æ (¾«»ªÇø)
·¢ÐÅÈË: oli (ÎÒЦÎÒ³ÕÎÒñ²¿ñ), ÐÅÇø: Programming
±ê Ìâ: vc++
·¢ÐÅÕ¾: ×϶¡Ïã (Fri Sep 19 22:05:05 1997)
1996Äê .µÚ51ÆÚ .Èí¼þÓë±à³Ì
±à³Ì¼¼ÇÉ
WindowsÏ»ùÓÚVisual C++Õæ²ÊÉ«BMPÎļþµÄÏÔʾ
ËÄ´¨ÁªºÏ´óѧ¡¡ÎÞÏßµçϵ(610064)ÂÞöÁ
³£ÓõÄBMPÎļþÓÐÁ½´óÌØÕ÷:Ê×ÏÈËü¿ÉÃèÊöÓжà´ï24λ²ÊÉ«µÄͼÏñ;Æä´ÎËüµÄͼÏñÊÇÒÔ·ÇѹËõ·½Ê½´æ´¢µÄ¡£
BMPÎļþ½á¹¹
BMPÎļþ¸ù¾ÝWindows¿ª·¢¹¤¾ßSDKÖеÄWindows.h¶¨ÒåµÄ½á¹¹·Ö³ÉÒÔϼ¸²¿·Ö:
1.BITMAPFILEHEADER(BMPÎļþÍ·)
2.BITMAPINFOHEADER(BMPÎļþÐÅϢͷ)
3.RGBQUAD(BMPÎļþµ÷É«°åÈë¿Ú)
4.BITMAP DATA(BMPÎļþÊý¾Ý)
ÒÔÏÂÖðÒ»½éÉܸ÷²¿·Ö:
1.BITMAPFILEHEADER(BMPÎļþÍ·)
typedef struct tagBITMAPFILEHEADER {
/* bmfh */
UINT bfType;¡ÎÎļþÀàÐͱêÖ¾,±ØÐëΪ"BM"
DWORD bfSize;¡ÎÎļþ´óС,ÒÔ×Ö½Ú¼ÆËã
UINT bfReserved1;¡Î±£Áô±ØΪ0
UINT bfReserved2;¡Î±£Áô±ØΪ0
DWORD bfOffBits;¡ÎλͼÊý¾Ý¿ªÊ¼µÄÆ«ÒÆ×Ö½ÚÊý
}BITMAPFILEHEADER;
ÆäÖÐ,bfTypeÊÇBMPÎļþµÄÀàÐͱêÖ¾,ÊÇ"BM"×Ö·û´®,ÊÇ"bitmap"µÄËõд;bfSize¶¨ÒåÕû¸öÎļþµÄ´óС;bfOffBits¶¨ÒåÁËλͼÊý¾Ý¿ªÊ¼µÄÆ«ÒÆ×Ö½ÚÊý,ʵ¼ÊΪBMPÎļþÍ·µÄ´óС¡£
2.BITMAPINFOHEADER(BMPÎļþÐÅϢͷ)
typedef struct tagBITMAPINFOHEADER {
/* bmih */
DWORD biSize;¡ÎBITMAPINFOHEADER½á¹¹µÄ´óС
LONG biWidth;¡ÎλͼµÄ¿í¶È
LONG biHeight;¡ÎλͼµÄ¸ß¶È
WORD biPlanes;¡ÎλͼÏÔʾÉ豸λÊý
WORD biBitCount;¡ÎλͼÑÕɫλÊý
DWORD biCompression;¡ÎѹËõ±êÖ¾
DWORD biSizeImage;¡ÎͼÏñ×Ö½ÚÊý
LONG biXPelsPerMeter;¡ÎͼÏñX·½Ïò·Ö±æÂÊ
LONG biXPelsPerMeter;¡ÎͼÏñY·½Ïò·Ö±æÂÊ
DWORD biClrUsed;¡ÎͼÏñÑÕÉ«Êý
DWORD biClrImportant;¡ÎͼÏñÖØÒªÑÕÉ«Êý
}BITMAPINFOHEADER;
ÆäÖÐ,biSizeΪBITMAPINFOHEADER½á¹¹µÄ´óС,³£³£Îª28H;biWidth¡¢biHeight·Ö±ð¶¨ÒåÁËλͼµÄͼÏñ¿í¶ÈºÍͼÏñ¸ß¶È;biPlanes±íʾÁË×îÖÕ¹Û²ìλͼͼÏñµÄÄ¿±êÏÔʾÉ豸µÄλÊý,Ëüͨ³£ÊDz»Æð×÷ÓÃ,µ«È´ÊÇMi-crosoftËùÐèÒªµÄ;biBitCount¶¨ÒåÁËλͼÿÏóËØÑÕÉ«µÄλÊý,Ëü¿ÉΪ1¡¢4¡¢8»ò24;biCo
mpression±ê־λͼÊÇ·ñѹËõµÄ±êÖ¾,ËüÓÐBI_RGB¡¢BI_RLE4¡¢BI_RLE8µÈ¼¸ÖÖÀàÐÍ,ÆäÖÐ,BI_RGBÀàÐÍΪ·ÇѹËõ,BI_RLE4ºÍBI_RLE8ΪÐг̱àÂëѹËõ;biSizeImageΪͼÏñ´óСµÄ×Ö½ÚÊý,Ëü¿ÉÓÉÎļþÍ·ÖеÄÆäËûÓò¼ÆËã³ö,Ðè×¢ÒâµÄÊÇÿÅÅÏóËرØÐëÔÚ32λ»òÆ䱶ÊýÉϽáÊø,Èç¹ûÒ»ÅÅÏóËص½²»ÁË32λ±ß½ç
ÉÏÔòÓÃ"0"Ìî³äÆäÓàλ;biXPelsPerMeterºÍbiYPelsPerMeterÊÇ˵Ã÷ͼÏñµÄ·Ö±æÂÊ;biClrUsedÊÇͼÏñËùʹÓõÄÑÕÉ«Êý,Èç¹û²»ÓÃÖÃΪ0,±íʾËùÓеÄÑÕÉ«¶¼Óõ½,Èç¹ûλͼ±»Ñ¹Ëõ,Ôò±ØÐëÖÃΪ0;biClrImportantÊÇͼÏóÖÐÖØÒªµÄÑÕÉ«Êý,ͨ³£ÖÃΪ0,±íʾËùÓеÄÑÕÉ«¶¼ÖØÒª¡£
3.RGBQUAD(BMPÎļþµ÷É«°åÈë¿Ú)
typedef struct tagRGBQUAD { /* rgbq */
BYTE rgbBlue;¡ÎÑÕÉ«µÄÀ¶É«·ÖÁ¿
BYTE rgbGreen;¡ÎÑÕÉ«µÄÂÌÉ«·ÖÁ¿
BYTE rgbRed;¡ÎÑÕÉ«µÄºìÉ«·ÖÁ¿
BYTE rgbReserved;¡Î±£Áô,Ϊ0
}RGBQUAD;
RGBQUADÊý¾Ý½á¹¹ÊÇBMPËù°üº¬µÄÑÕÉ«±í,½ÓÔÚBITMAPINFOHEADER½á¹¹Ö®ºóº¬ÓÐλͼÖÐÓõ½µÄÿÖÖÑÕÉ«µÄRGBÑÕÉ«,ÔÚλͼÖÐÓжàÉÙÑÕÉ«,¾ÍÓжàÉÙRG-BQUADÊý¾Ý½á¹¹Ïî,Èç¹ûbiClrUsedµÄÖµ´óÓÚ"0",ÔòbiClrUsedÖµ¾ÍÊÇRGBQUADÔªËصÄÊýÄ¿¡£
Windows.hÖл¹¶¨ÒåÁËÒ»¸öÊý¾Ý½á¹¹BITMAPINFO½á¹¹:
typedef struct tagBITMAPINFO { /* bmi */
BITMAPINFOHEADER bmiHeader;//ÎļþÐÅϢͷ
RGBQUAD bmiColors[1];//µ÷É«°åÈë¿Ú
} BITMAPINFO;
BITMAPINFOʵ¼ÊÉÏÊÇÁ½¸ö²¿·ÖºÏ³ÉµÄÒ»¸ö½á¹¹,Ëü½ö½öÉêÇëÁËÒ»¸öµ¥Ôª,´Ëµ¥Ôª½ö½öÊÇռλ,ÒòΪÑÕÉ«ÊýÊDz»¹Ì¶¨µÄ¡£
4.BITMAP DATA(BMPͼÏóÊý¾Ý)
BMPÎļþÖÐλͼ»¯µÄͼÏñÊý¾ÝÊÇÒÔÁ¬ÐøÐеÄÐÎʽ´¢´æµÄ,µ«Í¼ÏñÊÇÒÔÏà·´µÄ˳Ðò´¢´æ,¼´Îļþ¶Á³öµÄµÚÒ»ÐÐÊÇͼÏñµÄ×îºóÒ»ÐС£
ÏÂͼÏÔʾÁËBMPÎļþµÄÍêÕû½á¹¹:
ÎļþÍ·¡¡ÎļþÐÅϢͷ¡¡µ÷É«°åÈë¿Ú¡¡Í¼ÏñÊý¾Ý
WindowsÖÐλͼ¸ñʽ
WindowsÖÐλͼÓÐÁ½ÖÖ¸ñʽ:Ò»ÖÖ±»³ÆΪ"É豸Ïà¹Ø"λͼ(Device Depend
Bitmap¼´DDB),ÁíÒ»ÖÖ±»³ÆΪ"É豸ÎÞ¹Ø"λͼ(Device Independ Bitmap¼´DIB)¡£
1.DDBλͼ¸ñʽ
DDBλͼ¸ñʽÊÇÓÉBITMAPÊý¾ÝÀàÐ͵Ľṹ¼ÓÉÏͼÏñÊý¾Ý¹¹³É¡£ÔÚWindows.hÖÐBITMAPÊý¾ÝÀàÐͽṹÈçÏÂ:
typedef struct tagBITMAP { /* bm */
int bmType;//ͨ³£Îª0
int bmWidth;//ÏóËصã¿í¶È
int bmHeight;//ÏóËصã¸ß¶È
int bmWidthBytes;//ÿÐÐÊý¾ÝµÄ×Ö½ÚÊý,±ØΪżÊý
BYTE bmPlanes;//ÏÔʾÉ豸µÄɫλÃæÊý
BYTE bmBitsPixel;//ÿÏóËصÄλÊý
void FAR* bmBits;//Ö¸ÏòÏóËØÊý¾ÝµÄÖ¸Õë
} BITMAP;
ÆäÖÐ,ÏóËØÊý¾Ý´æ·ÅÔÚbmBitsÖ¸¶¨µÄÄڴ滺³åÇø,Õâ¿éÄÚ´æ¿Éµ¥¶À·ÖÅä,µ«Í¨³£¾Í½ÓÔÚÍ·²¿Êý¾ÝÄÚ´æÇøµÄºóÃæ¡£
DDBλͼ¿ÉÒԺܺõؽ«ÆÁÄ»ÉϵÄÄÚÈÝ¿½±´µ½ÄÚ´æÖÐ,Óֿɺܷ½±ãµØ½«ËüÕ³Ìùµ½ÆÁÄ»ÆäËûλÖÃ,Windows¶Ô´ËÀà²Ù×÷ÌṩÁ˹㷺µÄÖ§³Ö¡£È»¶øËüÈ´´æÔÚןÜÑÏÖصÄÎÊÌâ,DDBûÓб£´æλͼµÄµ÷É«°å,Õâ¾ÍÔì³ÉÁËÒ»¸öʹÓõÄÇ°Ìá:λͼ±ØÐëÔÚͬÀàÉ豸ÖÐÏÔʾ,²¢ÇÒ´ËÉ豸ÔÚλƽÃæ»ò²ÊÉ«ÉÏÓëÔÉ豸ÓÐͬÑ
ùµÄÉ«²Ê°²ÅÅ,·ñÔòÉ«²Ê¿ÉÄÜÍêȫʧÕæ¡£
2.DIBλͼ¸ñʽ
DIBλͼ¸ñʽÓÉÈý²¿·Ö¹¹³É,¼´BITMAPIN-FONEADER(ÎļþÐÅϢͷ)¡¢RGBQUAD(µ÷É«°åÈë¿Ú)ºÍBITMAPDATA(ͼÏñÊý¾Ý)¹¹³É¡£Ëüʵ¼Ê¾ÍÊÇBMPÎļþÈ¥µôBITMAPFILEHEADER(ÎļþÍ·)¡£
BMPÎļþµÄÏÔʾ
BMPÎļþÓÐÁ½ÖÖÏÔʾ·½·¨:Ê×ÏȽ«BMPÎļþ¶Á³ÉDIB¸ñʽ,µ±ÏÔʾʱ,Ò»ÖÖÊÇÖ±½Ó½«DIBÏÔʾ,ÁíÒ»ÖÖÊǽ«DIBת»¯ÎªDDB,ÔÙÏÔʾDDB¼´¿É¡£ÏÂÃæ·Ö±ð½«Á½ÖÖ·½·¨¼ÓÒÔÌÖÂÛ¡£ÏÞÓÚƪ·ù,½öÌÖÂÛ256É«ºÍÕæ²ÊÉ«·ÇѹËõλͼÔÚÕæ²ÊÉ«·½Ê½ÏµÄÏÔʾ¡£
1.¶ÁÈëBMPµ½DIBÖÐ
ÒÔÏÂΪ¹Ø¼ü³ÌÐò¶Î,ÆäÓàÂÔÈ¥¡£
Cfile *File;
File=new CFile(fn,CFile::modeRead|CFile::shareDenyWrite);
BITMAPFILEHEADER bmphead;//ÎļþÍ·
BITMAPINFOHEADER inf_head;//ÎļþÐÅϢͷ
//File Ϊ´ò¿ªµÄBMPÎļþ,ÏȶÁÈëÎļþÍ·
File-£¾Read(&bmphead,sizeof(BITMAPFILEHEADER));
//BMPÎļþ±ê־Ϊ0x4d42
if(bmphead.bfType!=0x4d42){
MessageBox(NULL,"\n Not a BMP File !",NULL,MB_OK);
return(NOT_BMP);
}
//ÅжÏΪBMPºó,ÔÙ¶ÁÈëÐÅϢͷ
File-£¾Read(&inf_head,sizeof(BITMAPINFOHEADER));
//Ö»ÏÔʾ·ÇѹËõλͼ
if(inf_head.biCompression!=0){
MessageBox(NULL,"\n Can't display a compressive File !\n",NULL,MB_OK);
return(NOT_SURPORT);
}
nPicWidth=(short)inf_head.biWidth;//ͼÏó¿í¶È
nPicHeight=(short)inf_head.biHeight;//ͼÏó¸ß¶È
//ͼÏó¿í¶È±ØÐëΪżÊý
if(nPicWidth%2==1){
bOddLine=TRUE;
nPicWidth++;
}
else{
bOddLine=FALSE;
}
//ͼÏóÑÕɫΪ256É«ÒÔÉÏ
if(inf_head.biBitCount£¼8){
MessageBox(NULL,"\n Can't display File less than 256!\n",NULL,MB_OK);
return(NOT_SURPORT);
}
//ÏóËØ¿í¶ÈΪ8bitλ,¼´256ɫʱ
if(inf_head.biBitCount==8){
bPal=TRUE;//ÊÇ·ñÓе÷É«°å
nPalNum=(short)1£¼£¼inf_head.biBitCount;//µ÷É«°åÊýÄ¿
}
//ÏóËØ¿í¶È×Ö½ÚÊý
nPixelWidth=(short)inf_head.biBitCount/8;
//ÊÇ·ñѹËõ
nCompress=(short)inf_head.biCompression;
//ÏóËØÊý¾ÝÆ«ÒÆ
nOffset=bmphead.bfOffset;
//Óе÷É«°å,¶ÁÈë²¢Ìî³ä
if(bPal){
nPalBegin=0;
File-£¾Read(Pal,nPalNum*4);
//×¢Òâ,BMPµÄµ÷É«°åÊÇÒ»¸öÑÕÉ«Ò»¸ö×Ö,¼´4¸ö×Ö½Ú¡£
}
//×é×°³ÉDIB
//Ìî³äBITMAPINFOHEDAER
BITMAPINFOHEADER bi;
LPBITMAPINFO lpbi;
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=nPicWidth;
bi.biHeight=nPicHeight;
bi.biPlanes=1;//256É«ºÍÕæ²ÊÉ«·½Ê½Ê±Îª1
if((nPixelWidth!=2)&&(nPixelWidth!=4)){
bi.biBitCount=8*nPixelWidth;
}
else{
bi.biBitCount=24;
}
bi.biCompression=Bl_RGB;
bi.biSizeImage=(DWORD)nPicBufSize;
bi.biXPelsPerMeter=0;
bi.biYPelsPerMeter=0;
bi.biClrUsed=0;
bi.biClrImportant=0;
//ΪDIBÉêÇëÒ»¿éÄÚ´æ
hMem=::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
(sizeof(BITMAPINFO)+(long)(nPalNum-1)*4+(long)nPicBufSize));
ASSERT(hMem);
//ÉêÇë³É¹¦ÔòËø¶¨ÄÚ´æ
if(hMem!=NULL){
lpbi=(LPBITMAPINFO)::GlobalLock(hMem);
*(LPBITMAPINFOHEADER)lpbi=bi;
//Óе÷É«°åÔòÌîµ÷É«°å
if(bPal){
short i;
for(i=nPalBegin;i£¼nPalNum;i++){
lpbi-£¾bmiColors[i].rgbRed=Pal[i].Red;
lpbi-£¾bmiColors[i].rgbBlue=Pal[i].Blue;
lpbi-£¾bmiColors[i].rgbGreen=Pal[i].Green;
}
}
::GlobalUnlock(hMem);
}
else return NO_MEM;
//µÃµ½Í¼ÏñÊý¾Ý»º´æPicBuf[i]
//Ëø¶¨DIBÄÚ´æ
lpbi=(LPBITMAPINFO)::GlobalLock((HGLOBAL)hMem);
//µÃµ½DIBÏóËØÊý¾ÝÖ¸Õë
lpBuf=(BYTE huge*)((LPSTR)lpbi+*(LPDWORD)lpbi+nPalNum*sizeof(RGBQUAD));
//ÓÃPicBuf[i]Ö¸ÏòµÚiÐÐ
PicBuf=(BYTE huge**)malloc(4*nPicHeight);
if(PicBuf==NULL) return NO_MEM;
for(i=0;i£¼nPicHeight;i++){
PicBuf[i]=NULL;
}
if((nPixelWidth!=2)&&(nPixelWidth!=4)){
for(i=0;i£¼nPicHeight,i++){
PicBuf[i]=(BYTE huge*)lpBuf+(long)nPicWidth*i*nPixelWidth;
}
}
else{
for(i=0;i£¼nPicHeight,i++){
PicBuf[i]=(BYTE huge*)lpBuf+(long)nPicWidth*i*3L;
}
}
//¶ÁÈëͼÏñÊý¾Ý
File-£¾Seek(nOffset,CFile::begin);
//Ò»ÐÐÈô·ÇÆæÊýµã,Ôò¿ÉÒ»´Î¶ÁÈë
//PicBuf[i]ΪµÚiÐеĻº³åÇø
if(bOddLine==TRUE){
for(i=0;i£¼nPicHeight;i++){
if(File-£¾ReadHuge(PicBuf[i],nPixelWidth*(nPicWidth-1))!=
(unsigned)nPixelWidth*(nPicWidth-1))return ERR;
}
}
else{
for(i=0;i£¼nPicHeight;i++){
if(File-£¾ReadHuge(PicBuf[i],nPixelWidth*nPicWidth)!=
(unsigned)nPixelWidth*nPicWidth)return ERR;
}
}
2.DIBÏÔʾ·¨
µÃµ½DIBºó¿ÉÓÃSDKµÄSetDIBitsToDeviceº¯ÊýÖ±½Ó½«DIB»æµ½ÆÁÄ»ÉÏ¡£
//ËøסDIBÄÚ´æ
LPSTR lpbi,lpbits;
lpbi=(LPBITMAPINFOHEADER)GlobalLock(hMem);
//µÃµ½DIBÊý¾ÝµØÖ·
lpbits=(BYTE huge*)((LPSTR)lpbi+*(LPDWORD)lpbi+nPalNum*sizeof(RGBQUAD));
SetDiBits ToDevice(hdc,//DIB½«Êä³öµÄÉ豸ÃèÊö±í
0,//É豸ÃèÊö±íÖÐλͼÊä³öÆðʼÂß¼X×ø±ê
0,//É豸ÃèÊö±íÖÐλͼÊä³öÆðʼÂß¼Y×ø±ê
width,//DIBµÄ¿í¶È
height,//DIBµÄ¸ß¶È
x0,//DIB¿ªÊ¼¶ÁÈ¡Êä³öµÄÏóËØÊý¾ÝµÄXλÖÃ
y0,//DIB¿ªÊ¼¶ÁÈ¡Êä³öµÄÏóËØÊý¾ÝµÄYλÖÃ
x0,//DIBÖÐÏóËصÄˮƽÐкÅ,Ëü¶ÔÓ¦lpBitsÄڴ滺³åÇøµÚÒ»ÐÐÊý¾Ý
nPicHeight,//DIBµÄÐÐÊý,¶ÔÓ¦°üº¬ÔÚÓÉlpBitsËùÖ¸Äڴ滺³åÇøÖеÄÊý¾Ý
lpbits,//°üº¬ÏóËØÊý¾ÝµÄÄڴ滺³åÇøµÄÖ¸Õë
(LPBITMAPINFO)lpbi,//Ö¸Ïò³õʼ»¯Á˵ÄBITMAPINFOÊý¾Ý½á¹¹µÄÖ¸Õë,
//ÃèÊöÁËλͼµÄ´óСºÍÉ«²ÊÊý¾Ý
DIB_RGB_COLORS);//Ö¸¶¨ÊÇÏÔʾµÄÑÕÉ«
¼´¿ÉÏÔʾDIBͼÏñ¡£
3.DDBÏÔʾ·¨
ÏȽ«DIBλͼת»¯ÎªDDBλͼ,ÔÙÏÔʾDDBλͼ¡£ÓÉÓÚMFCÓÐÖ§³ÖDDBµÄCBitmapÀà,ËùÒԼȿÉÓÃSDKµÄº¯ÊýÒ²¿ÉÓÃMFCµÄº¯Êý¡£
ÒÔÏÂÕâ¸öº¯Êý½«DIBλͼת»¯ÎªDDBλͼ:
//ÊäÈëÐèÒªµ±Ç°ÏÔʾÉ豸ÃèÊö±íCDC¼°
//ËùÈ¡µÄÄIJ¿·ÖDIBµÄ¾ØÐÎCrect
//ÊäÈëÐèת»¯µÄDIBµÄ¾ä±úHANDLE
//Êä³öDDBµÄCBitmapÖ¸Õë
CBitmap* GetDDBFromDIB(CDC*pDc,HANDLE hMem,CRect*pRect)
{
//DDBÖ¸Õë
CBitmap* pBit=NULL;
//DDB¾ä±ú
HBITMAP hbit=NULL;
//É豸¾ä±ú
HDC hdc=NULL;
//ÁÙʱÄÚ´æÉ豸
CDC* ptmpDC;
//λͼ¿í¶ÈºÍ¸ß¶È
short width,height;
//DDBµÄ´óСÓÉÔλͼºÍËù¸ø¾ØÐξö¶¨
//È¡Á½¸ö¾ØÐεĽ»¼¯
width=nPicWidth;
height=nPicHeight;
short x0,y0,x1,y1;
x0=y0=0;
if(pRect!=NULL){
x0=pRect-£¾left;
y0=pRect-£¾top;
if(width£¾pRect-£¾right)width=pRect-£¾right;
if(height£¾pRect-£¾bottom)height=pRect-£¾bottom;
width-=x0;
height=y0;
}
x1=x0+width;
if(width%2==1)width++;
y1=y0+height;
//ÖØÖþØÐÎΪËùÈ¡µÄ´óС
pRect-£¾SetRect(x0,y0,x1,y1);
//ÉêÇëÁÙʱÄÚ´æÉ豸
ptmpDC=new CDC;
if(ptmpDC==NULL)return NULL;
//ÉêÇëDDBÄÚ´æ
pBit=new CBitmap;
if(pBit==NULL){
delete ptmpDC;
return NULL;
}
//´´½¨ÓëÏÔʾÉ豸ÃèÊö±í¼æÈݵÄÄÚ´æÉ豸ÃèÊö±í
ptmpDC-£¾CreateCompatibleDC(pDc);
if(ptmpDC==0){
delete ptmpDC;
delete pBit;
return NULL;
}
//¸ù¾ÝÄÚ´æÉ豸ÃèÊö±í´´½¨ÓëÉ豸¼æÈÝλͼ
pBit-£¾CreateCompatibleBitmap(pDc,width,height);
if(pBit==0){
ptmpDC-£¾DeleteDC();
delete ptmpDC;
delete pBit;
return NULL;
}
//°Ñ´´½¨µÄÓëÉ豸¼æÈÝλͼѡÈëÉ豸ÃèÊö±í
//²¢±£´æÔÉ豸ÖеÄλͼָÕë
CBitmap* oldBitmap=ptmpDC-£¾SelectObject(pBit);
if(oldBitmap==NULL){
ptmpDC-£¾DeleteDC();
delete ptmpDC;
delete pBit;
return NULL;
}
//Ö¸ÏòDIBÍ·²¿µÄÖ¸Õë
LPBITMAPINFOHEADER lpbi=NULL;
//Ö¸ÏòDIBÏóËØÊý¾ÝµÄÖ¸Õë
LPSTR lpbits=NULL;
//´ÓÏàÈݵÄÄÚ´æÉ豸ָÕëÖеõ½É豸¾ä±ú
hdc=ptmpDC-£¾GetSafeHdc();
//Ëø¶¨DIBÄÚ´æ
lpbi=(LPBITMAPINFOHEADER)GlobalLock(hMem);
//µÃµ½DIBÏóËØÊý¾ÝµÄÖ¸Õë
lpbits=(BYTE huge*)((LPSTR)lpbi+*(LPDWORD)lpbi+nPalNum*sizeof(RGBQUAD));
//¸ù¾ÝDIB´´½¨DDB
hbit=CreateDIBitmap(hdc,//λͼ½«Ó³ÉäµÄʵ¼ÊÉ豸µÄÉ豸ÃèÊö±í
lpbi,//BITMAPINFOHEADERÊý¾Ý½á¹¹µÄÖ¸Õë
//½á¹¹µÄÖµÐèÔÚµ÷Óô˺¯ÊýÇ°É豸
//ÆäÖµ¾ö¶¨ÁËλͼµÄ³ß´çºÍÉ«²Ê·Ö±æÂÊ
CBM_INIT,//¾ö¶¨²úÉúµÄλͼÊÇ·ñ³õʼ»¯
//ÈôΪNULL²úÉúδ³õʼ»¯Î»Í¼
//ΪCBM_INIT¸ù¾ÝÏóËزÊÉ«ÖµÊý×é
//ºÍBITMAPINFOÊý¾Ý½á¹¹µÄÖ¸¶¨Êý¾Ý³õʼ»¯
lpbits,//λͼÏñËزÊÉ«ÖµÊý×éµÄÖ¸Õë,¸ñʽÓëÉ豸ÓйØ
(LPBITMAPINFO)lpbi,//BITMAPINFOÊý¾Ý½á¹¹Ö¸Õë
//°üº¬ÏóËØÊý×éÓõ½µÄ¸ñʽ
DIB_RGB_COLORS);//Ö¸¶¨ÊÇÏÔʾµÄÑÕÉ«
//µÃµ½ÏÔʾÉ豸µÄ¾ä±ú
HDC dc=pDc-£¾GetSafeHdc();
//ÔÙ´´½¨Ò»¸öÏàÈÝÉ豸ÄÚ´æ
HDC hmem;
hmem=CreateCompatibleDC(hdc);
ASSERT(hmem);
HBITMAP hold;
//°Ñ´´½¨µÄDDBÑ¡ÈëÄÚ´æÉ豸ÃèÊö±í
hold=(HBITMAP)SelectObject(hmem,hbit);
ASSERT(hold);
//°Ñ´ÓDIBµÃµ½µÄÄÚ´æÉ豸ÃèÊö±íÕ³µ½DDBµÄÄÚ´æÉ豸ÃèÊö±íÖÐ
BitBit(hdc,0,0,width,height,hmem,0,0,SRC-COPY);
//°ÑDIBÑ¡³öÄÚ´æÉ豸ÃèÊö±í
SelectObject(hmem,hold);
DeleteDC(hmem);
//´ò¿ªËøסµÄDIBÄÚ´æ
GlobalUnlock(hMem);
//°ÑµÃµ½µÄDDBÑ¡³öÄÚ´æÉ豸ÃèÊö±í
ptmpDC-£¾SelectObject(oldBitmap);
ptmpDC-£¾DeleteDC();
delete ptmpDC;
//·µ»ØµÃµ½µÄDDBÖ¸Õë
return pBit;
}
DDBλͼµÄÏÔʾ¾Í·Ç³£¼òµ¥ÁË,¿ÉÓÃBitBltº¯ÊýÖ±½ÓÏÔʾ¡£
//Ê×ÏÈÉêÇëÒ»É豸ÃèÊö±í
CDC* pMem=new CDC;
//´´½¨ÓëÏÔʾÉ豸¼æÈݵÄÄÚ´æÉ豸
pMem-£¾CreateCompatibleDC(pDc);
ASSERT(pMem);
//°ÑDDBλͼ(CBitmapµÄÖ¸ÕëpBit)Ñ¡ÈëÉ豸,²¢±£´æÔÖ¸Õë
CBitmap* pOldBmp=pMem-£¾SelectObject(pBit);
ASSERT(pOldBmp);
//°Ñ¼æÈÝÄÚ´æÉ豸ÃèÊö±íÕ³µ½ÏÔʾÉ豸ÖÐÃèÊö±í
pDc-£¾BitBlt(0,//Ä¿µÄ¾ØÐοò×óÉϽǵÄÂß¼X×ø±ê
0,//Ä¿µÄ¾ØÐοò×óÉϽǵÄÂß¼X×ø±ê
width,//Ä¿µÄ¾ØÐοòÂß¼¿í¶È
height,//Ä¿µÄ¾ØÐοòÂß¼¸ß¶È
pMem,//±»¸´ÖƵÄÉ豸ÃèÊö±í
0,//Դλͼ×óÉϽǵÄÂß¼X×ø±ê
0,//Դλͼ×óÉϽǵÄÂß¼X×ø±ê
SRCCOPY);//¹âÕ¤²Ù×÷Âë,°ÑԴλͼ¿½±´µ½Ä¿µÄλͼ
//»Ö¸´ÔÉ豸ÖеÄλͼ
pMem-£¾SelectObject(pOldBmp);
pMem-£¾DeleteDC();
delete pMem;
¼´ÏÔʾÁËDDBλͼ¡£
±¾°æÔðÈα༡¡ÁõÏþÁú
--
¡ù À´Ô´:£®×϶¡Ïã pclinux.hit.edu.cn£®[FROM: 241c05.hit.edu.]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
Ò³ÃæÖ´ÐÐʱ¼ä£º203.968ºÁÃë