⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dibsectionce.cpp

📁 迅宝MC3000的PDA程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	// Get the pointer to the image bits
	LPBYTE pBits = (LPBYTE) ds.dsBm.bmBits;

	// Initialize the loop variables
	cColors = min( cColors, cEntries );
	BYTE OldPalIndex = *pBits;

	UINT TestPixelY;
	if (ds.dsBmih.biHeight > 0 )
		// If button up DIB, pBits points to last row
		TestPixelY = ds.dsBm.bmHeight-1;
	else
		// If top down DIB, pBits points to first row
		TestPixelY = 0;

	for (UINT iColor = uStartIndex; iColor < cColors; iColor++)
	{
		COLORREF    rgbColor;

		// Set the palette index for the test pixel,
		// modifying only the bits for one pixel
		*pBits = (iColor << (8 - ds.dsBmih.biBitCount)) |
			(*pBits & ~wIndexMask);

		// now get the resulting color
		rgbColor = GetPixel( hdc, 0, TestPixelY );

		pColors[iColor - uStartIndex].rgbReserved = 0;
		pColors[iColor - uStartIndex].rgbBlue = GetBValue(rgbColor);
		pColors[iColor - uStartIndex].rgbRed = GetRValue(rgbColor);
		pColors[iColor - uStartIndex].rgbGreen = GetGValue(rgbColor);
	}

	// Restore the test pixel
	*pBits = OldPalIndex;

	return cColors;
}

CDC* CDIBSectionCE::GetMemoryDC(CDC* pDC /*=NULL*/, BOOL bSelectPalette /*=TRUE*/)
{
	if (!m_bReuseMemDC)
		ReleaseMemoryDC(TRUE);
	else if (m_MemDC.GetSafeHdc())   // Already created?
	{
#ifndef _WIN32_WCE
		// Flush the GDI batch queue 
		GdiFlush();
#endif
		return &m_MemDC;
	}

	// Create a memory DC compatible with the given DC
	if (pDC)
		m_MemDC.CreateCompatibleDC(pDC);
	else
	{
		HDC hDC = ::GetDC(NULL);    // screen DC
		if (!hDC) return FALSE;
		m_MemDC.CreateCompatibleDC(CDC::FromHandle(hDC));
		::ReleaseDC(NULL, hDC);
	}
	if (!m_MemDC.GetSafeHdc())
		return NULL;

	// Select in the bitmap
	m_hOldBitmap = (HBITMAP) ::SelectObject(m_MemDC.GetSafeHdc(), m_hBitmap);
	if (!m_hOldBitmap)
	{
		m_MemDC.DeleteDC();
		return NULL;
	}

#ifndef DIBSECTION_NO_PALETTE
	// Select in the palette
	if (bSelectPalette && UsesPalette(&m_MemDC))
	{
		// Palette should already have been created - but just in case...
		if (!m_Palette.GetSafeHandle())
			CreatePalette();

		m_pOldPalette = m_MemDC.SelectPalette(&m_Palette, FALSE);
		m_MemDC.RealizePalette();
	}
	else
		m_pOldPalette = NULL;
#endif // DIBSECTION_NO_PALETTE

#ifndef _WIN32_WCE
	// Flush the GDI batch queue 
	GdiFlush();
#endif // _WIN32_WCE

	return &m_MemDC;
}


BOOL CDIBSectionCE::ReleaseMemoryDC(BOOL bForceRelease /*=FALSE*/)
{
	if ( !m_MemDC.GetSafeHdc() || (m_bReuseMemDC && !bForceRelease) )
		return TRUE; // Nothing to do

#ifndef _WIN32_WCE
	// Flush the GDI batch queue 
	GdiFlush();
#endif // _WIN32_WCE

	// Select out the current bitmap
	if (m_hOldBitmap)
		::SelectObject(m_MemDC.GetSafeHdc(), m_hOldBitmap);
	m_hOldBitmap = NULL;

#ifndef DIBSECTION_NO_PALETTE
	// Select out the current palette
	if (m_pOldPalette)
		m_MemDC.SelectPalette(m_pOldPalette, FALSE);
	m_pOldPalette = NULL;
#endif // DIBSECTION_NO_PALETTE

	// Delete the memory DC
	return m_MemDC.DeleteDC();
}





