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

📄 skin.cpp

📁 模拟popo的一个程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	int Len = strlen(Str);

	for(int i = 0; i < Len; i++)
	{
		if( Str[i] == ';') break;

		Result = Result + Str[i];
	}
	return Result;

}

HBITMAP CSkin::LoadBmpFile(CString Path, CString SkinName,CString IdStr)
{
	CString bmpFileName;
	CString SkinFileName;

	SkinFileName = Path + "skin.ini";

	::GetPrivateProfileString(SkinName,IdStr,"",bmpFileName.GetBuffer(MAX_PATH),MAX_PATH,SkinFileName);

	bmpFileName = GetValue(bmpFileName);

	if( bmpFileName.IsEmpty()) 
		return NULL;

	bmpFileName = Path + bmpFileName;

	//从文件加载bmp图象
	HBITMAP hBmp = (HBITMAP)::LoadImage(NULL,
			bmpFileName,
			IMAGE_BITMAP, 
			0,0, 
			LR_LOADFROMFILE |
			LR_CREATEDIBSECTION |
			LR_DEFAULTSIZE);
	return hBmp;	
}
BOOL CSkin::LoadBMPImage(LPCTSTR sBMPFile,CBitmap& Bitmap, CPalette* pPal)
{
	CFile file;
	if( !file.Open(sBMPFile,CFile::modeRead))
		return FALSE;
	BITMAPFILEHEADER bmfHeader;

	if( file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader)) != sizeof(bmfHeader))
		return FALSE;
	if(bmfHeader.bfType != ((WORD)('M'<<8) | 'B'))
		return FALSE;
	DWORD nPackedDIBLen = file.GetLength() - sizeof(BITMAPFILEHEADER);
	HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED,nPackedDIBLen);

	if( hDIB == 0)
		return FALSE;
	if( file.ReadHuge((LPSTR)hDIB,nPackedDIBLen) != nPackedDIBLen)
	{
		::GlobalFree(hDIB);
		return FALSE;
	}
	
	BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB;

	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB;

	int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;

	LPVOID lpDIBBits;
	if( bmInfo.bmiHeader.biBitCount > 8)
	{
		lpDIBBits = (LPVOID)((LPWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) + ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS)? 3 :0));
	}
	else
		lpDIBBits = (LPVOID)(bmInfo.bmiColors+nColors);

	if( pPal != NULL)
	{
		if( nColors <= 256)
		{
			UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) + nColors);
			LOGPALETTE *pLP = (LOGPALETTE*)new BYTE[nSize];
			pLP->palVersion = 0x300;
			pLP->palNumEntries = nColors;
			for(int i = 0; i < nColors; i++)
			{
				pLP->palPalEntry[i].peRed=bmInfo.bmiColors[i].rgbRed;
				pLP->palPalEntry[i].peGreen=bmInfo.bmiColors[i].rgbGreen;
				pLP->palPalEntry[i].peBlue=bmInfo.bmiColors[i].rgbBlue;
				pLP->palPalEntry[i].peFlags = 0;
			}
			pPal->CreatePalette(pLP);
			delete[] pLP;
		}
	}
	CClientDC dc(NULL);
	CPalette *pOldPalette = NULL;
	if( pPal)
	{
		pOldPalette = dc.SelectPalette(pPal,FALSE);
		dc.RealizePalette();
	}
	HBITMAP hBmp = CreateDIBitmap(dc.m_hDC,
		&bmiHeader,
		CBM_INIT,
		lpDIBBits,
		&bmInfo,
		DIB_RGB_COLORS);

	Bitmap.Detach();
	Bitmap.Attach(hBmp);
	if( pOldPalette)
		dc.SelectPalette(pOldPalette,FALSE);
	::GlobalFree(hDIB);
	return TRUE;
}
COLORREF CSkin::GetColorValue(CString Path, CString SkinName, CString IdStr)
{
	COLORREF clrResult;
	CString strColor;
	CString SkinFileName;

	SkinFileName = Path + "skin.ini";

	::GetPrivateProfileString(SkinName,IdStr,"",strColor.GetBuffer(MAX_PATH),MAX_PATH,SkinFileName);

	strColor = GetValue(strColor);

	clrResult = CreateColor(strColor);
	
	return clrResult;
}

//输入格式为: r,g,b 如: 232,34,223
COLORREF CSkin::CreateColor(CString strColor)
{
	COLORREF clrResult;
	CString szR,szG,szB;
	int iR,iG,iB;
	int Pos1,Pos2,Len;

	clrResult = RGB(0,0,0);

	if( strColor.IsEmpty()) 
		return clrResult;

	Pos1 = strColor.Find(',');
	Pos2 = strColor.Find(',',Pos1+1);
	Len = strColor.GetLength();

	szR = strColor.Left(Pos1);
	szG = strColor.Mid(Pos1+1,Pos2-Pos1-1);
	szB = strColor.Mid(Pos2+1,Len-Pos2-1);

	if( szR.IsEmpty() || szG.IsEmpty() || szB.IsEmpty())
		return clrResult;

	iR = atoi(szR);
	iG = atoi(szG);
	iB = atoi(szB);

	clrResult = RGB(iR,iG,iB);

	return clrResult;
}

int CSkin::GetIntValue(CString Path, CString SkinName, CString IdStr)
{
	int iResult = 0;

	CString strValue;
	CString SkinFileName;

	SkinFileName = Path + "skin.ini";

	::GetPrivateProfileString(SkinName,IdStr,"",strValue.GetBuffer(MAX_PATH),MAX_PATH,SkinFileName);

	strValue = GetValue(strValue);

	iResult = atoi(strValue);

	return iResult;
}

void CSkin::CreateAppImageList()
{
	COLORREF crMask;

	crMask = RGB(255,0,0);
	//主窗口图象列表
	m_pILMainIcon.Create(16, 16, ILC_MASK | ILC_COLOR32, 0, 0);
	m_pILMainIcon.Add(&MainIconBmp,crMask);
	MainIconBmp.Detach();
	DeleteObject(MainIcon);
	MainIcon = NULL;

	//小图标
	m_pILSmallState.Create(16, 16, ILC_MASK | ILC_COLOR32, 0, 0);

	//添加主图标里的第一和第二个到状态列表里
	CopyImage(m_pILMainIcon,m_pILSmallState,1);
	CopyImage(m_pILMainIcon,m_pILSmallState,2);

	m_pILSmallState.Add(&SmallStatusBmp,crMask);
	SmallStatusBmp.Detach();
	DeleteObject(SmallStatus);
	MainIcon = NULL;

	//表情符号
	CBitmap bm;
	bm.LoadBitmap(IDB_EMOTIONS);
	m_pILEmotions.Create(20, 20, ILC_COLOR8 | ILC_MASK, 50, 0);
	m_pILEmotions.Add(&bm, RGB(0, 128, 128));

	//SendMsgIcon	
	m_pILSendMsgIcon.Create(16, 16, ILC_COLOR8 | ILC_MASK, 50, 0);
	m_pILSendMsgIcon.Add(&MsgWndIconBmp,crMask);
	MsgWndIconBmp.Detach();
	DeleteObject(MsgWndIcon);
}
void CSkin::DrawTransparent(CDC *pDC,CPoint dpt, 
	CBitmap &bmp,CPoint spt,CSize sz,COLORREF crColour)
{ 
	COLORREF crOldBack=pDC->SetBkColor(RGB(255,255,255)); 
	COLORREF crOldText=pDC->SetTextColor(RGB(0,0,0)); 

	CDC dcImage, dcMask; 

	//为图像及mask各创建一个DC 
	dcImage.CreateCompatibleDC(pDC); 
	dcMask.CreateCompatibleDC(pDC); 

	//把图像装入image DC 
	CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp); 
	//为“掩码”位图创建一个单色bitmap 
	CBitmap bitmapMask; 
	bitmapMask.CreateBitmap(sz.cx, sz.cy, 1, 1, NULL); //把mask位图装入mask DC 

	CBitmap* pOldBitmapMask = dcMask.SelectObject(&bitmapMask); //用透明色创建“掩码”位图 

	dcImage.SetBkColor(crColour);//crColor是位图中的透明色 
	dcMask.BitBlt(0, 0, sz.cx, sz.cy, &dcImage, spt.x, spt.y, SRCCOPY);//分3步进行实际的绘制 

	pDC->BitBlt(dpt.x, dpt.y, sz.cx, sz.cy, &dcImage,spt.x, spt.y, SRCINVERT); 

	pDC->BitBlt(dpt.x, dpt.y, sz.cx, sz.cy, &dcMask, 0, 0, SRCAND); 

	pDC->BitBlt(dpt.x, dpt.y, sz.cx, sz.cy, &dcImage,spt.x, spt.y, SRCINVERT); //恢复原先设置 

	dcImage.SelectObject(pOldBitmapImage); 
	dcMask.SelectObject(pOldBitmapMask); 

	bitmapMask.DeleteObject();

	dcImage.DeleteDC();
	dcMask.DeleteDC();

	pDC->SetBkColor(crOldBack); 
	pDC->SetTextColor(crOldText);
} 

void CSkin::DeleteAllObject()
{
	//Delete All Object
	if(MainIconBmp.m_hObject != NULL)		MainIconBmp.Detach();
	if(LogoBmp.m_hObject != NULL)			LogoBmp.Detach();
	if(TabBmp.m_hObject != NULL)			TabBmp.Detach();
	if(TabStatusBmp.m_hObject != NULL)		TabStatusBmp.Detach();
	if(MainStatusBmp.m_hObject != NULL)		MainStatusBmp.Detach();
	if(MsgWndIconBmp.m_hObject != NULL)		MsgWndIconBmp.Detach();
	if(CornerBmp.m_hObject != NULL)			CornerBmp.Detach();
	if(TrayMenuIconBmp.m_hObject != NULL)		TrayMenuIconBmp.Detach();
	if(ShortCutMenuIconBmp.m_hObject != NULL)	ShortCutMenuIconBmp.Detach();
	if(SmallStatusBmp.m_hObject != NULL)		SmallStatusBmp.Detach();

	if(MainIcon != NULL)		DeleteObject(MainIcon);
	if(DragMenuPhoto != NULL)	DeleteObject(DragMenuPhoto);
	if(TabBkPhoto != NULL)		DeleteObject(TabBkPhoto);
	if(Tab2Bmp != NULL)		DeleteObject(Tab2Bmp);
	if(MainStatus != NULL)		DeleteObject(MainStatus);
	if(MsgWndIcon != NULL)		DeleteObject(MsgWndIcon);
	if(TrayMenuIcon != NULL)	DeleteObject(TrayMenuIcon);
	if(ShortCutMenuIcon != NULL)	DeleteObject(ShortCutMenuIcon);
	if(SmallStatus != NULL)		DeleteObject(SmallStatus);
	if(Corner != NULL)		DeleteObject(Corner);
	if(MainBkImg != NULL)		DeleteObject(MainBkImg);
	if(NotifyUserAnimate != NULL)	DeleteObject(NotifyUserAnimate);
	if(ChatSmallPhoto != NULL)	DeleteObject(ChatSmallPhoto);
	if(ULBmp != NULL)		DeleteObject(ULBmp);
	if(ULMaskBmp != NULL)		DeleteObject(ULMaskBmp);

	if( m_pILMainIcon.m_hImageList != NULL)
		m_pILMainIcon.DeleteImageList();

	if( m_pILSmallState.m_hImageList != NULL)
		m_pILSmallState.DeleteImageList();

	if( m_pILEmotions.m_hImageList != NULL)
		m_pILEmotions.DeleteImageList();
	
	if( m_pILSendMsgIcon.m_hImageList != NULL)
		m_pILSendMsgIcon.DeleteImageList();
	//
	MainIcon	= NULL;
	MainBkImg	= NULL;
	MainStatus	= NULL;
	SmallStatus	= NULL;
	TabBkPhoto	= NULL;
	Corner		= NULL;
	ShortCutMenuIcon= NULL;
	DragMenuPhoto	= NULL;
	NotifyUserAnimate= NULL;
	MsgWndIcon	= NULL;
	Tab2Bmp		= NULL;
	TrayMenuIcon	= NULL;
	ChatSmallPhoto	= NULL;
	ULBmp		= NULL;
	ULMaskBmp	= NULL;
}

void CSkin::AttachAllBitmap()
{
	if(MainIcon != NULL)		MainIconBmp.Attach(MainIcon);
	if(DragMenuPhoto != NULL)	LogoBmp.Attach(DragMenuPhoto);
	if(TabBkPhoto != NULL)		TabBmp.Attach(TabBkPhoto);
	if(Tab2Bmp != NULL)		TabStatusBmp.Attach(Tab2Bmp);
	if(MainStatus != NULL)		MainStatusBmp.Attach(MainStatus);
	if(MsgWndIcon != NULL)		MsgWndIconBmp.Attach(MsgWndIcon);
	if(Corner != NULL)		CornerBmp.Attach(Corner);
	if(TrayMenuIcon != NULL)	TrayMenuIconBmp.Attach(TrayMenuIcon);
	if(ShortCutMenuIcon != NULL)	ShortCutMenuIconBmp.Attach(ShortCutMenuIcon);
	if(SmallStatus != NULL)		SmallStatusBmp.Attach(SmallStatus);


}

HBITMAP CSkin::GetImage(CImageList& list, int num,COLORREF clrBkColor)
{
	CBitmap dist;
	CClientDC dc(NULL);

	IMAGEINFO ii;
	list.GetImageInfo(num, &ii);

	int nWidth = ii.rcImage.right - ii.rcImage.left;
	int nHeight = ii.rcImage.bottom - ii.rcImage.top;

	dist.CreateCompatibleBitmap(&dc, nWidth, nHeight);
	CDC memDC;
	memDC.CreateCompatibleDC(&dc);
	CBitmap* pOldBitmap = memDC.SelectObject(&dist);
	
	memDC.FillSolidRect(0, 0, nWidth, nHeight,clrBkColor);

	list.Draw(&memDC, num, CPoint(0, 0), ILD_NORMAL);

	memDC.SelectObject(pOldBitmap);

	return (HBITMAP)dist.Detach();
}

void CSkin::CopyImage(CImageList &srcIL, CImageList &dstIL, int nSrcImage)
{
	CBitmap bmpTemp;
	HBITMAP hBmp;

	hBmp = GetImage(srcIL,nSrcImage);
	bmpTemp.Attach(hBmp);
	dstIL.Add(&bmpTemp,RGB(255,0,0));
	bmpTemp.Detach();
	DeleteObject(hBmp);
}

⌨️ 快捷键说明

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