青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我的玻璃盒子

一個圖片加載與繪制類(使用GDI輸出圖片)【補充】

《一個圖片加載與繪制類(使用GDI輸出圖片)》中我公布了基本的圖片加載和繪制類,我們可以再根據(jù)這個類派生一些我們需要的新的繪制類,來針對某些特殊情況的繪制和使用,下面我再公布一個這樣的類,作為樣例。其中部分代碼來源于互聯(lián)網(wǎng)。

一、頭文件(CImageLoader.h)

#include "EnBitmap.h"

class CImageLoader : public CEnBitmap  
{
public:
    BOOL DrawImage(CEnBitmap
& bmp, int nX, int nY, int nCol, int nRow);
    CImageLoader();
    
virtual ~CImageLoader();

    BOOL Draw( CDC 
*pDC, LPRECT r);
    
//draw sub bmp to special point
    BOOL Draw( CDC *pDC, int x, int y, LPRECT sr );
    BOOL Draw( CDC 
*pDC, int x, int y, LPRECT sr, COLORREF colTrans, BOOL bTrans );
    BOOL DrawByHeight(CDC
* pDC, int x, int y, int sx, int sy, LPRECT sr, int nHeight);
    
    
int     Width()return GetWidth(); }
    
int     Height()return GetHeight(); }
    
    
void Attach(HBITMAP hbmp) { CBitmap::Attach(hbmp); }
    
    BOOL LoadBitmap(UINT nResName, HMODULE hInst
=NULL, COLORREF crBack=0
    

        
if(m_hBitmap) DeleteObject();
        
return LoadImage(nResName,RT_BITMAP,hInst,crBack);
    }

    BOOL LoadBitmap(LPCTSTR lpctImagePath, COLORREF crBack
=0
    

        
if(m_hBitmap) DeleteObject();
        
return LoadImage(lpctImagePath,crBack);
    }

    
    BOOL DrawTransparent(CDC 
* pDC, int x, int y, COLORREF crColour);    
    HRGN CreateRgnFromFile( COLORREF color );

    BOOL DrawImageByIndex(CDC
* pDC, CRect rect, int nIndex, COLORREF clrTrans, BOOL bTrans);
}
;

二、源文件(CImageLoader.cpp)
#include "stdafx.h"
#include 
"GnetImageLoader.h"

/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**///////////////////////////////////////////////////////////////////////

CImageLoader::CImageLoader()
{

}


CImageLoader::
~CImageLoader()
{

}


BOOL CImageLoader::Draw( CDC 
*pDC, int x, int y, LPRECT sr, COLORREF colTrans, BOOL bTrans )
{
    
if ( !bTrans )
        Draw( pDC ,x, y, sr );
    
else
    
{
        MyTransparentBlt( pDC
->m_hDC, x, y, sr->right - sr->left, sr->bottom - sr->top, 
            m_hBitmap, sr
->left, sr->top, colTrans, NULL );
    }

    
return TRUE;
}


//draw sub bmp to special point
BOOL CImageLoader::Draw( CDC *pDC, int x, int y, LPRECT sr )
{
    CDC dc;
    dc.CreateCompatibleDC( pDC
->m_hDC );
    HBITMAP bmp 
= dc.SelectBitmap( m_hBitmap );    
    
if ( sr != NULL)
        pDC
->BitBlt( x, y, sr->right - sr->left, sr->bottom - sr->top, dc.m_hDC, 
            sr
->left, sr->top,  SRCCOPY );
    
else
        pDC
->BitBlt( x, y, Width(), Height(), dc.m_hDC, 
            
00,  SRCCOPY );
    dc.SelectBitmap( bmp );
    
    
if(dc.m_hDC) ::DeleteDC(dc.Detach());
    
    
return TRUE;
}


BOOL CImageLoader::DrawByHeight(CDC
* pDC, int x, int y, int sx, int sy, LPRECT sr, int nHeight)
{
    CDC dc;
    dc.CreateCompatibleDC(pDC
->m_hDC);
    HBITMAP hBitmap 
= dc.SelectBitmap(m_hBitmap);

    
if(sr == NULL)
        pDC
->BitBlt(x, y, Width(), Height(), dc.m_hDC, 00, SRCCOPY);
    
else
    
{
        
int nSrcWidth = sr->right - sr->left;
        
int nSrcHeight = sr->bottom - sr->top;

        
if(nSrcHeight == nHeight)
            pDC
->BitBlt(x, y, nSrcWidth, nSrcHeight, dc.m_hDC, sr->left, sr->top, SRCCOPY);
        
else
        
{
            
//高度不同,需要拉伸繪制(根據(jù)指定的高度值:nHeight)
            pDC->StretchBlt(x, y, sr->right-sr->left, nHeight, dc.m_hDC, sx, sy, nSrcWidth, nSrcHeight, SRCCOPY);
        }

    }


    dc.SelectBitmap(hBitmap);
    ::DeleteDC(dc.Detach());

    
return TRUE;
}


BOOL CImageLoader::Draw(CDC 
*pDC, LPRECT r)
{
    CDC dc;
    dc.CreateCompatibleDC( pDC
->m_hDC );
    HBITMAP bmp 
= dc.SelectBitmap( m_hBitmap );    
    pDC
->BitBlt( r->left, r->top, r->right - r->left, r->bottom - r->top, dc.m_hDC, 00 ,
          SRCCOPY );

    dc.SelectBitmap( bmp );

    
if(dc.m_hDC) ::DeleteDC(dc.Detach());
    
    
return TRUE;
}



/**////HOWTO: Drawing Transparent Bitmaps
//see: Microsoft Knowledge Base Article - Q79212
BOOL CImageLoader::DrawTransparent(CDC * pDC, int x, int y, COLORREF crColour)
{
    MyTransparentBlt( pDC
->m_hDC, x, y, GetWidth(), GetHeight(), m_hBitmap, 00, crColour, NULL );

    
return TRUE;
}
    


HRGN CImageLoader::CreateRgnFromFile( COLORREF color )
{
    HBITMAP hBmp 
= m_hBitmap;

    
// get image properties
    BITMAP bmp = 0 };
    ::GetObject( hBmp, 
sizeof(BITMAP), &bmp );
    
// allocate memory for extended image information
    LPBITMAPINFO bi = (LPBITMAPINFO) new BYTE[ sizeof(BITMAPINFO) + 8 ];
    memset( bi, 
0sizeof(BITMAPINFO) + 8 );
    bi
->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    
// set window size
    int m_dwWidth    = bmp.bmWidth;        // bitmap width
    int m_dwHeight    = bmp.bmHeight;        // bitmap height
    
// create temporary dc
    HDC dc = CreateIC( "DISPLAY",NULL,NULL,NULL );
    
// get extended information about image (length, compression, length of color table if exist, )
    DWORD res = ::GetDIBits( dc, hBmp, 0, bmp.bmHeight, 0, bi, DIB_RGB_COLORS );
    
// allocate memory for image data (colors)
    LPBYTE pBits = new BYTE[ bi->bmiHeader.biSizeImage + 4 ];
    
// allocate memory for color table
    if ( bi->bmiHeader.biBitCount == 8 )
    
{
        
// actually color table should be appended to this header(BITMAPINFO),
        
// so we have to reallocate and copy it
        LPBITMAPINFO old_bi = bi;
        
// 255 - because there is one in BITMAPINFOHEADER
        bi = (LPBITMAPINFO)new charsizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD) ];
        memcpy( bi, old_bi, 
sizeof(BITMAPINFO) );
        
// release old header
        delete old_bi;
    }

    
// get bitmap info header
    BITMAPINFOHEADER& bih = bi->bmiHeader;
    