#ifdef _DEBUG
// Makes trace windows a little bit more informative...
void CDIBSectionCE::_ShowLastError()
{
	LPVOID lpMsgBuf;
	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,    
		NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
		(LPTSTR) &lpMsgBuf, 0, NULL);
	TRACE1("Last error: %s\n", lpMsgBuf);
	LocalFree(lpMsgBuf);
}
#else
void CDIBSectionCE::_ShowLastError() {}
#endif

//----------------------------------------------------
DWORD CDIBSectionCE::GetColor(int nIndex )
{ 
	if((nIndex <0)||(nIndex >255))
		return 0L;

	if(nIndex == 0)
		return 0L;

	BYTE R = m_DIBinfo.arColors[nIndex-1].rgbRed;
	BYTE G = m_DIBinfo.arColors[nIndex-1].rgbGreen;  
	BYTE B = m_DIBinfo.arColors[nIndex-1].rgbBlue ;

	return (DWORD)(RGB(R,G,B));

}

//------------------------------------------------------
BOOL CDIBSectionCE::BI_RLE8Processor(HDC hDC,BYTE *pBytes,int nLen,BYTE *pOutBytes,int nWidth)
{
	int nIterator = 0;
	BYTE letter;
	BYTE letter2;
	int nLine = 0;
	int nColume = 0;

	while( nIterator < nLen)
	{
		letter =  pBytes[nIterator];//read
		if(letter == 0x00)// Tag 00
		{
			nIterator ++;
			if(nIterator >= nLen)
				return FALSE;
			letter2 = pBytes[nIterator];
			switch(letter2)
			{
			case 0x00:
				TRACE(L"\n行结束,line = %d, Column = %d",nLine,nColume); 
				nLine++;//行结束 
				nColume = 0;
				break;
			case 0x01:
				TRACE(L"\n图像结束"); 
				return TRUE;//图像结束
				break;
			case 0x02:
				nIterator ++;
				nIterator ++;
				if(nIterator >= nLen)
					return FALSE;
				nColume += pBytes[nIterator-1];
				nLine   += pBytes[nIterator];
				TRACE(L"\n位置移动,行移%d,列移%d,Line = %d,Colum = %d",pBytes[nIterator-1],pBytes[nIterator],nLine,nColume);
				//从当前位置右移pBytes[nIterator-1]个位置后向下移pBytes[nIterator]行
				break;	
			default:
				letter =  letter2;//pBytes[nIterator];//读入数据长度

				if(((int)(letter&0x00ff) +nIterator) >= nLen)
					return FALSE;
				TRACE(L"\n");     
				for(int i = 0 ;i<(int)((letter&0x00ff));i++)
				{
					nIterator++;
					letter2 = pBytes[nIterator];
					TRACE(L" %X",letter2);		    
					//SetPixel(hDC,nColume,nLine,GetColor(letter2));
					pOutBytes[nLine*nWidth +nColume] = letter2;
					nColume++;
				}

				if(((int)((letter&0x00ff))%2) != 0)//word boundary
				{
					//nColume++;
					nIterator++; 
				}

				break;

			}
		}else
		{
			//letter 为点的个数
			//读入颜色索引
			nIterator ++;
			if(nIterator >= nLen)
				return FALSE;
			letter2 = pBytes[nIterator]; 
			TRACE(L"\n");	
			for(int i = 0;i<(int)(letter &0x00FF);i++)
			{   
				TRACE(L" %X",letter2);
				//SetPixel(hDC,nColume,nLine,GetColor(letter2));
				pOutBytes[nLine*nWidth +nColume] = letter2;

				nColume++;
			}

		}//end of else
		nIterator++;
	}//end of while


	TRACE(L"\n Line =  %d",nLine);
	TRACE(L"\n Colume =  %d",nColume);

	return TRUE;
}
//----------------------------------------------------
BOOL CDIBSectionCE::BI_RLE4Processor(HDC hDC,BYTE *pBytes,int nLen,BYTE *pOutBytes,int nWidth)
{
	int  nIterator = 0;
	BYTE letter;
	BYTE letter2;

	BYTE letterKeep  = 0;//字符缓冲器只存半个字节数目的数据,= 0 表示无存储,<> 0 有存储数据
	BOOL letterHasKeep = FALSE;

	int nLine = 0;
	int nColume =0;


	while( nIterator < nLen)
	{
		letter =  pBytes[nIterator];//read

		if(letter == 0x00)// Tag 00
		{
			nIterator ++;

			if(nIterator >= nLen)
				return FALSE;
			letter2 = pBytes[nIterator];
			switch(letter2)
			{
			case 0x00:
				TRACE(L"\n行结束,line = %d, Colum = %d",nLine,nColume); 
				nLine++;//行结束 
				nColume = 0;			
				break;
			case 0x01:
				TRACE(L"\n图像结束"); 
				return TRUE;//图像结束
				break;
			case 0x02:
				nIterator ++;
				nIterator ++;
				if(nIterator >= nLen)
					return FALSE;
				nColume += pBytes[nIterator-1];
				nLine   += pBytes[nIterator];
				TRACE(L"\n位置移动,行移%d,列移%d,Line = %d,Colum = %d",pBytes[nIterator-1],pBytes[nIterator],nLine,nColume);
				//从当前位置右移pBytes[nIterator-1]个位置后向下移pBytes[nIterator]行
				//::MoveTo(hDC,nLine,nColum);
				break;	
			default:
				letter =  letter2;//pBytes[nIterator];//读入数据长度

				if(((int)(letter&0x00ff) +nIterator) >= nLen)
					return FALSE;

				BYTE byHigh,byLow;
				TRACE(L"\n");     
				for(int i = 0 ;i<(int)((letter&0x00ff)/2);i++)
				{
					nIterator++;
					letter2 = pBytes[nIterator];

					byHigh = (BYTE)(letter2>>4 & 0x0F);
					//TRACE(L" %d",byHigh);
					//SetPixel(hDC,nColume/2,nLine,GetColor(byHigh));
					//pOutBytes[nLine*nWidth +nColume] = letter2;
					if(letterHasKeep == FALSE)
					{
						letterKeep = byHigh;
						letterHasKeep = TRUE;

					}
					else
					{
						letterKeep = (letterKeep<<4) +byHigh;
						pOutBytes[nLine*nWidth +nColume] = letterKeep;
						TRACE(L" %d",letterKeep);

						nColume++;
						letterHasKeep = FALSE;
					}


					byLow  = (BYTE)(letter2 & 0x0F);

					//SetPixel(hDC,nColume/2,nLine,GetColor(byLow));
					if(letterHasKeep == FALSE)
					{
						letterKeep = byLow;
						letterHasKeep = TRUE;
					}
					else
					{
						letterKeep = (letterKeep<<4) +byLow;
						pOutBytes[nLine*nWidth +nColume] = letterKeep;
						TRACE(L" %d",letterKeep);
						nColume++;
						letterHasKeep = FALSE;

					}
				}
				if(((int)((letter&0x00ff)/2)%2) != 0)//word boundary
				{
					nIterator++; 
					//nColume ++;
				}
				break;

			}
		}else
		{
			//letter 为点的个数
			//读入颜色索引
			nIterator ++;
			if(nIterator >= nLen)
				return FALSE;
			letter2 = pBytes[nIterator];
			BYTE byHigh,byLow;
			byHigh = (BYTE)(letter2>>4 & 0x0F);
			byLow  = (BYTE)(letter2 & 0x0F);

			TRACE(L"\n");	
			for(int i = 0;i<(int)(letter &0x00FF);i++)
			{   
				if(i%2)
				{
					//byhigh
					//TRACE(L" %d",byLow);
					//SetPixel(hDC,nColume/2,nLine,GetColor(byLow));
					// 
					if(letterHasKeep == FALSE)
					{
						letterKeep = byHigh;
						letterHasKeep = TRUE;

					}
					else
					{
						letterKeep = (letterKeep<<4) +byHigh;
						pOutBytes[nLine*nWidth +nColume] = letterKeep;
						TRACE(L" %d",letterKeep);

						nColume++;
						letterHasKeep = FALSE;
					}
				}else
				{
					//low
					//SetPixel(hDC,nColume/2,nLine,GetColor(byHigh));
					//
					if(letterHasKeep == FALSE)
					{
						letterKeep = byLow;
						letterHasKeep = TRUE;
					}
					else
					{
						letterKeep = (letterKeep<<4) +byLow;
						pOutBytes[nLine*nWidth +nColume] = letterKeep;
						TRACE(L" %d",letterKeep);
						nColume++;
						letterHasKeep = FALSE;
					}
					//
				}//
			}//end of for
		}//end of else
		nIterator++;
	}//end of while


	TRACE(L"\n Line =  %d",nLine);
	TRACE(L"\n Colume =  %d",nColume);

	return TRUE;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -