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

📄 skin.cpp

📁 p2p软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// CSkin colour scheme

BOOL CSkin::LoadColourScheme(CXMLElement* pBase)
{
	CMapStringToPtr pColours;

	pColours.SetAt( _T("system.base.window"), &CoolInterface.m_crWindow );
	pColours.SetAt( _T("system.base.midtone"), &CoolInterface.m_crMidtone );
	pColours.SetAt( _T("system.base.highlight"), &CoolInterface.m_crHighlight );
	pColours.SetAt( _T("system.base.text"), &CoolInterface.m_crText );
	pColours.SetAt( _T("system.base.hitext"), &CoolInterface.m_crHiText );

	pColours.SetAt( _T("system.back.normal"), &CoolInterface.m_crBackNormal );
	pColours.SetAt( _T("system.back.selected"), &CoolInterface.m_crBackSel );
	pColours.SetAt( _T("system.back.checked"), &CoolInterface.m_crBackCheck );
	pColours.SetAt( _T("system.back.checked.selected"), &CoolInterface.m_crBackCheckSel );
	pColours.SetAt( _T("system.margin"), &CoolInterface.m_crMargin );
	pColours.SetAt( _T("system.border"), &CoolInterface.m_crBorder );
	pColours.SetAt( _T("system.shadow"), &CoolInterface.m_crShadow );
	pColours.SetAt( _T("system.text"), &CoolInterface.m_crCmdText );
	pColours.SetAt( _T("system.text.selected"), &CoolInterface.m_crCmdTextSel );
	pColours.SetAt( _T("system.disabled"), &CoolInterface.m_crDisabled );
	pColours.SetAt( _T("tooltip.back"), &CoolInterface.m_crTipBack );
	pColours.SetAt( _T("tooltip.text"), &CoolInterface.m_crTipText );
	pColours.SetAt( _T("tooltip.border"), &CoolInterface.m_crTipBorder );
	
	pColours.SetAt( _T("taskpanel.back"), &CoolInterface.m_crTaskPanelBack );
	pColours.SetAt( _T("taskbox.caption.back"), &CoolInterface.m_crTaskBoxCaptionBack );
	pColours.SetAt( _T("taskbox.caption.text"), &CoolInterface.m_crTaskBoxCaptionText );
	pColours.SetAt( _T("taskbox.primary.back"), &CoolInterface.m_crTaskBoxPrimaryBack );
	pColours.SetAt( _T("taskbox.primary.text"), &CoolInterface.m_crTaskBoxPrimaryText );
	pColours.SetAt( _T("taskbox.caption.hover"), &CoolInterface.m_crTaskBoxCaptionHover );
	pColours.SetAt( _T("taskbox.client"), &CoolInterface.m_crTaskBoxClient );
	
	pColours.SetAt( _T("dialog.back"), &m_crDialog );
	pColours.SetAt( _T("panel.caption.back"), &m_crPanelBack );
	pColours.SetAt( _T("panel.caption.text"), &m_crPanelText );
	pColours.SetAt( _T("panel.caption.border"), &m_crPanelBorder );
	pColours.SetAt( _T("banner.back"), &m_crBannerBack );
	pColours.SetAt( _T("banner.text"), &m_crBannerText );
	pColours.SetAt( _T("schema.row1"), &m_crSchemaRow[0] );
	pColours.SetAt( _T("schema.row2"), &m_crSchemaRow[1] );
	
	BOOL bSystem = FALSE, bNonBase = FALSE;
	
	for ( POSITION pos = pBase->GetElementIterator() ; pos ; )
	{
		CXMLElement* pXML = pBase->GetNextElement( pos );
		if ( ! pXML->IsNamed( _T("colour") ) ) continue;

		CString strName		= pXML->GetAttributeValue( _T("name") );
		CString strValue	= pXML->GetAttributeValue( _T("value") );
		strName.MakeLower();

		COLORREF* pColour;

		if ( pColours.Lookup( strName, (void*&)pColour ) && strValue.GetLength() == 6 )
		{
			int nRed, nGreen, nBlue;

			_stscanf( strValue.Mid( 0, 2 ), _T("%x"), &nRed );
			_stscanf( strValue.Mid( 2, 2 ), _T("%x"), &nGreen );
			_stscanf( strValue.Mid( 4, 2 ), _T("%x"), &nBlue );

			if ( strName.Find( _T("system.") ) >= 0 )
			{
				bSystem = TRUE;

				if ( ! bNonBase && strName.Find( _T(".base.") ) < 0 )
				{
					bNonBase = TRUE;
					CoolInterface.CalculateColours( TRUE );
				}
			}

			*pColour = RGB( nRed, nGreen, nBlue );
		}
	}

	if ( bSystem && ! bNonBase ) CoolInterface.CalculateColours( TRUE );

	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// CSkin command lookup helper

UINT CSkin::LookupCommandID(CXMLElement* pXML, LPCTSTR pszName)
{
	CString strID = pXML->GetAttributeValue( pszName ? pszName : _T("id") );
	UINT nID = 0;
	
	if ( _istdigit( *(LPCTSTR)strID ) )
	{
		_stscanf( strID, _T("%lu"), &nID );
	}
	else
	{
		nID = CoolInterface.NameToID( strID );
	}
	
	return nID;
}

//////////////////////////////////////////////////////////////////////
// CSkin command map

BOOL CSkin::LoadCommandMap(CXMLElement* pBase)
{
	for ( POSITION pos = pBase->GetElementIterator() ; pos ; )
	{
		CXMLElement* pXML = pBase->GetNextElement( pos );

		if (  pXML->IsNamed( _T("command") ) )
		{
			CString strTemp = pXML->GetAttributeValue( _T("code") );
			UINT nID;

			if ( _stscanf( strTemp, _T("%lu"), &nID ) != 1 )
				return FALSE;

			strTemp = pXML->GetAttributeValue( _T("id") );

			CoolInterface.NameCommand( nID, strTemp );
		}
	}

	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// CSkin fonts

BOOL CSkin::LoadFonts(CXMLElement* pBase, const CString& strPath)
{
	for ( POSITION pos = pBase->GetElementIterator() ; pos ; )
	{
		CXMLElement* pXML = pBase->GetNextElement( pos );
		
		if ( pXML->IsNamed( _T("font") ) )
		{
			CString strName		= pXML->GetAttributeValue( _T("name") );
			CString strFace		= pXML->GetAttributeValue( _T("face") );
			CString strSize		= pXML->GetAttributeValue( _T("size") );
			CString strWeight	= pXML->GetAttributeValue( _T("weight") );
			
			CFont* pFont = NULL;

			if ( strName.CompareNoCase( _T("system.plain") ) == 0 )
			{
				pFont = &CoolInterface.m_fntNormal;
			}
			else if ( strName.CompareNoCase( _T("system.bold") ) == 0 )
			{
				pFont = &CoolInterface.m_fntBold;
			}
			else if ( strName.CompareNoCase( _T("panel.caption") ) == 0 )
			{
				pFont = &CoolInterface.m_fntCaption;
			}
			else
			{
				continue;
			}
			
			if ( pFont->m_hObject ) pFont->DeleteObject();

			if ( strWeight.CompareNoCase( _T("bold") ) == 0 )
				strWeight = _T("700");
			else if ( strWeight.CompareNoCase( _T("normal") ) == 0 )
				strWeight = _T("400");

			int nFontSize = 11, nFontWeight = FW_NORMAL;

			_stscanf( strSize, _T("%i"), &nFontSize );
			_stscanf( strWeight, _T("%i"), &nFontWeight );

			pFont->CreateFont( -nFontSize, 0, 0, 0, nFontWeight, FALSE, FALSE, FALSE,
				DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
				DEFAULT_PITCH|FF_DONTCARE, strFace );
		}
		else if ( pXML->IsNamed( _T("import") ) )
		{
			CString strFile = strPath + pXML->GetAttributeValue( _T("path") );
			BOOL bSuccess = FALSE;
			
			if ( HINSTANCE hGDI = LoadLibrary( _T("gdi32") ) )
			{
				int (WINAPI *pfnAddFontResourceEx)(LPCTSTR, DWORD, PVOID);
				
#ifdef _UNICODE
				(FARPROC&)pfnAddFontResourceEx = GetProcAddress( hGDI, "AddFontResourceExW" );
#else
				(FARPROC&)pfnAddFontResourceEx = GetProcAddress( hGDI, "AddFontResourceExA" );
#endif
				
				if ( pfnAddFontResourceEx != NULL )
				{
					bSuccess = (*pfnAddFontResourceEx)( strFile, FR_PRIVATE, NULL );
				}
				
				FreeLibrary( hGDI );
			}
			
			if ( ! bSuccess )
			{
				bSuccess = AddFontResource( strFile );
			}
			
			if ( bSuccess ) m_pFontPaths.AddTail( strFile );
		}
	}
	
	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// CSkin command images

BOOL CSkin::LoadCommandImages(CXMLElement* pBase, const CString& strPath)
{
	for ( POSITION pos = pBase->GetElementIterator() ; pos ; )
	{
		CXMLElement* pXML = pBase->GetNextElement( pos );
		
		if ( pXML->IsNamed( _T("icon") ) )
		{
			UINT nID = LookupCommandID( pXML );
			if ( nID == 0 ) continue;
			
			CString strFile = strPath;
			strFile += pXML->GetAttributeValue( _T("res") );
			strFile += pXML->GetAttributeValue( _T("path") );
			
			int nPos = strFile.Find( '$' );
			HICON hIcon = NULL;
			
			if ( nPos < 0 )
			{
				if ( ExtractIconEx( strFile, 0, NULL, &hIcon, 1 ) != NULL && hIcon != NULL )
				{
					CoolInterface.AddIcon( nID, hIcon );
				}
			}
			else
			{
				HINSTANCE hInstance = NULL;
				UINT nIconID = 0;
				
				if ( _stscanf( strFile.Left( nPos ), _T("%lu"), &hInstance ) != 1 ) return TRUE;
				if ( _stscanf( strFile.Mid( nPos + 1 ), _T("%lu"), &nIconID ) != 1 ) return TRUE;
				
				hIcon = (HICON)LoadImage( hInstance, MAKEINTRESOURCE(nIconID), IMAGE_ICON, 16, 16, 0 );
				if ( hIcon != NULL ) CoolInterface.AddIcon( nID, hIcon );
			}
		}
		else if ( pXML->IsNamed( _T("bitmap") ) )
		{
			if ( ! LoadCommandBitmap( pXML, strPath ) ) return FALSE;
		}
	}
	
	return TRUE;
}

BOOL CSkin::LoadCommandBitmap(CXMLElement* pBase, const CString& strPath)
{
	static LPCTSTR pszNames[] = { _T("id"), _T("id1"), _T("id2"), _T("id3"), _T("id4"), _T("id5"), _T("id6"), _T("id7"), _T("id8"), _T("id9"), NULL };
	
	CString strFile = strPath;
	strFile += pBase->GetAttributeValue( _T("id") );
	strFile += pBase->GetAttributeValue( _T("path") );
	
	HBITMAP hBitmap = LoadBitmap( strFile );
	if ( hBitmap == NULL ) return TRUE;
	
	strFile = pBase->GetAttributeValue( _T("mask") );
	COLORREF crMask = RGB( 0, 255, 0 );
	
	if ( strFile.GetLength() == 6 )
	{
		int nRed, nGreen, nBlue;
		_stscanf( strFile.Mid( 0, 2 ), _T("%x"), &nRed );
		_stscanf( strFile.Mid( 2, 2 ), _T("%x"), &nGreen );
		_stscanf( strFile.Mid( 4, 2 ), _T("%x"), &nBlue );
		crMask = RGB( nRed, nGreen, nBlue );
	}
	
	CoolInterface.ConfirmImageList();
	int nBase = ImageList_AddMasked( CoolInterface.m_pImages.m_hImageList, hBitmap, crMask );
	
	if ( nBase < 0 )
	{
		DeleteObject( hBitmap );
		return FALSE;
	}
	
	int nIndex = 0;
	
	for ( POSITION pos = pBase->GetElementIterator() ; pos ; )
	{
		CXMLElement* pXML = pBase->GetNextElement( pos );
		if ( ! pXML->IsNamed( _T("image") ) ) continue;
		
		strFile = pXML->GetAttributeValue( _T("index") );
		if ( strFile.GetLength() ) _stscanf( strFile, _T("%i"), &nIndex );
		nIndex += nBase;
		
		for ( int nName = 0 ; pszNames[ nName ] ; nName++ )
		{
			UINT nID = LookupCommandID( pXML, pszNames[ nName ] );
			if ( nID ) CoolInterface.m_pImageMap.SetAt( (LPVOID)nID, (LPVOID)nIndex );
			if ( nName && ! nID ) break;
		}
		
		nIndex -= nBase;
		nIndex ++;
	}
	
	DeleteObject( hBitmap );
	
	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// CSkin default skin

void CSkin::CreateDefault()
{
	// Clear
	
	Clear();
	
	Settings.General.Language = _T("en");
	
	// Base UI
	
	CoolInterface.Clear();
	CoolInterface.CreateFonts();
	CoolInterface.CalculateColours( FALSE );
	
	// Colour Scheme
	
	m_crDialog					= CoolInterface.GetDialogBkColor();
	m_crPanelBack				= RGB( 60, 60, 60 );
	m_crPanelText				= RGB( 255, 255, 255 );
	m_crPanelBorder				= RGB( 0, 0, 0 );
	m_crBannerBack				= RGB( 122, 161, 230 );
	m_crBannerText				= RGB( 250, 250, 255 );
	m_crSchemaRow[0]			= RGB( 245, 245, 255 );
	m_crSchemaRow[1]			= RGB( 214, 223, 247 );
	
	// Command Icons
	
	CoolInterface.AddIcon( ID_CHECKMARK, theApp.LoadIcon( IDI_CHECKMARK ) );
	
	// Default Menu
	
	CMenu* pMenuBar = new CMenu();
	pMenuBar->LoadMenu( IDR_MAINFRAME );
	m_pMenus.SetAt( _T("CMainWnd"), pMenuBar );
	if ( m_mnuDefault.m_hMenu == NULL ) m_mnuDefault.LoadMenu( IDR_POPUPS );
	
	// Load Definitions
	
	LoadFromResource( NULL, IDR_XML_DEFINITIONS );
	LoadFromResource( NULL, IDR_XML_DEFAULT );
	
	// Copying
	
	CoolInterface.CopyIcon( ID_HELP_FAQ, ID_HELP_WEB_1 );
	CoolInterface.CopyIcon( ID_HELP_FAQ, ID_HELP_WEB_2 );
	CoolInterface.CopyIcon( ID_HELP_FAQ, ID_HELP_WEB_3 );
	CoolInterface.CopyIcon( ID_HELP_FAQ, ID_HELP_WEB_4 );
	CoolInterface.CopyIcon( ID_HELP_FAQ, ID_HELP_WEB_5 );
	CoolInterface.CopyIcon( ID_HELP_FAQ, ID_HELP_WEB_6 );
	
	// Plugins
	
	Plugins.RegisterCommands();
}

void CSkin::Finalise()
{
	m_brDialog.CreateSolidBrush( m_crDialog );
	
	if ( HBITMAP hPanelMark = GetWatermark( _T("CPanelWnd.Caption") ) )
	{
		m_bmPanelMark.Attach( hPanelMark );
	}
	else if ( m_crPanelBack == RGB( 60, 60, 60 ) )
	{
		m_bmPanelMark.LoadBitmap( IDB_PANEL_MARK );
	}
	
	CoolMenu.SetWatermark( GetWatermark( _T("CCoolMenu") ) );
	
	Plugins.OnSkinChanged();
}

//////////////////////////////////////////////////////////////////////
// CSkin popup menu helper

UINT CSkin::TrackPopupMenu(LPCTSTR pszMenu, const CPoint& point, UINT nDefaultID, UINT nFlags)
{
	CMenu* pPopup = GetMenu( pszMenu );
	if ( pPopup == NULL ) return 0;
	
	if ( nDefaultID != 0 )
	{
		MENUITEMINFO pInfo;
		pInfo.cbSize	= sizeof(pInfo);
		pInfo.fMask		= MIIM_STATE;
		GetMenuItemInfo( pPopup->GetSafeHmenu(), nDefaultID, FALSE, &pInfo );
		pInfo.fState	|= MFS_DEFAULT;
		SetMenuItemInfo( pPopup->GetSafeHmenu(), nDefaultID, FALSE, &pInfo );
	}
	
	return pPopup->TrackPopupMenu( TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON|nFlags,
		point.x, point.y, AfxGetMainWnd() );
}

//////////////////////////////////////////////////////////////////////
// CSkin draw wrapped text

void CSkin::DrawWrappedText(CDC* pDC, CRect* pBox, LPCTSTR pszText, BOOL bExclude)
{
	CPoint pt = pBox->TopLeft();
	
	LPCTSTR pszWord = pszText;
	LPCTSTR pszScan = pszText;

	UINT nFlags = ETO_CLIPPED | ( bExclude ? ETO_OPAQUE : 0 );
	
	for ( ; ; pszScan++ )
	{
		if ( *pszScan != NULL && (unsigned char)*pszScan > 32 ) continue;
		
		if ( pszWord < pszScan )
		{
			int nLen = pszScan - pszWord + ( *pszScan ? 1 : 0 );
			CSize sz = pDC->GetTextExtent( pszWord, nLen );

			if ( pt.x > pBox->left && pt.x + sz.cx > pBox->right )
			{
				pt.x = pBox->left;
				pt.y += sz.cy;
			}

			CRect rc( pt.x, pt.y, pt.x + sz.cx, pt.y + sz.cy );

			pDC->ExtTextOut( pt.x, pt.y, nFlags, &rc, pszWord, nLen, NULL );
			if ( bExclude ) pDC->ExcludeClipRect( &rc );
			
			pt.x += sz.cx;
			pBox->top = pt.y + sz.cy;
		}

		pszWord = pszScan + 1;
		if ( ! *pszScan ) break;
	}
}

//////////////////////////////////////////////////////////////////////
// CSkin load bitmap helper

HBITMAP CSkin::LoadBitmap(CString& strName)
{
	CImageServices pServices;
	CImageFile pFile( &pServices );
	int nPos = strName.Find( '$' );
	
	if ( nPos < 0 )
	{
		pFile.LoadFromFile( strName );
	}
	else
	{
		HINSTANCE hInstance = NULL;
		UINT nID = 0;
		
		if ( _stscanf( strName.Left( nPos ), _T("%lu"), &hInstance ) != 1 ) return NULL;
		if ( _stscanf( strName.Mid( nPos + 1 ), _T("%lu"), &nID ) != 1 ) return NULL;
		
		if ( LPCTSTR pszType = _tcsrchr( strName, '.' ) )
		{
			pszType ++;
			pFile.LoadFromResource( hInstance, nID, pszType );
		}
		else
		{
			return (HBITMAP)LoadImage( hInstance, MAKEINTRESOURCE(nID), IMAGE_BITMAP, 0, 0, 0 );
		}
	}
	
	return pFile.EnsureRGB() ? pFile.CreateBitmap() : NULL;
}

//////////////////////////////////////////////////////////////////////
// CSkin mode suffixes

LPCTSTR CSkin::m_pszModeSuffix[3][4] =
{
	{ _T(".Windowed"), _T(""), NULL, NULL },			// Windowed
	{ _T(".Tabbed"), _T(""), NULL, NULL },				// Tabbed
	{ _T(".Basic"), _T(".Tabbed"), _T(""), NULL }		// Basic
};

⌨️ 快捷键说明

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