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

📄 cosd.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
 * 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 + -