// get color table (for 256 color mode contains 256 entries of RGBQUAD(=DWORD))
    LPDWORD clr_tbl = (LPDWORD)&bi->bmiColors;
    
// fill bits buffer
    res = ::GetDIBits( dc, hBmp, 0, bih.biHeight, pBits, bi, DIB_RGB_COLORS );
    DeleteDC( dc );

    BITMAP bm;
    ::GetObject( hBmp, 
sizeof(BITMAP), &bm );
    
// shift bits and byte per pixel (for comparing colors)
    LPBYTE pClr = (LPBYTE)&color;
    
// swap red and blue components
    BYTE tmp = pClr[0]; pClr[0= pClr[2]; pClr[2= tmp;
    
// convert color if curent DC is 16-bit (5:6:5) or 15-bit (5:5:5)
    if ( bih.biBitCount == 16 )
    
{
        
// for 16 bit
        color = ((DWORD)(pClr[0& 0xf8>> 3|
                ((DWORD)(pClr[
1& 0xfc<< 3|
                ((DWORD)(pClr[
2& 0xf8<< 8);
        
// for 15 bit
//        color = ((DWORD)(pClr[0] & 0xf8) >> 3) |
//                ((DWORD)(pClr[1] & 0xf8) << 2) |
//                ((DWORD)(pClr[2] & 0xf8) << 7);
    }


    
const DWORD RGNDATAHEADER_SIZE    = sizeof(RGNDATAHEADER);
    
const DWORD ADD_RECTS_COUNT        = 40;            // number of rects to be appended
                                                    
// to region data buffer

    
// BitPerPixel
    BYTE    Bpp = bih.biBitCount >> 3;                // bytes per pixel
    
// bytes per line in pBits is DWORD aligned and bmp.bmWidthBytes is WORD aligned
    
// so, both of them not
    DWORD m_dwAlignedWidthBytes = (bmp.bmWidthBytes & ~0x3+ (!!(bmp.bmWidthBytes & 0x3<< 2);
    
// DIB image is flipped that's why we scan it from the last line
    LPBYTE    pColor = pBits + (bih.biHeight - 1* m_dwAlignedWidthBytes;
    DWORD    dwLineBackLen 
= m_dwAlignedWidthBytes + bih.biWidth * Bpp;    // offset of previous scan line
                                                    
// (after processing of current)
    DWORD    dwRectsCount = bih.biHeight;            // number of rects in allocated buffer
    INT        i, j;                                    // current position in mask image
    INT        first = 0;                                // left position of current scan line
                                                    
// where mask was found
    bool    wasfirst = false;                        // set when mask has been found in current scan line
    bool    ismask;                                    // set when current color is mask color

    
// allocate memory for region data
    
// region data here is set of regions that are rectangles with height 1 pixel (scan line)
    
// that's why first allocation is <bm.biHeight> RECTs - number of scan lines in image
    RGNDATAHEADER* pRgnData = 
        (RGNDATAHEADER
*)new BYTE[ RGNDATAHEADER_SIZE + dwRectsCount * sizeof(RECT) ];
    
// get pointer to RECT table
    LPRECT pRects = (LPRECT)((LPBYTE)pRgnData + RGNDATAHEADER_SIZE);
    
// zero region data header memory (header  part only)
    memset( pRgnData, 0, RGNDATAHEADER_SIZE + dwRectsCount * sizeof(RECT) );
    
// fill it by default
    pRgnData->dwSize    = RGNDATAHEADER_SIZE;
    pRgnData
->iType        = RDH_RECTANGLES;

    
for ( i = 0; i < bih.biHeight; i++ )
    
{
        
for ( j = 0; j < bih.biWidth; j++ )
        
{
            
// get color
            switch ( bih.biBitCount )
            
{
            
case 8:
                ismask 
= (clr_tbl[ *pColor ] != color);
                
break;
            
case 16:
                ismask 
= (*(LPWORD)pColor != (WORD)color);
                
break;
            
case 24:
                ismask 
= ((*(LPDWORD)pColor & 0x00ffffff!= color);
                
break;
            
case 32:
                ismask 
= (*(LPDWORD)pColor != color);
            }

            
// shift pointer to next color
            pColor += Bpp;
            
// place part of scan line as RECT region if transparent color found after mask color or
            
// mask color found at the end of mask image
            if ( wasfirst )
            
{
                
if ( !ismask )
                
{
                    
// save current RECT
                    pRects[ pRgnData->nCount++ ] = CRect( first, i, j, i + 1 );
                    
// if buffer full reallocate it with more room
                    if ( pRgnData->nCount >= dwRectsCount )
                    
{
                        dwRectsCount 
+= ADD_RECTS_COUNT;
                        
// allocate new buffer
                        LPBYTE pRgnDataNew = new BYTE[ RGNDATAHEADER_SIZE + dwRectsCount * sizeof(RECT) ];
                        
// copy current region data to it
                        memcpy( pRgnDataNew, pRgnData, RGNDATAHEADER_SIZE + pRgnData->nCount * sizeof(RECT) );
                        
// delte old region data buffer
                        delete pRgnData;
                        
// set pointer to new regiondata buffer to current
                        pRgnData = (RGNDATAHEADER*)pRgnDataNew;
                        
// correct pointer to RECT table
                        pRects = (LPRECT)((LPBYTE)pRgnData + RGNDATAHEADER_SIZE);
                    }

                    wasfirst 
= false;
                }

            }

            
else if ( ismask )        // set wasfirst when mask is found
            {
                first 
= j;
                wasfirst 
= true;
            }

        }


        
if ( wasfirst && ismask )
        
{
            
// save current RECT
            pRects[ pRgnData->nCount++ ] = CRect( first, i, j, i + 1 );
            
// if buffer full reallocate it with more room
            if ( pRgnData->nCount >= dwRectsCount )
            
{
                dwRectsCount 
+= ADD_RECTS_COUNT;
                
// allocate new buffer
                LPBYTE pRgnDataNew = new BYTE[ RGNDATAHEADER_SIZE + dwRectsCount * sizeof(RECT) ];
                
// copy current region data to it
                memcpy( pRgnDataNew, pRgnData, RGNDATAHEADER_SIZE + pRgnData->nCount * sizeof(RECT) );
                
// delte old region data buffer
                delete pRgnData;
                
// set pointer to new regiondata buffer to current
                pRgnData = (RGNDATAHEADER*)pRgnDataNew;
                
// correct pointer to RECT table
                pRects = (LPRECT)((LPBYTE)pRgnData + RGNDATAHEADER_SIZE);
            }

            wasfirst 
= false;
        }


        pColor 
-= dwLineBackLen;
    }

    
// release image data
    delete pBits;
    delete bi;

    
// create region
    HRGN hRgn = ExtCreateRegion( NULL, RGNDATAHEADER_SIZE + pRgnData->nCount * sizeof(RECT), (LPRGNDATA)pRgnData );
    
// release region data
    delete pRgnData;

    
return hRgn;
}


BOOL CImageLoader::DrawImage(CEnBitmap 
&bmp, int nX, int nY, int nCol, int nRow)
{
    nX 
-= 1;
    nY 
-= 1;
    
int w = GetWidth()/nCol;
    
int h = GetHeight()/nRow;
    
    HBITMAP hOldBmp;
    CDC memDC;
    CClientDC dc(
0);
    
    memDC.CreateCompatibleDC(dc.m_hDC);
    bmp.CreateCompatibleBitmap(dc.m_hDC, w, h);
    
    hOldBmp 
= memDC.SelectBitmap(bmp.m_hBitmap);
    StretchDraw( 
&memDC, CRect( 00, w, h ),
        CRect(GetWidth()
*nX/nCol, GetHeight()*nY/nRow, GetWidth()*nX/nCol+w ,GetHeight()*nY/nRow+h ) );
    memDC.SelectBitmap(hOldBmp);
    
    
//dc.DeleteDC();
    memDC.DeleteDC();
    ::DeleteObject(hOldBmp);
    hOldBmp 
= NULL;
    
    
return TRUE;
}


/**///////////////////////////////////////////////////////////////////////////
///
///    @param [in] pDC    Device context
///    @param [in] x    
///    @param [in] y
///    @param [in] rect
///    @param [in] state    Button state
///    - 0 : Normal
///    - 1 : Pressed
///    - 2 : Hover
///    - 3 : Disabled
///    @param [in] clrTrans
///    @param [in] bTrans                    
///
//////////////////////////////////////////////////////////////////////////

BOOL CImageLoader::DrawImageByIndex(CDC* pDC, CRect rect, int nIndex, COLORREF clrTrans, BOOL bTrans)
{
    
if(m_hBitmap == NULL) return FALSE;
    
    Draw(pDC, rect.left, rect.top, CRect(nIndex
*rect.Width(), 0, (nIndex+1)*rect.Width(), GetHeight()), clrTrans, bTrans);
    
    
return TRUE;
}

posted on 2008-01-17 22:04 深藍(lán)色系統(tǒng) 閱讀(809) 評論(0)  編輯 收藏 引用 所屬分類: GDI/GDI+


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

統(tǒng)計

常用鏈接

留言簿(75)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美亚洲成人精品| 另类专区欧美制服同性| 国产区在线观看成人精品| 欧美午夜视频在线| 欧美韩国一区| 久久综合伊人77777| 欧美一区二区在线看| 欧美在线视屏| 久久伊人免费视频| 欧美成人伊人久久综合网| 欧美高清视频一二三区| 亚洲国产一区二区a毛片| 久久综合给合| 欧美黄色日本| 99在线精品观看| 午夜国产欧美理论在线播放| 久久不射电影网| 蜜臀久久99精品久久久久久9| 欧美精品在线视频| 国产精品一区二区三区久久久| 国产自产女人91一区在线观看| 最新日韩欧美| 午夜精品久久久久久久蜜桃app| 久久资源在线| 亚洲天堂成人在线观看| 久久久国产一区二区| 欧美日韩精品免费看| 国内精品久久久久久久97牛牛| 日韩午夜在线播放| 久久国产精品99国产精| 亚洲黄色一区| 午夜一区不卡| 欧美日韩国产色站一区二区三区| 国产视频精品xxxx| 亚洲精品一区二区三区樱花| 久久久精品日韩欧美| 99v久久综合狠狠综合久久| 久久av免费一区| 欧美日韩色一区| 亚洲国产精品一区二区www在线| 亚洲天堂av电影| 另类专区欧美制服同性| 性做久久久久久久久| 国产精品xnxxcom| 亚洲老司机av| 麻豆国产精品777777在线| 亚洲自拍偷拍福利| 欧美日韩在线视频首页| 99re国产精品| 你懂的视频一区二区| 亚洲综合第一| 欧美视频成人| 一区二区三区高清视频在线观看| 老司机午夜精品视频在线观看| 亚洲视频网在线直播| 欧美日韩另类国产亚洲欧美一级| 亚洲国产精品一区制服丝袜| 欧美在线播放一区二区| 亚洲一区在线视频| 欧美午夜精品理论片a级按摩| 99视频有精品| 亚洲精品日本| 欧美伦理影院| 欧美午夜视频一区二区| 亚洲深夜影院| 亚洲一区二区高清| 国产精品国产a级| 亚洲欧美日韩国产精品| 亚洲乱码国产乱码精品精天堂| 欧美福利影院| 亚洲黄色视屏| 9国产精品视频| 欧美日韩国产麻豆| 亚洲欧美精品一区| 午夜精品久久久久久久白皮肤 | 国内综合精品午夜久久资源| 亚洲欧美日韩成人| 亚洲综合色网站| 国产日韩一区二区| 麻豆成人精品| 欧美电影免费观看大全| 亚洲欧洲精品一区二区三区不卡 | 亚洲自拍偷拍麻豆| 亚洲性夜色噜噜噜7777| 国产精品一区二区久久精品| 久久久99国产精品免费| 美女国产精品| 亚洲永久免费观看| 性欧美精品高清| 亚洲精品久久久久久下一站| 亚洲蜜桃精久久久久久久 | **性色生活片久久毛片| 最新国产成人在线观看| 国产精品v欧美精品v日韩| 久色成人在线| 欧美日韩国产系列| 久久精品123| 欧美激情亚洲| 久久久久久久欧美精品| 欧美成人午夜77777| 亚洲欧美久久久久一区二区三区| 久久精品91久久久久久再现| 日韩视频免费| 午夜精品视频网站| 亚洲精品国产品国语在线app| 亚洲在线视频免费观看| 亚洲福利av| 午夜视频一区在线观看| 亚洲激情专区| 午夜国产精品影院在线观看 | 久久精品av麻豆的观看方式| 亚洲国产日韩一区| 久久理论片午夜琪琪电影网| 欧美精品一区在线播放| 久久久久国色av免费观看性色| 欧美久久久久久久久| 免费美女久久99| 国产精品入口日韩视频大尺度| 亚洲高清二区| 激情久久影院| 午夜久久福利| 香蕉免费一区二区三区在线观看 | 久久久久国产一区二区| 午夜精品久久久久久久男人的天堂| 久久亚洲影院| 欧美一区二区三区男人的天堂 | 欧美成人一二三| 蜜臀va亚洲va欧美va天堂| 国产精品久久77777| 亚洲第一成人在线| 一区二区三区在线看| 亚洲一区二区三区激情| 亚洲一区二区3| 欧美成人一区二区三区在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 国产一区二区精品久久| 亚洲综合国产激情另类一区| 午夜精品久久久久久99热软件| 欧美视频专区一二在线观看| 91久久久在线| 亚洲作爱视频| 欧美日韩在线视频观看| 日韩视频精品在线| 亚洲新中文字幕| 欧美色网一区二区| 一区二区三区精品视频| 亚洲欧美三级在线| 国产精品久99| 欧美一二区视频| 久久人人精品| 91久久在线观看| 欧美日韩国产91| 夜夜嗨av一区二区三区网页| 亚洲一二三级电影| 国产乱码精品一区二区三| 亚洲欧美中日韩| 久久色在线观看| 日韩视频亚洲视频| 国产精品福利在线观看网址| 亚洲欧美韩国| 欧美超级免费视 在线| 亚洲欧洲日产国产综合网| 欧美日韩国产综合新一区| 夜夜嗨av一区二区三区网站四季av | 久久久久欧美精品| 亚洲黄一区二区三区| 欧美日韩国产色视频| 午夜亚洲影视| 亚洲国产精品精华液2区45| 日韩亚洲欧美精品| 国产精品久久久久久户外露出 | 欧美成人精品福利| 夜夜夜久久久| 鲁大师影院一区二区三区| 日韩一级二级三级| 国产精品久久午夜夜伦鲁鲁| 久久久久综合| 一本色道久久综合亚洲精品小说 | 国产色视频一区| 你懂的网址国产 欧美| 一区二区三区四区五区在线| 久久亚洲一区二区| 久久精品女人天堂| 亚洲国产欧美久久| 欧美在线免费播放| 日韩午夜激情av| 一区视频在线看| 欧美香蕉大胸在线视频观看| 久久精品中文字幕一区二区三区| 亚洲日本欧美| 久久在精品线影院精品国产| 一区二区三区四区在线| 国产一区二区三区精品久久久| 欧美精品在线观看| 欧美刺激午夜性久久久久久久| 欧美在线地址| 亚洲一区二区三区在线视频| 亚洲剧情一区二区| 亚洲成人自拍视频| 久久琪琪电影院|