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

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

CBitmap 和CDiB


CBitmap 見msdn 操作設備相關位圖
CDib 操作設備相關位圖:見visual c++.net  6
// cdib.h declaration for Inside Visual C++ CDib class

#ifndef _INSIDE_VISUAL_CPP_CDIB
#define _INSIDE_VISUAL_CPP_CDIB

class CDib : public CObject
{
    
enum Alloc {noAlloc, crtAlloc, heapAlloc};
    DECLARE_SERIAL(CDib)
public:
    LPVOID m_lpvColorTable;
    HBITMAP m_hBitmap;
    LPBYTE m_lpImage;  
// starting address of DIB bits
    LPBITMAPINFOHEADER m_lpBMIH; //  buffer containing the BITMAPINFOHEADER
private:
    HGLOBAL m_hGlobal; 
// For external windows we need to free;
                       
//  could be allocated by this class or allocated externally
    Alloc m_nBmihAlloc;
    Alloc m_nImageAlloc;
    DWORD m_dwSizeImage; 
// of bits -- not BITMAPINFOHEADER or BITMAPFILEHEADER
    int m_nColorTableEntries;
    
    HANDLE m_hFile;
    HANDLE m_hMap;
    LPVOID m_lpvFile;
    HPALETTE m_hPalette;
public:
    CDib();
    CDib(CSize size, 
int nBitCount);    // builds BITMAPINFOHEADER
    ~CDib();
    
int GetSizeImage() {return m_dwSizeImage;}
    
int GetSizeHeader()
        
{return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;}
    CSize GetDimensions();
    BOOL AttachMapFile(
const char* strPathname, BOOL bShare = FALSE);
    BOOL CopyToMapFile(
const char* strPathname);
    BOOL AttachMemory(LPVOID lpvMem, BOOL bMustDelete 
= FALSE, HGLOBAL hGlobal = NULL);
    BOOL Draw(CDC
* pDC, CPoint origin, CSize size);  // until we implemnt CreateDibSection
    HBITMAP CreateSection(CDC* pDC = NULL);
    UINT UsePalette(CDC
* pDC, BOOL bBackground = FALSE);
    BOOL MakePalette();
    BOOL SetSystemPalette(CDC
* pDC);
    BOOL Compress(CDC
* pDC, BOOL bCompress = TRUE); // FALSE means decompress
    HBITMAP CreateBitmap(CDC* pDC);
    BOOL Read(CFile
* pFile);
    BOOL ReadSection(CFile
* pFile, CDC* pDC = NULL);
    BOOL Write(CFile
* pFile);
    
void Serialize(CArchive& ar);
    
void Empty();
private:
    
void DetachMapFile();
    
void ComputePaletteSize(int nBitCount);
    
void ComputeMetrics();
}
;
#endif // _INSIDE_VISUAL_CPP_CDIB



// cdib.cpp
// new version for WIN32
#include "stdafx.h"
#include 
"cdib.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_SERIAL(CDib, CObject, 
0);

CDib::CDib()
{
    m_hFile 
= NULL;
    m_hBitmap 
= NULL;
    m_hPalette 
= NULL;
    m_nBmihAlloc 
= m_nImageAlloc = noAlloc;
    Empty();
}


CDib::CDib(CSize size, 
int nBitCount)
{
    m_hFile 
= NULL;
    m_hBitmap 
= NULL;
    m_hPalette 
= NULL;
    m_nBmihAlloc 
= m_nImageAlloc = noAlloc;
    Empty();
    ComputePaletteSize(nBitCount);
    m_lpBMIH 
= (LPBITMAPINFOHEADER) new 
        
char[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries];
    m_nBmihAlloc 
= crtAlloc;
    m_lpBMIH
->biSize = sizeof(BITMAPINFOHEADER);
    m_lpBMIH
->biWidth = size.cx;
    m_lpBMIH
->biHeight = size.cy;
    m_lpBMIH
->biPlanes = 1;
    m_lpBMIH
->biBitCount = nBitCount;
    m_lpBMIH
->biCompression = BI_RGB;
    m_lpBMIH
->biSizeImage = 0;
    m_lpBMIH
->biXPelsPerMeter = 0;
    m_lpBMIH
->biYPelsPerMeter = 0;
    m_lpBMIH
->biClrUsed = m_nColorTableEntries;
    m_lpBMIH
->biClrImportant = m_nColorTableEntries;
    ComputeMetrics();
    memset(m_lpvColorTable, 
0sizeof(RGBQUAD) * m_nColorTableEntries);
    m_lpImage 
= NULL;  // no data yet
}


CDib::
~CDib()
{
    Empty();
}


CSize CDib::GetDimensions()
{    
    
if(m_lpBMIH == NULL) return CSize(00);
    
return CSize((int) m_lpBMIH->biWidth, (int) m_lpBMIH->biHeight);
}


BOOL CDib::AttachMapFile(
const char* strPathname, BOOL bShare) // for reading
{
    
// if we open the same file twice, Windows treats it as 2 separate files
    
// doesn't work with rare BMP files where # palette entries > biClrUsed
    HANDLE hFile = ::CreateFile(strPathname, GENERIC_WRITE | GENERIC_READ,
        bShare 
? FILE_SHARE_READ : 0,
        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    ASSERT(hFile 
!= INVALID_HANDLE_VALUE);
    DWORD dwFileSize 
= ::GetFileSize(hFile, NULL);
    HANDLE hMap 
= ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 00, NULL);
    DWORD dwErr 
= ::GetLastError();
    
if(hMap == NULL) {
        AfxMessageBox(
"Empty bitmap file");
        
return FALSE;
    }

    LPVOID lpvFile 
= ::MapViewOfFile(hMap, FILE_MAP_WRITE, 000); // map whole file
    ASSERT(lpvFile != NULL);
    
if(((LPBITMAPFILEHEADER) lpvFile)->bfType != 0x4d42{
        AfxMessageBox(
"Invalid bitmap file");
        DetachMapFile();
        
return FALSE;
    }

    AttachMemory((LPBYTE) lpvFile 
+ sizeof(BITMAPFILEHEADER));
    m_lpvFile 
= lpvFile;
    m_hFile 
= hFile;
    m_hMap 
= hMap;
    
return TRUE;
}


BOOL CDib::CopyToMapFile(
const char* strPathname)
{
    
// copies DIB to a new file, releases prior pointers
    
// if you previously used CreateSection, the HBITMAP will be NULL (and unusable)
    BITMAPFILEHEADER bmfh;
    bmfh.bfType 
= 0x4d42;  // 'BM'
    bmfh.bfSize = m_dwSizeImage + sizeof(BITMAPINFOHEADER) +
            
sizeof(RGBQUAD) * m_nColorTableEntries + sizeof(BITMAPFILEHEADER);
    
// meaning of bfSize open to interpretation
    bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
    bmfh.bfOffBits 
= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
            
sizeof(RGBQUAD) * m_nColorTableEntries;    
    HANDLE hFile 
= ::CreateFile(strPathname, GENERIC_WRITE | GENERIC_READ, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    ASSERT(hFile 
!= INVALID_HANDLE_VALUE);
    
int nSize =  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
                
sizeof(RGBQUAD) * m_nColorTableEntries +  m_dwSizeImage;
    HANDLE hMap 
= ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, nSize, NULL);
    DWORD dwErr 
= ::GetLastError();
    ASSERT(hMap 
!= NULL);
    LPVOID lpvFile 
= ::MapViewOfFile(hMap, FILE_MAP_WRITE, 000); // map whole file
    ASSERT(lpvFile != NULL);
    LPBYTE lpbCurrent 
= (LPBYTE) lpvFile;
    memcpy(lpbCurrent, 
&bmfh, sizeof(BITMAPFILEHEADER)); // file header
    lpbCurrent += sizeof(BITMAPFILEHEADER);
    LPBITMAPINFOHEADER lpBMIH 
= (LPBITMAPINFOHEADER) lpbCurrent;
    memcpy(lpbCurrent, m_lpBMIH,
        
sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries); // info
    lpbCurrent += sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;
    memcpy(lpbCurrent, m_lpImage, m_dwSizeImage); 
// bit image
    DWORD dwSizeImage = m_dwSizeImage;
    Empty();
    m_dwSizeImage 
= dwSizeImage;
    m_nBmihAlloc 
= m_nImageAlloc = noAlloc;
    m_lpBMIH 
= lpBMIH;
    m_lpImage 
= lpbCurrent;
    m_hFile 
= hFile;
    m_hMap 
= hMap;
    m_lpvFile 
= lpvFile;
    ComputePaletteSize(m_lpBMIH
->biBitCount);
    ComputeMetrics();
    MakePalette();
    
return TRUE;
}


BOOL CDib::AttachMemory(LPVOID lpvMem, BOOL bMustDelete, HGLOBAL hGlobal)
{
    
// assumes contiguous BITMAPINFOHEADER, color table, image
    
// color table could be zero length
    Empty();
    m_hGlobal 
= hGlobal;
    
if(bMustDelete == FALSE) {
        m_nBmihAlloc 
= noAlloc;
    }

    
else {
        m_nBmihAlloc 
= ((hGlobal == NULL) ? crtAlloc : heapAlloc);
    }

    
try {
        m_lpBMIH 
= (LPBITMAPINFOHEADER) lpvMem;
        ComputeMetrics();
        ComputePaletteSize(m_lpBMIH
->biBitCount);
        m_lpImage 
= (LPBYTE) m_lpvColorTable + sizeof(RGBQUAD) * m_nColorTableEntries;
        MakePalette();
    }

    
catch(CException* pe) {
        AfxMessageBox(
"AttachMemory error");
        pe
->Delete();
        
return FALSE;
    }

    
return TRUE;
}


UINT CDib::UsePalette(CDC
* pDC, BOOL bBackground /* = FALSE */)
{
    
if(m_hPalette == NULL) return 0;
    HDC hdc 
= pDC->GetSafeHdc();
    ::SelectPalette(hdc, m_hPalette, bBackground);
    
return ::RealizePalette(hdc);
}


BOOL CDib::Draw(CDC
* pDC, CPoint origin, CSize size)
{
    
if(m_lpBMIH == NULL) return FALSE;
    
if(m_hPalette != NULL) {
        ::SelectPalette(pDC
->GetSafeHdc(), m_hPalette, TRUE);
    }

    pDC
->SetStretchBltMode(COLORONCOLOR);
    ::StretchDIBits(pDC
->GetSafeHdc(), origin.x, origin.y, size.cx, size.cy,
        
00, m_lpBMIH->biWidth, m_lpBMIH->biHeight,
        m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY);
    
return TRUE;
}


HBITMAP CDib::CreateSection(CDC
* pDC /* = NULL */)
{
    
if(m_lpBMIH == NULL) return NULL;
    
if(m_lpImage != NULL) return NULL; // can only do this if image doesn't exist
    m_hBitmap = ::CreateDIBSection(pDC->GetSafeHdc(), (LPBITMAPINFO) m_lpBMIH,
        DIB_RGB_COLORS,    (LPVOID
*&m_lpImage, NULL, 0);
    ASSERT(m_lpImage 
!= NULL);
    
return m_hBitmap;
}


BOOL CDib::MakePalette()
{
    
// makes a logical palette (m_hPalette) from the DIB's color table
    
// this palette will be selected and realized prior to drawing the DIB
    if(m_nColorTableEntries == 0return FALSE;
    
if(m_hPalette != NULL) ::DeleteObject(m_hPalette);
    TRACE(
"CDib::MakePalette -- m_nColorTableEntries = %d\n", m_nColorTableEntries);
    LPLOGPALETTE pLogPal 
= (LPLOGPALETTE) new char[2 * sizeof(WORD) +
        m_nColorTableEntries 
* sizeof(PALETTEENTRY)];
    pLogPal
->palVersion = 0x300;
    pLogPal
->palNumEntries = m_nColorTableEntries;
    LPRGBQUAD pDibQuad 
= (LPRGBQUAD) m_lpvColorTable;
    
for(int i = 0; i < m_nColorTableEntries; i++{
        pLogPal
->palPalEntry[i].peRed = pDibQuad->rgbRed;
        pLogPal
->palPalEntry[i].peGreen = pDibQuad->rgbGreen;
        pLogPal
->palPalEntry[i].peBlue = pDibQuad->rgbBlue;
        pLogPal
->palPalEntry[i].peFlags = 0;
        pDibQuad
++;
    }

    m_hPalette 
= ::CreatePalette(pLogPal);
    delete pLogPal;
    
return TRUE;
}
    

BOOL CDib::SetSystemPalette(CDC
* pDC)
{
    
// if the DIB doesn't have a color table, we can use the system's halftone palette
    if(m_nColorTableEntries != 0return FALSE;
    m_hPalette 
= ::CreateHalftonePalette(pDC->GetSafeHdc());
    
return TRUE;
}


HBITMAP CDib::CreateBitmap(CDC
* pDC)
{
    
if (m_dwSizeImage == 0return NULL;
    HBITMAP hBitmap 
= ::CreateDIBitmap(pDC->GetSafeHdc(), m_lpBMIH,
            CBM_INIT, m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS);
    ASSERT(hBitmap 
!= NULL);
    
return hBitmap;
}


BOOL CDib::Compress(CDC
* pDC, BOOL bCompress /* = TRUE */)
{
    
// 1. makes GDI bitmap from existing DIB
    
// 2. makes a new DIB from GDI bitmap with compression
    
// 3. cleans up the original DIB
    
// 4. puts the new DIB in the object
    if((m_lpBMIH->biBitCount != 4&& (m_lpBMIH->biBitCount != 8)) return FALSE;
        
// compression supported only for 4 bpp and 8 bpp DIBs
    if(m_hBitmap) return FALSE; // can't compress a DIB Section!
    TRACE("Compress: original palette size = %d\n", m_nColorTableEntries); 
    HDC hdc 
= pDC->GetSafeHdc();
    HPALETTE hOldPalette 
= ::SelectPalette(hdc, m_hPalette, FALSE);
    HBITMAP hBitmap;  
// temporary
    if((hBitmap = CreateBitmap(pDC)) == NULL) return FALSE;
    
int nSize = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;
    LPBITMAPINFOHEADER lpBMIH 
= (LPBITMAPINFOHEADER) new char[nSize];
    memcpy(lpBMIH, m_lpBMIH, nSize);  
// new header
    if(bCompress) {
        
switch (lpBMIH->biBitCount) {
        
case 4:
            lpBMIH
->biCompression = BI_RLE4;
            
break;
        
case 8:
            lpBMIH
->biCompression = BI_RLE8;
            
break;
        
default:
            ASSERT(FALSE);
        }

        
// calls GetDIBits with null data pointer to get size of compressed DIB
        if(!::GetDIBits(pDC->GetSafeHdc(), hBitmap, 0, (UINT) lpBMIH->biHeight,
                        NULL, (LPBITMAPINFO) lpBMIH, DIB_RGB_COLORS)) 
{
            AfxMessageBox(
"Unable to compress this DIB");
            
// probably a problem with the color table
             ::DeleteObject(hBitmap);
            delete [] lpBMIH;
            ::SelectPalette(hdc, hOldPalette, FALSE);
            
return FALSE; 
        }

        
if (lpBMIH->biSizeImage == 0{
            AfxMessageBox(
"Driver can't do compression");
             ::DeleteObject(hBitmap);
            delete [] lpBMIH;
            ::SelectPalette(hdc, hOldPalette, FALSE);
            
return FALSE; 
        }

        
else {
            m_dwSizeImage 
= lpBMIH->biSizeImage;
        }

    }

    
else {
        lpBMIH
->biCompression = BI_RGB; // decompress
        
// figure the image size from the bitmap width and height
        DWORD dwBytes = ((DWORD) lpBMIH->biWidth * lpBMIH->biBitCount) / 32;
        
if(((DWORD) lpBMIH->biWidth * lpBMIH->biBitCount) % 32{
            dwBytes
++;
        }

        dwBytes 
*= 4;
        m_dwSizeImage 
= dwBytes * lpBMIH->biHeight; // no compression
        lpBMIH->biSizeImage = m_dwSizeImage;
    }
 
    
// second GetDIBits call to make DIB
    LPBYTE lpImage = (LPBYTE) new char[m_dwSizeImage];
    VERIFY(::GetDIBits(pDC
->GetSafeHdc(), hBitmap, 0, (UINT) lpBMIH->biHeight,
            lpImage, (LPBITMAPINFO) lpBMIH, DIB_RGB_COLORS));
    TRACE(
"dib successfully created - height = %d\n", lpBMIH->biHeight);
    ::DeleteObject(hBitmap);
    Empty();
    m_nBmihAlloc 
= m_nImageAlloc = crtAlloc;
    m_lpBMIH 
= lpBMIH;
    m_lpImage 
= lpImage;
    ComputeMetrics();
    ComputePaletteSize(m_lpBMIH
->biBitCount);
    MakePalette();
    ::SelectPalette(hdc, hOldPalette, FALSE);
    TRACE(
"Compress: new palette size = %d\n", m_nColorTableEntries); 
    
return TRUE;
}


BOOL CDib::Read(CFile
* pFile)
{
    
// 1. read file header to get size of info hdr + color table
    
// 2. read info hdr (to get image size) and color table
    
// 3. read image
    
// can't use bfSize in file header
    Empty();
    
int nCount, nSize;
    BITMAPFILEHEADER bmfh;
    
try {
        nCount 
= pFile->Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
        
if(nCount != sizeof(BITMAPFILEHEADER)) {
            
throw new CUserException;
        }

        
if(bmfh.bfType != 0x4d42{
            
throw new CUserException;
        }

        nSize 
= bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
        m_lpBMIH 
= (LPBITMAPINFOHEADER) new char[nSize];
        m_nBmihAlloc 
= m_nImageAlloc = crtAlloc;
        nCount 
= pFile->Read(m_lpBMIH, nSize); // info hdr & color table
        ComputeMetrics();
        ComputePaletteSize(m_lpBMIH
->biBitCount);
        MakePalette();
        m_lpImage 
= (LPBYTE) new char[m_dwSizeImage];
        nCount 
= pFile->Read(m_lpImage, m_dwSizeImage); // image only
    }

    
catch(CException* pe) {
        AfxMessageBox(
"Read error");
        pe
->Delete();
        
return FALSE;
    }

    
return TRUE;
}


BOOL CDib::ReadSection(CFile
* pFile, CDC* pDC /* = NULL */)
{
    
// new function reads BMP from disk and creates a DIB section
    
//    allows modification of bitmaps from disk
    
// 1. read file header to get size of info hdr + color table
    
// 2. read info hdr (to get image size) and color table
    
// 3. create DIB section based on header parms
    
// 4. read image into memory that CreateDibSection allocates
    Empty();
    
int nCount, nSize;
    BITMAPFILEHEADER bmfh;
    
try {
        nCount 
= pFile->Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
        
if(nCount != sizeof(BITMAPFILEHEADER)) {
            
throw new CUserException;
        }

        
if(bmfh.bfType != 0x4d42{
            
throw new CUserException;
        }

        nSize 
= bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
        m_lpBMIH 
= (LPBITMAPINFOHEADER) new char[nSize];
        m_nBmihAlloc 
= crtAlloc;
        m_nImageAlloc 
= noAlloc;
        nCount 
= pFile->Read(m_lpBMIH, nSize); // info hdr & color table
        if(m_lpBMIH->biCompression != BI_RGB) {
            
throw new CUserException;
        }

        ComputeMetrics();
        ComputePaletteSize(m_lpBMIH
->biBitCount);
        MakePalette();
        UsePalette(pDC);
        m_hBitmap 
= ::CreateDIBSection(pDC->GetSafeHdc(), (LPBITMAPINFO) m_lpBMIH,
            DIB_RGB_COLORS,    (LPVOID
*&m_lpImage, NULL, 0);
        ASSERT(m_lpImage 
!= NULL);
        nCount 
= pFile->Read(m_lpImage, m_dwSizeImage); // image only
    }

    
catch(CException* pe) {
        AfxMessageBox(
"ReadSection error");
        pe
->Delete();
        
return FALSE;
    }

    
return TRUE;
}


BOOL CDib::Write(CFile
* pFile)
{
    BITMAPFILEHEADER bmfh;
    bmfh.bfType 
= 0x4d42;  // 'BM'
    int nSizeHdr = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;
    bmfh.bfSize 
= 0;
//    bmfh.bfSize = sizeof(BITMAPFILEHEADER) + nSizeHdr + m_dwSizeImage;
    
// meaning of bfSize open to interpretation (bytes, words, dwords?) -- we won't use it
    bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
    bmfh.bfOffBits 
= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
            
sizeof(RGBQUAD) * m_nColorTableEntries;    
    
try {
        pFile
->Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
        pFile
->Write((LPVOID) m_lpBMIH,  nSizeHdr);
        pFile
->Write((LPVOID) m_lpImage, m_dwSizeImage);
    }

    
catch(CException* pe) {
        pe
->Delete();
        AfxMessageBox(
"write error");
        
return FALSE;
    }

    
return TRUE;
}


void CDib::Serialize(CArchive& ar)
{
    DWORD dwPos;
    dwPos 
= ar.GetFile()->GetPosition();
    TRACE(
"CDib::Serialize -- pos = %d\n", dwPos);
    ar.Flush();
    dwPos 
= ar.GetFile()->GetPosition();
    TRACE(
"CDib::Serialize -- pos = %d\n", dwPos);
    
if(ar.IsStoring()) {
        Write(ar.GetFile());
    }

    
else {
        Read(ar.GetFile());
    }

}


// helper functions
void CDib::ComputePaletteSize(int nBitCount)
{
    
if((m_lpBMIH == NULL) || (m_lpBMIH->biClrUsed == 0)) {
        
switch(nBitCount) {
            
case 1:
                m_nColorTableEntries 
= 2;
                
break;
            
case 4:
                m_nColorTableEntries 
= 16;
                
break;
            
case 8:
                m_nColorTableEntries 
= 256;
                
break;
            
case 16:
            
case 24:
            
case 32:
                m_nColorTableEntries 
= 0;
                
break;
            
default:
                ASSERT(FALSE);
        }

    }

    
else {
        m_nColorTableEntries 
= m_lpBMIH->biClrUsed;
    }

    ASSERT((m_nColorTableEntries 
>= 0&& (m_nColorTableEntries <= 256)); 
}


void CDib::ComputeMetrics()
{
    
if(m_lpBMIH->biSize != sizeof(BITMAPINFOHEADER)) {
        TRACE(
"Not a valid Windows bitmap -- probably an OS/2 bitmap\n");
        
throw new CUserException;
    }

    m_dwSizeImage 
= m_lpBMIH->biSizeImage;
    
if(m_dwSizeImage == 0{
        DWORD dwBytes 
= ((DWORD) m_lpBMIH->biWidth * m_lpBMIH->biBitCount) / 32;
        
if(((DWORD) m_lpBMIH->biWidth * m_lpBMIH->biBitCount) % 32{
            dwBytes
++;
        }

        dwBytes 
*= 4;
        m_dwSizeImage 
= dwBytes * m_lpBMIH->biHeight; // no compression
    }

    m_lpvColorTable 
= (LPBYTE) m_lpBMIH + sizeof(BITMAPINFOHEADER);
}


void CDib::Empty()
{
    
// this is supposed to clean up whatever is in the DIB
    DetachMapFile();
    
if(m_nBmihAlloc == crtAlloc) {
        delete [] m_lpBMIH;
    }

    
else if(m_nBmihAlloc == heapAlloc) {
        ::GlobalUnlock(m_hGlobal);
        ::GlobalFree(m_hGlobal);
    }

    
if(m_nImageAlloc == crtAlloc) delete [] m_lpImage;
    
if(m_hPalette != NULL) ::DeleteObject(m_hPalette);
    
if(m_hBitmap != NULL) ::DeleteObject(m_hBitmap);
    m_nBmihAlloc 
= m_nImageAlloc = noAlloc;
    m_hGlobal 
= NULL;
    m_lpBMIH 
= NULL;
    m_lpImage 
= NULL;
    m_lpvColorTable 
= NULL;
    m_nColorTableEntries 
= 0;
    m_dwSizeImage 
= 0;
    m_lpvFile 
= NULL;
    m_hMap 
= NULL;
    m_hFile 
= NULL;
    m_hBitmap 
= NULL;
    m_hPalette 
= NULL;
}


void CDib::DetachMapFile()
{
    
if(m_hFile == NULL) return;
    ::UnmapViewOfFile(m_lpvFile);
    ::CloseHandle(m_hMap);
    ::CloseHandle(m_hFile);
    m_hFile 
= NULL;
}



posted on 2006-02-20 13:41 夢在天涯 閱讀(3326) 評論(0)  編輯 收藏 引用 所屬分類: MFC/QT

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811983
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲欧美日韩在线不卡| 欧美一级大片在线观看| 亚洲国产精品传媒在线观看| 亚洲午夜久久久久久久久电影网| 久久久久国内| 亚洲综合欧美日韩| 欧美黄在线观看| 亚洲黄网站在线观看| 久久精品久久99精品久久| 亚洲理论在线| 欧美另类变人与禽xxxxx| 91久久国产综合久久蜜月精品 | 国产在线播放一区二区三区| 亚洲无限av看| 亚洲精品五月天| 欧美激情一区二区三区在线视频观看 | 欧美日本高清| 亚洲人被黑人高潮完整版| 蜜臀91精品一区二区三区| 久久av免费一区| 国产亚洲一级| 久久久中精品2020中文| 久久gogo国模裸体人体| 韩国av一区二区三区在线观看 | 鲁大师成人一区二区三区| 激情欧美一区| 欧美成人午夜激情| 免费欧美高清视频| 亚洲精品视频在线观看网站| 亚洲精品在线二区| 国产精品久久久久久久久久免费看| 亚洲欧美日韩一区二区| 亚洲男人天堂2024| 激情成人在线视频| 亚洲电影免费在线观看| 欧美fxxxxxx另类| 一本色道久久综合一区| 亚洲先锋成人| 黄色小说综合网站| 亚洲国产一区二区a毛片| 国产精品国产三级国产a| 久久精品视频播放| 男人插女人欧美| 亚洲尤物视频在线| 久久精品国产综合精品| 日韩午夜激情电影| 亚洲欧美日韩国产综合| 亚洲福利在线看| 亚洲天堂偷拍| 亚洲国产精品女人久久久| 99国产精品视频免费观看| 国产精品视频yy9099| 欧美电影电视剧在线观看| 国产精品theporn| 麻豆av福利av久久av| 欧美精品日韩三级| 久久亚洲国产精品一区二区| 欧美日本亚洲| 男女视频一区二区| 欧美体内she精视频在线观看| 久久久久久久综合狠狠综合| 欧美精品一区在线| 久久最新视频| 国产精品外国| 亚洲欧洲日产国产综合网| 国产日韩欧美精品在线| 亚洲欧洲视频在线| 亚洲国产成人不卡| 欧美一区二区在线免费观看| 国产精品成人一区二区三区夜夜夜 | 国产乱子伦一区二区三区国色天香| 免费不卡在线观看| 国产伦精品一区| 亚洲日产国产精品| 韩国三级电影久久久久久| 一本大道久久精品懂色aⅴ| 亚洲国产精品一区制服丝袜| 欧美与黑人午夜性猛交久久久| 亚洲午夜精品网| 欧美精品在线观看91| 欧美成人激情在线| 国产在线欧美| 欧美一区二区三区四区在线观看地址 | 国产精品色婷婷| 亚洲美女av电影| 日韩视频免费观看| 美女精品自拍一二三四| 久久尤物视频| 韩日视频一区| 欧美中文字幕在线播放| 小嫩嫩精品导航| 国产精品国码视频| 在线中文字幕不卡| 亚洲一级二级| 欧美视频二区| 在线性视频日韩欧美| 亚洲一区二区av电影| 国产精品99免费看| 亚洲视频网在线直播| 亚洲一区亚洲| 国产九九视频一区二区三区| 亚洲免费综合| 欧美中文字幕久久| 国产一区二区日韩精品欧美精品| 欧美一区精品| 嫩草影视亚洲| 亚洲精品一区二区三区四区高清 | 亚洲高清网站| 久久综合久久综合九色| 欧美成人午夜剧场免费观看| 最新国产成人av网站网址麻豆| 欧美99久久| 日韩午夜视频在线观看| 亚洲一区免费观看| 国产农村妇女精品一区二区| 欧美一区二区视频网站| 欧美/亚洲一区| 99这里只有精品| 国产精品视频成人| 久久久久久网| 亚洲日本在线视频观看| 亚洲欧美综合国产精品一区| 韩日精品在线| 午夜精品亚洲| 狼人天天伊人久久| 99国产精品久久久久久久久久| 国产精品v日韩精品| 久久久九九九九| 亚洲国产美女精品久久久久∴| 欧美日产一区二区三区在线观看| 在线一区日本视频| 快射av在线播放一区| 亚洲免费精彩视频| 国产精品夜夜夜| 欧美aaaaaaaa牛牛影院| 亚洲视频一区二区| 欧美成人精精品一区二区频| 亚洲一区二区在线免费观看| 精品成人国产| 欧美午夜视频在线| 久久久久亚洲综合| 亚洲视频在线观看一区| 女人香蕉久久**毛片精品| 中文亚洲欧美| 伊人狠狠色j香婷婷综合| 欧美偷拍一区二区| 久久综合久久综合这里只有精品 | 狼人社综合社区| 亚洲一区二区三区精品动漫| 亚洲第一天堂av| 国产精品三上| 欧美日本国产一区| 久久人人爽爽爽人久久久| 亚洲一区视频在线观看视频| 亚洲电影下载| 久久人人爽爽爽人久久久| 亚洲欧美日韩区| 一区二区三区国产在线| 1024欧美极品| 韩国av一区二区三区在线观看| 国产精品女主播一区二区三区| 欧美日韩成人在线视频| 美女尤物久久精品| 久久精品国产亚洲一区二区三区 | 久久精品一区四区| 亚洲一区日韩| 亚洲视频网在线直播| 亚洲精品黄色| 亚洲精品久久久久久久久久久久久| 国精品一区二区| 国产一区91| 狠狠88综合久久久久综合网| 国产日韩亚洲欧美综合| 国产欧美激情| 国产欧美91| 国内成+人亚洲| 国产一区二区三区四区hd| 国产精品一二三四| 国产欧美精品一区| 国产亚洲视频在线| 韩国亚洲精品| 在线日韩日本国产亚洲| 在线视频成人| 亚洲国产精品成人综合| 亚洲日本黄色| 一本一本久久a久久精品牛牛影视| 日韩亚洲精品电影| 99精品国产高清一区二区| 一区二区av在线| 一区二区三区毛片| 亚洲一区二区三区成人在线视频精品| 一区二区三区产品免费精品久久75| 亚洲精品影院| 日韩香蕉视频| 亚洲欧美大片| 久久国产免费| 美女福利精品视频| 亚洲国产成人精品久久| 亚洲午夜精品一区二区| 性做久久久久久久免费看|