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ºÁÃë