📄 cosd.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 "COSD.h"
#include "TsubtitlesSettings.h"
#include "TffdshowPageDec.h"
#include "IffdshowDecVideo.h"
//=================================== TOSDpageDec ==================================
void TOSDpageDec::init(void)
{
tbrSetRange(IDC_TBR_OSD_POSX,0,100,10);
tbrSetRange(IDC_TBR_OSD_POSY,0,100,10);
setFont(IDC_BT_OSD_PRESETS ,parent->arrowsFont);
setFont(IDC_BT_OSD_LINE_UP ,parent->arrowsFont);
setFont(IDC_BT_OSD_LINE_DOWN,parent->arrowsFont);
hlv=GetDlgItem(m_hwnd,IDC_LV_OSD_LINES);
ListView_SetExtendedListViewStyleEx(hlv,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
int ncol=0;
RECT r;
GetWindowRect(hlv,&r);
ListView_AddCol(hlv,ncol,r.right-r.left-26,_l("OSD item"),false);
edLimitText(IDC_ED_OSD_USER,240);
dragitem=-1;
CRect rp;GetWindowRect(m_hwnd,&rp);
CRect rc;GetWindowRect(hlv,&rc);
lvx=rc.left-rp.left;lvy=rc.top-rp.top;
edLimitText(IDC_ED_OSD_SAVE,MAX_PATH);
}
void TOSDpageDec::cfg2dlg(void)
{
pos2dlg();
osds2dlg();
}
void TOSDpageDec::pos2dlg(void)
{
char_t s[260];int x;
x=cfgGet(IDFF_OSDposX);
TsubtitlesSettings::getPosHoriz(x,s,this,IDC_LBL_OSD_POSX);
setDlgItemText(m_hwnd,IDC_LBL_OSD_POSX,s);
tbrSet(IDC_TBR_OSD_POSX,x);
x=cfgGet(IDFF_OSDposY);
TsubtitlesSettings::getPosVert(x,s,this,IDC_LBL_OSD_POSY);
setDlgItemText(m_hwnd,IDC_LBL_OSD_POSY,s);
tbrSet(IDC_TBR_OSD_POSY,x);
}
void TOSDpageDec::osds2dlg(void)
{
nostate=true;
osdslabels.clear();
cbxClear(IDC_CBX_OSD_PRESETS);
int cnt=deciD->getOSDpresetCount2();
const char_t *startpresetname=cfgGetStr(IDFF_OSDstartPreset);
for (int i=0;i<cnt;i++)
{
const char_t *presetname=deciD->getOSDpresetName2(i);
if (startpresetname && strcmp(startpresetname,presetname)==0)
osdslabels.push_back(ffstring(presetname)+ffstring(_(IDC_CBX_OSD_PRESETS,_l(" (show on startup)"))));
else
osdslabels.push_back(presetname);
cbxAdd(IDC_CBX_OSD_PRESETS,osdslabels.back().c_str(),intptr_t(presetname));
}
const char_t *curpreset=cfgGetStr(IDFF_OSDcurPreset);
for (int i=0;i<cnt;i++)
if (strcmp(curpreset,(const char_t*)cbxGetItemData(IDC_CBX_OSD_PRESETS,i))==0)
{
cbxSetCurSel(IDC_CBX_OSD_PRESETS,i);
break;
}
osd2dlg();
nostate=false;
}
int CALLBACK TOSDpageDec::osdsSort(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{
TOSDpageDec *self=(TOSDpageDec*)lParamSort;
return std::find(self->osds.begin(),self->osds.end(),int(lParam1))>std::find(self->osds.begin(),self->osds.end(),int(lParam2));
}
void TOSDpageDec::osd2dlg(void)
{
const char_t *osdsStr=deciD->getOSDpresetFormat2(NULL);
if (strncmp(osdsStr,_l("user"),4)==0)
{
ListView_SetExtendedListViewStyleEx(hlv,LVS_EX_CHECKBOXES,0);
setCheck(IDC_CHB_OSD_USER,1);enable(1,IDC_ED_OSD_USER);
setText(IDC_ED_OSD_USER,_l("%s"),osdsStr+4);
user=true;
}
else
{
ListView_SetExtendedListViewStyleEx(hlv,LVS_EX_CHECKBOXES,LVS_EX_CHECKBOXES);
setCheck(IDC_CHB_OSD_USER,0);enable(0,IDC_ED_OSD_USER);
strtok(osdsStr,_l(" "),osds);
int cnt=ListView_GetItemCount(hlv);
nostate=true;
for (int j=0;j<cnt;j++)
ListView_SetCheckState(hlv,j,FALSE);
nostate=false;
for (ints::const_iterator i=osds.begin();i!=osds.end();i++)
checkOSDline(*i,true);
ListView_SortItems(hlv,osdsSort,LPARAM(this));
user=false;
}
save2dlg();
}
void TOSDpageDec::save2dlg(void)
{
int is=cfgGet(IDFF_OSDisSave);
setCheck(IDC_CHB_OSD_SAVE,is);
int isUser=getCheck(IDC_CHB_OSD_USER);
enable(!isUser,IDC_CHB_OSD_SAVE);
setDlgItemText(m_hwnd,IDC_ED_OSD_SAVE,cfgGetStr(IDFF_OSDsaveFlnm));
is&=!isUser;
static const int idSave[]={IDC_ED_OSD_SAVE,IDC_BT_OSD_SAVE,0};
enable(is,idSave);
}
void TOSDpageDec::checkOSDline(int idff,bool check)
{
nostate=true;
LVFINDINFO lvfi;memset(&lvfi,0,sizeof(lvfi));
lvfi.flags=LVFI_PARAM;
lvfi.lParam=idff;
int i=ListView_FindItem(hlv,-1,&lvfi);
if (i!=-1) ListView_SetCheckState(hlv,i,check);
nostate=false;
}
void TOSDpageDec::lv2osdFormat(void)
{
char_t format[256]=_l("");
int cnt=ListView_GetItemCount(hlv);
for (int i=0;i<cnt;i++)
if (ListView_GetCheckState(hlv,i))
strcatf(format,_l("%i "),lvGetItemParam(IDC_LV_OSD_LINES,i));
if (format[strlen(format)-1]==' ') format[strlen(format)-1]='\0';
deciD->setOSDpresetFormat(NULL,format);
parent->setChange();
}
int TOSDpageDec::findPreset(const char_t *presetname)
{
int cnt=cbxGetItemCount(IDC_CBX_OSD_PRESETS);
for (int i=0;i<cnt;i++)
if (stricmp((const char_t*)cbxGetItemData(IDC_CBX_OSD_PRESETS,i),presetname)==0)
return i;
return CB_ERR;
}
INT_PTR TOSDpageDec::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_CHB_OSD:
cfgSet(IDFF_isOSD,getCheck(IDC_CHB_OSD));
parent->drawInter();
return TRUE;
case IDC_CHB_OSD_USER:
if (!getCheck(IDC_CHB_OSD_USER))
lv2osdFormat();
else
deciD->setOSDpresetFormat(NULL,_l("user"));
osd2dlg();
parent->setChange();
break;
case IDC_ED_OSD_USER:
if (HIWORD(wParam)==EN_CHANGE && !isSetWindowText)
{
char_t ed[250];
GetDlgItemText(m_hwnd,IDC_ED_OSD_USER,ed,250);
char_t format[256];
tsnprintf(format,256,_l("user%s"),ed);format[255]='\0';
deciD->setOSDpresetFormat(NULL,format);
parent->setChange();
};
break;
case IDC_ED_OSD_SAVE:
if (HIWORD(wParam)==EN_CHANGE && !isSetWindowText)
parent->setChange();
return TRUE;
}
break;
case WM_NOTIFY:
{
NMHDR *nmhdr=LPNMHDR(lParam);
if (!nostate && nmhdr->hwndFrom==hlv && nmhdr->idFrom==IDC_LV_OSD_LINES)
switch (nmhdr->code)
{
case LVN_ITEMCHANGED:
{
LPNMLISTVIEW nmlv=LPNMLISTVIEW(lParam);
if (nmlv->uChanged&LVIF_STATE && ((nmlv->uOldState&4096)!=(nmlv->uNewState&4096)))
lv2osdFormat();
return TRUE;
}
case LVN_BEGINDRAG:
{
if (!user)
{
LPNMLISTVIEW nmlv=LPNMLISTVIEW(lParam);
if (nmlv->iItem!=-1)
{
dragitem=nmlv->iItem;
SetCapture(m_hwnd);
}
}
break;
}
case NM_DBLCLK:
{
if (user)
{
LPNMITEMACTIVATE nmia=LPNMITEMACTIVATE(lParam);
if (nmia->iItem!=-1)
{
const char_t *shortcut=deci->getInfoItemShortcut((int)lvGetItemParam(IDC_LV_OSD_LINES,nmia->iItem));
if (shortcut && shortcut[0])
{
char_t osd[240];
tsprintf(osd,_l("%%%s"),shortcut);
SendDlgItemMessage(m_hwnd,IDC_ED_OSD_USER,EM_REPLACESEL,TRUE,LPARAM(osd));
}
}
}
break;
}
}
break;
}
case WM_MOUSEMOVE:
if (dragitem!=-1)
{
LVHITTESTINFO lvhti;
lvhti.pt.x=LOWORD(lParam)-lvx;
lvhti.pt.y=HIWORD(lParam)-lvy;
int target=ListView_HitTest(hlv,&lvhti);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -