WTLÀº GDI¿ÀºêÁ§Æ®ÀÇ ºñÆ®¸ÊÀ» CBitmapTÀ̶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼­ ĸ½¶È­Çϰí ÀÖ½À´Ï´Ù. ÅÛÇø´ Àμö´Âbool°ªÀ¸·Î trueÀÇ °æ¿ì´Â ¼Ò¸êÀÚ·Î DeleteObject()¸¦ È£ÃâÇØ   falseÀÇ °æ¿ì´Â È£ÃâÇÏÁö ¾Ê½À´Ï´Ù. atlgdi.hÇì´õ¿¡¼­´Â typedef¿¡ ÀÇÇØ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù.

// atlgdi.h³»

typedef CBitmapT<false>  CBitmapHandle;

typedef CBitmapT<true>   CBitmap;

                      


¡¡WTLÀÇCBitmapŬ·¡½º´Â MFCÀÇ µ¿¸íÀÇ Å¬·¡½º¿Í °ÅÀÇ °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ´Â À§  DIBµµ ¼­Æ÷Æ®Çϰí ÀÖ½À´Ï´Ù. ¾Æ·¡¿¡ ³ªÅ¸³»´Â °ÍÀº CBitmapŬ·¡½º¸¦ »ç¿ëÇØ  ÆÄÀÏ Á¤º¸¸¦ ¹ÙÅÁÀ¸·Î ÆÈ·¹Æ®¸¦ ÃÖÀûÈ­ÇØ Ŭ¶óÀÌ¾ðÆ® ¿µ¿ªÀÇ Áß¾Ó¿¡ ºñÆ® ¸Ê È­»óÀ» Ç¥½ÃÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

CBitmap m_bitmap;    // CBitmapÇüÅÂÀÇ ¸â¹ö º¯¼ö

CPalette m_palette;  // CPaletteÇüÀÇ ¸â¹ö º¯¼ö

 

// WM_PAINT¸Þ¼¼Áö Çڵ鷯

void OnPaint(HDC /*hDC*/){

    CPaintDC dc(m_hWnd);

 

    // ÆÈ·¹Æ®¸¦ ¼±ÅÃ

    HPALETTE hOldPalette;

    if(!m_palette.IsNull()){

        hOldPalette = dc.SelectPalette(m_palette, FALSE);

        dc.RealizePalette();

    }

 

    if(!m_bitmap.IsNull()){

        // ¸Þ¸ð¸®µ¥¹ÙÀ̽ºÄÜÅ×Ű½ºÆ®¸¦ ÀÛ¼ºÇØ , ºñÆ® ¸ÊÀ» ¼±ÅÃ

        CDC dcMem;

        dcMem.CreateCompatibleDC(dc);

        HBITMAP hOldBitmap = dcMem.SelectBitmap(m_bitmap);

 

        // Ŭ¶óÀÌ¾ðÆ® ±¸Çü°ú È­»ó ±¸ÇüÀ» ÃëµæÇØ , Áß¾Ó¿¡ È­»óÀ» Ç¥½Ã

        CRect rect;

        GetClientRect(rect);

        DIBSECTION ds;

        ::GetObject(m_bitmap, sizeof(DIBSECTION), &ds);

        int nX = rect.Width() / 2 - ds.dsBm.bmWidth / 2;

        int nY = rect.Height() / 2 - ds.dsBm.bmHeight / 2;

        dc.BitBlt(nX, nY, ds.dsBm.bmWidth, ds.dsBm.bmHeight, dcMem, 0, 0, SRCCOPY);

 

        // ¿øÀÇ ºñÆ® ¸ÊÀ» ¼±ÅÃ

        dcMem.SelectBitmap(hOldBitmap);

    }

 

    // ¿øÀÇ ÆÈ·¹Æ®¸¦ ¼±ÅÃ

    if(!m_palette.IsNull())

        dc.SelectPalette(hOldPalette, FALSE);

}

 

// WM_CREATE¸Þ¼¼Áö Çڵ鷯

LRESULT OnCreate(LPCREATESTRUCT lpcs){

    // ºñÆ® ¸Ê ÆÄÀÏ Àбâ

    m_bitmap = AtlLoadBitmapImage(_T("D:\\sample.bmp"),

        LR_LOADFROMFILE | LR_CREATEDIBSECTION);

 

    CClientDC dc(m_hWnd);

    if(dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE){

        // È­»ó ÆÄÀÏ Á¤º¸¸¦ Ãëµæ

        DIBSECTION ds;

        ::GetObject(m_bitmap, sizeof(DIBSECTION), &ds);

 

        // È­»óÀÇ »ö °¡Áö¼ö¸¦ Ãëµæ

        int nColors;

        if(ds.dsBmih.biClrUsed != 0)

            nColors = ds.dsBmih.biClrUsed;

        else

            nColors = 1 << ds.dsBmih.biBitCount;

 

        // È­»ó¿¡ ÀûÀýÇÑ ÆÈ·¹Æ®¸¦ ÀÛ¼º

        if(nColors > 256){

            // »ö °¡Áö¼ö°¡256»öº¸´Ù ¸¹Àº °æ¿ì´Â ÇÏÇÁÅæ ÆÈ·¹Æ®¸¦ ÀÛ¼º

            m_palette.CreateHalftonePalette(dc);

        }else{

            // »ö °¡Áö¼ö°¡256»ö ÀÌÇÏÀÇ °æ¿ì´Â Ä¿½ºÅÒ ÆÈ·¹Æ®¸¦ ÀÛ¼º

            RGBQUAD* pRGB = new RGBQUAD[nColors];

 

            CDC dcMem;

            dcMem.CreateCompatibleDC(dc);

            HBITMAP hOldBitmap = dcMem.SelectBitmap(m_bitmap);

            dcMem.GetDIBColorTable(0, nColors, pRGB);

            dcMem.SelectBitmap(hOldBitmap);

 

            UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * (nColors - 1));

            LOGPALETTE* pLP = (LOGPALETTE*) new BYTE[nSize];

 

            pLP->palVersion = 0x300;

            pLP->palNumEntries = nColors;

 

            for(int i=0; i<nColors; i++){

                pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;

                pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;

                pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;

                pLP->palPalEntry[i].peFlags = 0;

            }

 

            m_palette.CreatePalette(pLP);

 

            delete[] pLP;

            delete[] pRGB;

        }

    }

 

    return 0;

}

                      


¡¡¿ì¼±, ¼±µÎ¿¡¼­ CBitmapŬ·¡½ºÀÇ ÀνºÅϽºÀÎm_bitmap°ú CPaletteŬ·¡½ºÀÇ ÀνºÅϽºÀÎm_paletteÀ» ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù. ÀÌ·¯ÇÑ º¯¼ö´Â  °¢°¢CBitmap,CPaletteŬ·¡½ºÀÇ constructorÀ¸·Î NULL¿¡ ÃʱâÈ­µÇ°í ÀÖ½À´Ï´Ù.

¡¡´ÙÀ½¿¡ WM_CREATE¸Þ¼¼Áö Çڵ鷯¸¦ º¾´Ï´Ù.  WM_CREATE¸Þ¼¼Áö Çڵ鷯¿¡¼­´Â ÃÊ¿¡  AtlLoadBitmapImage()¿¡ ÀÇÇØ ºñÆ® ¸Ê ÆÄÀÏÀ» ÀоîµéÀÔ´Ï´Ù.  ´ÙÀ½¿¡  ÆÈ·¹Æ®°¡ ÇÊ¿äÇÑÁö ¾î¶²Áö¸¦ Ã¼Å©ÇØ ÇÊ¿äÇÑ °æ¿ì´Â È­»óÀÇ »ö °¡Áö¼ö¸¦ ÃëµæÇØ ÀûÀýÇÑ ÆÈ·¹Æ®¸¦ ÀÛ¼ºÇÕ´Ï´Ù.

¡¡WM_PAINT¸Þ¼¼Áö Çڵ鷯¿¡¼­´Â  ¿ì¼±  ÇÊ¿äÇÑ °æ¿ì´Â ÆÈ·¹Æ® ¿ÀºêÁ§Æ®¸¦ ¼±ÅÃÇÕ´Ï´Ù. ´ÙÀ½¿¡  ¸Þ¸ð¸® µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÀÛ¼ºÇØSelectBitmap()·Î ºñÆ®¸Ê ¿ÀºêÁ§Æ®¸¦ ¼±ÅÃÇÕ´Ï´Ù.  SelectBitmap()Àº Àμö¿¡ HBITMAPÇüÅÂÀÇ º¯¼ö¸¦ ¹Þ½À´Ï´Ù¸¸  CBitmapTŬ·¡½º´ÂHBITMAP º¯È¯ ¿¬»êÀÚ¸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î ±×´ë·Î °Ç³×ÁÙ ¼ö°¡ ÀÖ½À´Ï´Ù.  SelectBitmap()Àº ÀÌÀüÀÇ ºñÆ® ¸Ê ÇÚµéÀ» µ¹·ÁÁֹǷΠ À̰ÍÀ»hOldBitmapÀ̶ó°í ÇÏ´Â º¯¼ö¿¡ º¸Á¸ÇØ µÓ´Ï´Ù.

´ÙÀ½¿¡  Å¬¶óÀÌ¾ðÆ® ¿µ¿ªÀÇ Áß¾Ó¿¡ ºñÆ® ¸ÊÀ» ¹¦È­ ÇÕ´Ï´Ù. ¹¦È­ ÇÏ´Â ÁÂÇ¥´Â  GetClientRect()À̶ó°íGetObject()¿¡ ÀÇÇØ °¢°¢ Ŭ¶óÀÌ¾ðÆ® ¿µ¿ª°ú È­»óÀÇ Å©±â¸¦ ÃëµæÇØ °è»êÇÕ´Ï´Ù.

¸¶Áö¸·À¸·Î  ¹æ±ÝÀü º¸Á¸ÇØ µÐ ¿øÀÇ ºñÆ® ¸Ê Çڵ鿡 µÇµ¹¸®±â À§ÇØ ÀçÂ÷SelectBitmap()¸¦ È£ÃâÇØ ¿øÀÇ ºñÆ® ¸Ê ÇÚµéÀ» ¼±ÅÃÇÕ´Ï´Ù. ÆÈ·¹Æ®¸¦ »ç¿ëÇßÀ» °æ¿ì´Â ÆÈ·¹Æ®µµ ¹ÙÅÁÀ¸·Î µÇµ¹¸³´Ï´Ù.