📄 dib.cpp
字号:
&MemDC,
xSrc,ySrc,
dwRop);
MemDC.SelectObject (pOldBmp);
pDC->SelectPalette (pOldPal,TRUE);
return bSuccess;
}
BOOL CDib::Display(CDC *pDC, int xDest, int yDest, int nWidthDest, int nHeightDest, int xSrc, int ySrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)
{
CDC MemDC;
//创建兼容的设备上下文,在此上下文中先处理
MemDC.CreateCompatibleDC (pDC);
//选择位图
CBitmap*pOldBmp=MemDC.SelectObject (m_pBitmap);
//选择调色板
CPalette* pOldPal=pDC->SelectPalette (m_pPalette,TRUE);
//实现调色板(将目前的逻辑调色板复制到系统调色板中)
pDC->RealizePalette ();
//两个设备上下文位对位的拷贝
BOOL bSuccess=pDC->StretchBlt (xDest,yDest,
nWidthDest,nHeightDest,
&MemDC,
xSrc,ySrc,
nWidthSrc,nHeightSrc,
dwRop);
//恢复兼容设备上下文的环境
MemDC.SelectObject (pOldBmp);
pDC->SelectPalette (pOldPal,TRUE);
return bSuccess;
}
BOOL CDib::Display(CDC *pDC, int x, int y, DWORD dwRop)
{
CDC MemDC;
MemDC.CreateCompatibleDC (pDC);
CBitmap*pOldBmp=MemDC.SelectObject (m_pBitmap);
CPalette* pOldPal=pDC->SelectPalette (m_pPalette,TRUE);
pDC->RealizePalette ();
BOOL bSuccess=pDC->BitBlt (x,y,GetWidth(),GetHeight(),
&MemDC,
0,0,
dwRop);
MemDC.SelectObject (pOldBmp);
pDC->SelectPalette (pOldPal,TRUE);
return 1;
}
BOOL CDib::Display(CDC *pDC, CRect rcDest, CRect rcSrc, DWORD dwRop)
{
CDC MemDC;
MemDC.CreateCompatibleDC (pDC);
CBitmap*pOldBmp=MemDC.SelectObject (m_pBitmap);
CPalette* pOldPal=pDC->SelectPalette (m_pPalette,TRUE);
pDC->RealizePalette ();
BOOL bSuccess=pDC->StretchBlt (rcDest.left ,rcDest.top ,
rcDest.Width (),rcDest.Height (),
&MemDC,
rcSrc.left ,rcSrc.top ,
rcSrc.Width (),rcSrc.Height (),
dwRop);
MemDC.SelectObject (pOldBmp);
pDC->SelectPalette (pOldPal,TRUE);
return bSuccess;
}
BOOL CDib::DisplayPalette(CDC *pDC, CRect rc)
{
//获得当前上下文句柄
HDC hDC=pDC->GetSafeHdc ();
//获得当前客户区域矩形
LPRECT lpRect=LPRECT(rc);
//获得当前调色板句柄
HPALETTE hPal=HPALETTE(*m_pPalette);
return ::DisplayPalette(hDC,lpRect, hPal);
}
CDC* CDib::BeginPaint(CDC *pDC)
{
m_pMemDC=new CDC;
m_pMemDC->CreateCompatibleDC (pDC);
m_pPaletteTmp=m_pMemDC->SelectPalette(m_pPalette,TRUE);
m_pMemDC->RealizePalette ();
m_pBitmapTmp=(CBitmap*)m_pMemDC->SelectObject (m_pBitmap);
return m_pMemDC;
}
void CDib::EndPaint()
{
m_pMemDC->SelectObject (m_pBitmapTmp);
m_pMemDC->SelectPalette (m_pPaletteTmp,TRUE);
delete m_pMemDC;
Create(m_hBitmap);
}
//update the DIB DIBSECTION
//建立位图(用于CDC的显示)
BOOL CDib::BuildBitmap()
{
//如以前此变量不为空,清空(用于第二次打开图像)
if(m_pBitmap!=NULL)
{
delete m_pBitmap;
m_pBitmap=NULL;
m_hBitmap=NULL;
}
//根据图像内存块,返回位图内存块句柄(成员变量)
//调用DibAPI函数
m_hBitmap=DIBToDIBSection(m_hDib);
if(m_hBitmap==NULL)
return FALSE;
//根据位图内存块句柄,得到位图指针
m_pBitmap=new CBitmap;
m_pBitmap->Attach (m_hBitmap);
return TRUE;
}
//update the DIB palette
//创建调色板
BOOL CDib::BuildPalette()
{
//主要给成员变量m_pPalette赋值
if(m_pPalette!=NULL)
{
delete m_pPalette;
m_pPalette=NULL;
}
//根据图像内存块句柄,创建调色板数据块
HPALETTE hPalette=CreateDIBPalette(m_hDib);
//根据调色板数据块,生成调色板指针,赋给成员变量
if(hPalette==NULL)
return FALSE;
//创建指针
m_pPalette=new CPalette;
//给指针附加内存块
m_pPalette->Attach (hPalette);
return TRUE;
}
//judge if DIB is NULL
BOOL CDib::IsEmpty()
{
if(m_hDib==NULL)
return TRUE;
if(!GlobalLock(m_hDib))
return TRUE;
GlobalUnlock(m_hDib);
return FALSE;
}
DWORD CDib::GetCompression()
{
LPBITMAPINFOHEADER lpDIB;
lpDIB=(LPBITMAPINFOHEADER)GlobalLock(m_hDib);
DWORD compress=lpDIB->biCompression ;
GlobalUnlock(m_hDib);
return compress;
}
WORD CDib::GetBitCount()
{
return DIBBitCount(m_hDib);
}
LONG CDib::GetWidth()
{
return DIBWidth(m_hDib);
}
LONG CDib::GetHeight()
{
return DIBHeight(m_hDib);
}
LONG CDib::GetWidthBytes()
{
return WIDTHBYTES(GetWidth());
}
WORD CDib::GetColorNumber()
{
return DIBNumColors(m_hDib);
}
WORD CDib::GetPaletteSize()
{
return PaletteSize(m_hDib);
}
CBitmap* CDib::GetBitmap()
{
return m_pBitmap;
}
CPalette* CDib::GetPalette()
{
return m_pPalette;
}
// get DIB handle
HANDLE CDib::GetHandle()
{
return m_hDib;
}
LPBYTE CDib::GetBitsPtr()
{
LPBYTE lpDIB;
lpDIB=(LPBYTE)GlobalLock(m_hDib);
LPBYTE Ptr=FindDIBBits(lpDIB);
GlobalUnlock(m_hDib);
return Ptr;
}
//get the color value of given position
COLORREF CDib::GetPixel(LONG x, LONG y)
{
COLORREF cColor;
switch(GetBitCount())
{
case 1 :
{
if(1<<(7-x%8)&*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y)))
cColor=RGB(255,255,255);
else
cColor=RGB(0,0,0);
}
break;
case 4:
{
PALETTEENTRY PaletteColors[16];
m_pPalette->GetPaletteEntries (0,16,PaletteColors);
int nIndex=(*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y))
&(x%2?0x0f:0xf0))>>(x%2?0:4);
cColor=RGB(PaletteColors[nIndex].peRed ,
PaletteColors[nIndex].peGreen,
PaletteColors[nIndex].peBlue);
}
break;
case 8:
{
PALETTEENTRY PaletteColors[256];
m_pPalette->GetPaletteEntries (0,256,PaletteColors);
int nIndex=(*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y)));
cColor=RGB(PaletteColors[nIndex].peRed ,
PaletteColors[nIndex].peGreen,
PaletteColors[nIndex].peBlue);
}
break;
default:
{
cColor=RGB(*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y)),
*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y)+1),
*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y)+2));
}
break;
}
return cColor;
}
//return the position in the data block of the given point
LONG CDib::GetPixelOffset(LONG x, LONG y)
{
return (GetHeight()-y-1)*GetWidthBytes()+x/(8/GetBitCount());
}
//convert the DIB format
BOOL CDib::ConvertFormat(WORD wBitCount)
{
if(IsEmpty())
return FALSE;
if(GetBitCount()==wBitCount)
return TRUE;
HDIB hNewDib=ConvertDIBFormat(m_hDib,wBitCount,NULL);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib=hNewDib;
return UpdateInternal();
}
//update the palette and DIBSECTION and DDB
BOOL CDib::UpdateInternal()
{
//创建调色板
BuildPalette();
//创建位图
return BuildBitmap();
}
BOOL CDib::DisplayTransparent(CDC *pDC,int x,int y,
COLORREF cTransparentColor)
{
CPalette *pOldPal=pDC->SelectPalette (m_pPalette,TRUE);
pDC->RealizePalette ();
HDC hdc=pDC->GetSafeHdc ();
HBITMAP hBitmap=m_hBitmap;
BITMAP bm;
COLORREF cColor;
HBITMAP bmAndObject,bmAndBack,bmAndMem,bmSave;
HBITMAP bmObjectOld,bmBackOld,bmMemOld,bmSaveOld;
HDC hdcMem,hdcBack,hdcObject,hdcTemp,hdcSave;
POINT ptSize;
hdcTemp=CreateCompatibleDC(hdc);
SelectObject(hdcTemp,hBitmap);//select the bitmap
GetObject(hBitmap,sizeof(BITMAP),(LPBYTE)&bm);
ptSize.x=bm.bmWidth ;
ptSize.y=bm.bmHeight ;
DPtoLP(hdcTemp,&ptSize,1);//convert from device
//to logical pointers
//create some DCs to hold temporary data
hdcBack=CreateCompatibleDC(hdc);
hdcObject=CreateCompatibleDC(hdc);
hdcMem=CreateCompatibleDC(hdc);
hdcSave=CreateCompatibleDC(hdc);
//crete a bitmap for each DC, DCs are required for a number of
//GDI functions
//monochrome DC
bmAndBack=CreateBitmap(ptSize.x,ptSize.y,1,1,NULL);
bmAndObject=CreateBitmap(ptSize.x,ptSize.y,1,1,NULL);
bmAndMem=CreateCompatibleBitmap(hdc,ptSize.x,ptSize.y);
bmSave=CreateCompatibleBitmap(hdc,ptSize.x,ptSize.y);
//each DC must select a bitmap object to store pixel data
bmBackOld=(HBITMAP)SelectObject(hdcBack,bmAndBack);
bmObjectOld=(HBITMAP)SelectObject(hdcObject,bmAndObject);
bmMemOld=(HBITMAP)SelectObject(hdcMem,bmAndMem);
bmSaveOld=(HBITMAP)SelectObject(hdcSave,bmSave);
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcBack,0,0,SRCCOPY);
AfxMessageBox("The hdcBack Window here 0.1");
//debug
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcObject,0,0,SRCCOPY);
AfxMessageBox("The hdcObject Window here 0.2");
//debug
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
AfxMessageBox("The hdcMem Window here 0.3");
//debug
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcSave,0,0,SRCCOPY);
AfxMessageBox("The hdcSave Window here 0.4");
//debug
//set proper mapping mode
SetMapMode(hdcTemp,GetMapMode(hdc));
//save the bitmap sent here, because it will be overwritten
BitBlt(hdcSave,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcSave,0,0,SRCCOPY);
AfxMessageBox("The hdcSave Window here 1");
//debug
//set the background color of the source DC to the color
//contained in the parts of the bitmap that should be
//transparent
cColor=SetBkColor(hdcTemp,cTransparentColor);
//create the object mask for the bitmap by performing a bitblt
//from the source bitmap to a monochrome bitmap
BitBlt(hdcObject,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcObject,0,0,SRCCOPY);
AfxMessageBox("The hdcObject Window here 2");
//debug
//set the background color of the source DC back to the original color
SetBkColor(hdcTemp,cColor);
//create the inverse of the object mask
BitBlt(hdcBack,0,0,ptSize.x,ptSize.y,hdcObject,0,0,NOTSRCCOPY);
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcBack,0,0,SRCCOPY);
AfxMessageBox("The hdcBack Window here 3");
//debug
//copy the background of the main DC to the destination
BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdc,x,y,SRCCOPY);
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
AfxMessageBox("The hdcMem Window here 4");
//debug
//mask out the places where the bitmap will be placed
BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdcObject,0,0,SRCAND);
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
AfxMessageBox("The hdcMem Window here 5");
//debug
//MASK OUT THE TRANSPARENT COLORED PIXELS ONT HE BITMAP
BitBlt(hdcTemp,0,0,ptSize.x,ptSize.y,hdcBack,0,0,SRCAND);
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);
AfxMessageBox("The hdcTemp Window here 6");
//debug
//XOR the birmap with the background on the destination DC
BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCPAINT);
//debug
BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
AfxMessageBox("The hdcMem Window here 7");
//debug
//COPY THE DESTINATION TO THE SCREEN
BitBlt(hdc,x,y,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
//place the original bitmap back into the bitmapsent here
BitBlt(hdcTemp,0,0,ptSize.x,ptSize.y,hdcSave,0,0,SRCCOPY);
//delete the memory bitmaps
DeleteObject(SelectObject(hdcBack,bmBackOld));
DeleteObject(SelectObject(hdcObject,bmObjectOld));
DeleteObject(SelectObject(hdcMem,bmMemOld));
DeleteObject(SelectObject(hdcSave,bmSaveOld));
//delete the memory dcs
DeleteDC(hdcMem);
DeleteDC(hdcBack);
DeleteDC(hdcObject);
DeleteDC(hdcSave);
DeleteDC(hdcTemp);
pDC->SelectPalette (pOldPal,TRUE);
return TRUE;
}
BOOL CDib::Display(int nEffect,CDC *pDC,int x,int y,int nDeta,
DWORD dwDelayTime,DWORD dwRop)
{
if(nEffect==EFFECT_FADE)
return DisplayFadeIn(pDC,x,y,nDeta,dwDelayTime);
else if(nEffect==EFFECT_MOSIAC)
return DisplayMosiacIn(pDC,x,y,nDeta,dwDelayTime,dwRop);
CDC MemDC;
MemDC.CreateCompatibleDC (pDC);
CBitmap* pOldBmp=MemDC.SelectObject (m_pBitmap);
CPalette* pOldPal=pDC->SelectPalette (m_pPalette,TRUE);
pDC->RealizePalette ();
long i=0;
BOOL bDone=FALSE;
while(!bDone)
{
switch(nEffect)
{
case EFFECT_SCANDOWN:
{
if(i>GetHeight())
{
i=GetHeight();
bDone=TRUE;
}//end if
pDC->BitBlt (x,y+i,GetWidth(),nDeta,
&MemDC,0,i,dwRop);
i+=nDeta;
break;
}//end of case EFFECT_SCANDOWN
case EFFECT_SCANUP:
{
if(i>GetHeight())
{
i=GetHeight();
bDone=TRUE;
}//end if
pDC->BitBlt (x,y+GetHeight()-i,GetWidth(),nDeta,
&MemDC,0,GetHeight()-i,dwRop);
i+=nDeta;
break;
}//end of case EFFECT_SCANDUP
case EFFECT_SCANRIGHT:
{
if(i>GetWidth())
{
i=GetWidth();
bDone=TRUE;
}//end if
pDC->BitBlt (x+i,y,nDeta,GetHeight(),
&MemDC,i,0,dwRop);
i+=nDeta;
break;
}//end of case EFFECT_SCANRIGHT
case EFFECT_SCANLEFT:
{
if(i>GetWidth())
{
i=GetWidth();
bDone=TRUE;
}//end if
pDC->BitBlt (x+GetWidth()-i,y,nDeta,GetHeight(),
&MemDC,GetWidth()-i,0,dwRop);
i+=nDeta;
break;
}//end of case EFFECT_SCANLEFT
case EFFECT_VSPLITSCAN:
{
if(i>GetHeight()/2)
{
i=GetHeight()/2;
bDone=TRUE;
}//end if
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -