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