📄 skin.cpp
字号:
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 + -