📄 cfont.cpp
字号:
/*
* Copyright (c) 2002-2006 Milan Cutka
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "stdafx.h"
#include "Cfont.h"
#include "TfontSettings.h"
#include "IffdshowParamsEnum.h"
#include "reg.h"
#include <tchar.h>
#include <string.h>
int CALLBACK TfontPage::EnumFamCallBackCharsets(CONST LOGFONT *lpelf,CONST TEXTMETRIC *lpntm,DWORD FontType,LPARAM lParam)
{
if (FontType&(TRUETYPE_FONTTYPE|DEVICE_FONTTYPE))
{
ints *sl=(ints*)lParam;
ints::iterator i=std::find(sl->begin(),sl->end(),int(lpelf->lfCharSet));
if (i==sl->end())
sl->push_back(lpelf->lfCharSet);
}
return 1;
}
int CALLBACK TfontPage::EnumFamCallBackFonts(CONST LOGFONT *lpelf,CONST TEXTMETRIC *lpntm,DWORD FontType,LPARAM lParam)
{
if (FontType&(TRUETYPE_FONTTYPE|DEVICE_FONTTYPE)/* && lpelf->lfCharSet==0*/)
{
strings *sl=(strings*)lParam;
strings::iterator i=std::find(sl->begin(),sl->end(),ffstring(lpelf->lfFaceName));
if (i==sl->end())
sl->push_back(lpelf->lfFaceName);
}
return 1;
}
void TfontPage::init(void)
{
tbrSetRange(IDC_TBR_FONT_SPACING,-10,10,2);
tbrSetRange(IDC_TBR_FONT_OUTLINE_STRENGTH,0,100,10);
tbrSetRange(IDC_TBR_FONT_OUTLINE_RADIUS,1,100,10);
tbrSetRange(IDC_TBR_FONT_XSCALE,30,300);
tbrSetRange(IDC_TBR_FONT_SUBSHADOW_SIZE,0,20, 1);
tbrSetRange(IDC_TBR_FONT_SUBSHADOW_ALPHA,0,255, 10);
strings sl;
LOGFONT lf;lf.lfCharSet=DEFAULT_CHARSET;lf.lfPitchAndFamily=0;lf.lfFaceName[0]='\0';
HDC dc=GetDC(m_hwnd);
EnumFontFamiliesEx(dc,&lf,EnumFamCallBackFonts,LPARAM(&sl),0);
ReleaseDC(m_hwnd,dc);
for (strings::const_iterator il=sl.begin();il!=sl.end();il++)
cbxAdd(IDC_CBX_FONT_NAME,il->c_str());
cbxCharset=GetDlgItem(m_hwnd,IDC_CBX_FONT_CHARSET);
boldFont=NULL;
}
void TfontPage::selectCharset(int ii)
{
int cnt=(int)SendMessage(cbxCharset,CB_GETCOUNT,0,0);
for (int i=0;i<cnt;i++)
{
int iii=(int)cbxGetItemData(IDC_CBX_FONT_CHARSET,i);
if (ii==iii)
{
cbxSetCurSel(IDC_CBX_FONT_CHARSET,i);
return;
}
}
cbxSetCurSel(IDC_CBX_FONT_CHARSET,0);
cfgSet(idff_fontcharset,(int)cbxGetItemData(IDC_CBX_FONT_CHARSET,0));
}
void TfontPage::fillCharsets(void)
{
int oldi=cbxGetCurSel(IDC_CBX_FONT_CHARSET);
int oldii=(oldi!=CB_ERR)?(int)cbxGetItemData(IDC_CBX_FONT_CHARSET,oldi):ANSI_CHARSET;
cbxClear(IDC_CBX_FONT_CHARSET);memset(validCharsets,0,sizeof(validCharsets));
ints sl;
LOGFONT lf;
cfgGet(idff_fontname,lf.lfFaceName,LF_FACESIZE);
lf.lfCharSet=DEFAULT_CHARSET;lf.lfPitchAndFamily=0;
HDC dc=GetDC(m_hwnd);
EnumFontFamiliesEx(dc,&lf,EnumFamCallBackCharsets,LPARAM(&sl),0);
ReleaseDC(m_hwnd,dc);
for (int i=0;TfontSettings::charsets[i]!=-1;i++)
{
int data=TfontSettings::charsets[i];
if (isIn(sl,data))
validCharsets[data]=true;
cbxAdd(IDC_CBX_FONT_CHARSET,_(IDC_CBX_FONT_CHARSET,TfontSettings::getCharset(data)),data);
}
selectCharset(oldii);
}
void TfontPage::cfg2dlg(void)
{
font2dlg();
}
void TfontPage::font2dlg(void)
{
size2dlg();
shadow2dlg();
spacingxscale2dlg();
shadowSize2dlg();
shadowAlpha2dlg();
cbxSetDataCurSel(IDC_CBX_FONT_WEIGHT,cfgGet(idff_fontweight));
SendDlgItemMessage(m_hwnd,IDC_CBX_FONT_NAME,CB_SELECTSTRING,WPARAM(-1),LPARAM(cfgGetStr(idff_fontname)));
fillCharsets();
#ifdef UNICODE
selectCharset(cfgGet(idff_fontcharset));
#else
char_t lang[20];
TregOpRegRead tl(HKEY_CURRENT_USER,FFDSHOW_REG_PARENT _l("\\") FFDSHOW);
tl._REG_OP_S(IDFF_lang,_l("lang"),lang,20,_l(""));
if (lang[0]=='\0')
{
TregOpRegRead tNSI(HKEY_LOCAL_MACHINE,FFDSHOW_REG_PARENT _l("\\") FFDSHOW);
char_t langId[MAX_PATH];
tNSI._REG_OP_S(0,_l("lang"),langId,MAX_PATH,_l("1033"));
if(strncmp(langId,_l("1041"),4)==0)
{lang[0]='J';lang[1]='P';}
}
if ((lang[0]=='J' || lang[0]=='j') && (lang[1]=='A' || lang[1]=='P' || lang[1]=='a'|| lang[1]=='p')) /* Japanese ANSI or Unicode */
selectCharset(SHIFTJIS_CHARSET);
else
selectCharset(cfgGet(idff_fontcharset));
#endif
setCheck(IDC_CHB_FONT_FAST,cfgGet(idff_fontfast));
repaint(GetDlgItem(m_hwnd,IDC_IMG_FONT_COLOR));
}
void TfontPage::size2dlg(void)
{
int aut;
if (idff_fontautosize)
{
aut=cfgGet(idff_fontautosize);
setCheck(IDC_CHB_FONT_AUTOSIZE,aut);
enable(1,IDC_CHB_FONT_AUTOSIZE);
}
else
{
aut=0;
enable(0,IDC_CHB_FONT_AUTOSIZE);
}
if (aut)
{
tbrSetRange(IDC_TBR_FONT_SIZE,0,100,5);
tbrSet(IDC_TBR_FONT_SIZE,cfgGet(idff_fontsizea),IDC_LBL_FONT_SIZE);
enable(1,IDC_CHB_FONT_AUTOSIZE_VIDEOWINDOW);
}
else
{
tbrSetRange(IDC_TBR_FONT_SIZE,3,127,6);
tbrSet(IDC_TBR_FONT_SIZE,cfgGet(idff_fontsizep),IDC_LBL_FONT_SIZE);
enable(0,IDC_CHB_FONT_AUTOSIZE_VIDEOWINDOW);
}
setCheck(IDC_CHB_FONT_AUTOSIZE_VIDEOWINDOW,cfgGet(IDFF_fontAutosizeVideoWindow));
}
void TfontPage::spacingxscale2dlg(void)
{
if (idff_fontxscale)
{
int xscale=cfgGet(idff_fontxscale);
tbrSet(IDC_TBR_FONT_XSCALE,cfgGet(idff_fontxscale));
setText(IDC_LBL_FONT_XSCALE,_l("%s %i%%"),_(IDC_LBL_FONT_XSCALE),xscale);
}
tbrSet(IDC_TBR_FONT_SPACING,cfgGet(idff_fontspacing),IDC_LBL_FONT_SPACING);
}
INT_PTR TfontPage::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
if (boldFont) DeleteObject(boldFont);boldFont=NULL;
break;
case WM_HSCROLL:
switch (getId(HWND(lParam)))
{
case IDC_TBR_FONT_SIZE:
if (cfgGet(idff_fontautosize))
cfgSet(idff_fontsizea,tbrGet(IDC_TBR_FONT_SIZE));
else
cfgSet(idff_fontsizep,tbrGet(IDC_TBR_FONT_SIZE));
size2dlg();
return TRUE;
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_CHB_FONT_AUTOSIZE:
if (idff_fontautosize)
{
cfgSet(idff_fontautosize,getCheck(IDC_CHB_FONT_AUTOSIZE));
size2dlg();
}
return TRUE;
case IDC_CHB_FONT_AUTOSIZE_VIDEOWINDOW:
if (idff_fontautosizevideowindow)
cfgSet(idff_fontautosizevideowindow,getCheck(IDC_CHB_FONT_AUTOSIZE_VIDEOWINDOW));
return TRUE;
case IDC_IMG_FONT_COLOR:
if (HIWORD(wParam)==STN_CLICKED)
{
if (chooseColor(idff_fontcolor))
{
font2dlg();
repaint(GetDlgItem(m_hwnd,IDC_IMG_FONT_COLOR));
}
return TRUE;
}
break;
}
break;
case WM_DRAWITEM:
if (wParam==IDC_IMG_FONT_COLOR)
{
LPDRAWITEMSTRUCT dis=LPDRAWITEMSTRUCT(lParam);
LOGBRUSH lb;
lb.lbColor=cfgGet(idff_fontcolor);
lb.lbStyle=BS_SOLID;
HBRUSH br=CreateBrushIndirect(&lb);
FillRect(dis->hDC,&dis->rcItem,br);
DeleteObject(br);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -