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

📄 tffdshowpagebase.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
 * Copyright (c) 2002-2006 Milan Cutka
 * based on Cabout.cpp from XviD DirectShow filter
 *
 * 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 "TffdshowPageBase.h"
#include "IffdshowBase.h"
#include "TconfPageBase.h"
#include "Ttranslate.h"
#include "ffdebug.h"
#include "Tconfig.h"

//===================================== ThtiPage ===================================
TconfPageBase* ThtiPage::getPage(void)
{
 if (id)
  for (TconfPages::iterator page=begin();page!=end();page++)
   if ((*page)->forCodec(*id)) return *page;
 return *begin();
}
ThtiPage::~ThtiPage()
{
 for (TconfPages::iterator page=begin();page!=end();page++)
  {
   if ((*page)->m_hwnd) DestroyWindow((*page)->m_hwnd);
   delete *page;
  }
}

//================================= TffdshowPageBase ===============================
TffdshowPageBase::TffdshowPageBase(LPUNKNOWN pUnk,HRESULT *phr,const wchar_t *ItitleW,const char_t *name,int IdialogId,int Iresstr):
 CUnknown(name,pUnk),
 titleW(ItitleW),
 resstr(Iresstr),
 pageSite(NULL),
 dirty(false),
 wasobjectset(false),
 Twindow(NULL),
 hil(NULL),
 page(NULL),
 isShift(false),
 arrowsFont(NULL),
 resorePos(true)
{
//CBasePropertyPage(NAME(name),pUnk,dialogId,resstr)
 ASSERT(phr);
 dialogId=IdialogId;
 m_hwnd=NULL;
}

STDMETHODIMP TffdshowPageBase::GetPageInfo(LPPROPPAGEINFO pPageInfo)
{
 CheckPointer(pPageInfo,E_POINTER);

 pPageInfo->cb               = sizeof(PROPPAGEINFO);
 pPageInfo->pszDocString     = NULL;
 pPageInfo->pszHelpFile      = NULL;
 pPageInfo->dwHelpContext    = 0;

 LPOLESTR pszTitle;
 AMGetWideString(titleW,&pszTitle);
 pPageInfo->pszTitle=pszTitle;

 if (HWND hwnd=createDialog(dialogId,GetDesktopWindow(),0))
  {
   RECT rc;
   GetWindowRect(hwnd,&rc);
   pPageInfo->size.cx=rc.right-rc.left;
   pPageInfo->size.cy=rc.bottom-rc.top;
   DestroyWindow(hwnd);
  }
 else
  {
   pPageInfo->size.cx=340;
   pPageInfo->size.cy=150;
  }
 return S_OK;
}

void TffdshowPageBase::selectPage(TconfPageBase *Ipage)
{
 if (!Ipage->m_hwnd) Ipage->createWindow();
 bool pageChanged=page!=Ipage;
 if (page && pageChanged)
  if (Tconfig::winNT)
   ShowWindow(page->m_hwnd,SW_HIDE);
  else
   page->destroyWindow();
 page=Ipage;
 CRect rp=getChildRect(IDC_PLACE_PAGE);
 SetWindowPos(page->m_hwnd,htv,rp.left,rp.top,0,0,SWP_NOSIZE);
 page->resize(rp);
 pageIs=page->enabled();
 if (page->wndEnabled!=pageIs) page->enable();
 if (pageIs) page->cfg2dlg();
 if (pageChanged) ShowWindow(page->m_hwnd,SW_SHOW);
 enable(page->helpURL!=NULL && pageIs,IDC_BT_HELP);
 InvalidateRect(m_hwnd,NULL,FALSE);
 int lastpage=page->uniqueID();
 cfgSet(IDFF_lastPage,lastpage);
}

ThtiPage* TffdshowPageBase::addTI(TVINSERTSTRUCT *tvis,TconfPageBase *page)
{
 ThtiPage *htiPage=new ThtiPage(NULL,page);htiPages.push_back(htiPage);
 if (tvis)
  {
   tvis->item.lParam=(LPARAM)htiPage;
   tvis->item.pszText=LPTSTR(page->dialogName());
   HTREEITEM hti=TreeView_InsertItem(htv,tvis);
   page->hti=hti;
   htiPage->hti=hti;
  }
 else
  {
   page->hti=NULL;
   htiPage->hti=NULL;
  }
 return htiPage;
}
ThtiPage* TffdshowPageBase::addTI(TVINSERTSTRUCT *tvis,const TconfPages &pages,int *Iid)
{
 ThtiPage *htiPage=new ThtiPage(Iid,pages);htiPages.push_back(htiPage);
 HTREEITEM hti;
 if (tvis)
  {
   tvis->item.lParam=(LPARAM)htiPage;
   tvis->item.pszText=LPTSTR(pages[0]->dialogName());
   tvis->item.iImage=tvis->item.iSelectedImage=0;
   hti=TreeView_InsertItem(htv,tvis);
  }
 else
  hti=NULL;
 for (TconfPages::iterator i=htiPage->begin();i!=htiPage->end();i++)
  (*i)->hti=hti;
 htiPage->hti=hti;
 return htiPage;
}

ThtiPage* TffdshowPageBase::hti2htiPage(HTREEITEM hti)
{
 TVITEM tvi;
 tvi.hItem=hti;
 tvi.mask=TVIF_PARAM;
 TreeView_GetItem(htv,&tvi);
 return (ThtiPage*)tvi.lParam;
}
TconfPageBase* TffdshowPageBase::hti2page(HTREEITEM hti)
{
 return hti2htiPage(hti)->getPage();
}

HWND TffdshowPageBase::findParentDlg(void)
{
 for (HWND dlg=GetParent(m_hwnd);dlg;dlg=GetParent(dlg))
  if (GetWindowStyle(dlg)&WS_DLGFRAME)
   return dlg;
 return NULL;
}

void TffdshowPageBase::translate(void)
{
 Twindow::translate();
 for (ThtiPages::const_iterator hp=htiPages.begin();hp!=htiPages.end();hp++)
  for (TconfPages::const_iterator i=(*hp)->begin();i!=(*hp)->end();i++)
   {
    if ((*i)->m_hwnd) (*i)->translate();
    TVITEM ti;
    ti.hItem=(*i)->hti;
    ti.mask=TVIF_TEXT;
    ti.pszText=LPTSTR((*i)->dialogName());
    TreeView_SetItem(htv,&ti);
    if ((*i)->m_hwnd) (*i)->cfg2dlg();
   }
 if (comptrQ<IPropertyPageSiteFF> siteFF=pageSite)
  siteFF->onTranslate();
}
bool TffdshowPageBase::translateTV()
{
 if (page && tr->translateMode)
  {
   HTREEITEM hti=TreeView_GetDropHilight(htv);
   if (!hti) hti=TreeView_GetSelection(htv);
   ThtiPage *pages=hti2htiPage(hti);
   char_t newtrans[1024]=_l("");
   for (TconfPages::const_iterator page=pages->begin();page!=pages->end();page++)
    {
     const char_t *oldtrans=tr->translate((*page)->dialogId);
     if (oldtrans)
      {
       if (newtrans[0]=='\0')
        {
         strcpy(newtrans,oldtrans);
         if (!inputString(_l("Translate"),oldtrans,newtrans,1024))
          break;
        }
       tr->newTranslation((*page)->dialogId,0,newtrans);
      }
    }
   translate();
   return true;
  }
 return false;
}

void TffdshowPageBase::enableHints(bool is)
{
 cfgSet(IDFF_showHints,is);
 for (ThtiPages::const_iterator hp=htiPages.begin();hp!=htiPages.end();hp++)
  for (TconfPages::const_iterator i=(*hp)->begin();i!=(*hp)->end();i++)
   (*i)->enableHints(is);
}
void TffdshowPageBase::setChange(void)
{
 dirty=true;
 if (pageSite) pageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
}

void TffdshowPageBase::onHelp(void)
{
 if (!page || !page->helpURL) return;
 char_t fullflnm[MAX_PATH];
 _makepath(fullflnm,NULL,config->pth,_l("help\\"),NULL);
 strcat(fullflnm,page->helpURL);
 if (fileexists(fullflnm))
  ShellExecute(m_hwnd,_l("open"),fullflnm,NULL,_l("."),SW_SHOWNORMAL);
}

STDMETHODIMP TffdshowPageBase::SetPageSite(LPPROPERTYPAGESITE IpageSite)
{
 if (IpageSite)
  {
   if (pageSite)
    return E_UNEXPECTED;
   pageSite=IpageSite;
   pageSite->AddRef();
  }
 else
  {
   if (!pageSite)
    return E_UNEXPECTED;
   pageSite->Release();
   pageSite=NULL;
  }
 return S_OK;
}

STDMETHODIMP TffdshowPageBase::SetObjects(ULONG cObjects,LPUNKNOWN *ppUnk)
{
 if (cObjects==1)
  {
   if (!ppUnk || !*ppUnk) return E_POINTER;
   wasobjectset=true;
   return OnConnect(*ppUnk);
  }
 else if (cObjects==0)
  {
   wasobjectset=false;
   return OnDisconnect();
  }
 else
  return E_UNEXPECTED;
}

HRESULT TffdshowPageBase::OnConnect(IUnknown *pUnk)
{
 DPRINTF(_l("On connect 1"));
 if (!(deci=pUnk)) return E_NOINTERFACE;
 ASSERT(deci);
 deci->initDialog();
 deci->loadDialogSettings();
 setDeci(deci);
 DPRINTF(_l("On connect 2"));
 return S_OK;
}
HRESULT TffdshowPageBase::OnDisconnect(void)
{
 if (deci) deci->doneDialog();
 deci=NULL;
 return S_OK;
}

STDMETHODIMP TffdshowPageBase::Activate(HWND hwndParent,LPCRECT rect,BOOL fModal)
{
 CheckPointer(rect,E_POINTER);

 if (!wasobjectset) return E_UNEXPECTED;
 if (m_hwnd) return E_UNEXPECTED;

 HWND hwnd=createDialog(dialogId,hwndParent);
 if (hwnd==NULL) return E_OUTOFMEMORY;
 //setHWND(hwnd);
 translate();

 Move(rect);
 Show(SW_SHOWNORMAL);

 //LOGFONT lf={-13L,-13L,0L,0L,FW_NORMAL,0,0,0,SYMBOL_CHARSET,OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,FF_ROMAN+VARIABLE_PITCH,"Webdings"};
 LOGFONT lf={18L,0L,0L,0L,FW_NORMAL,0,0,0,SYMBOL_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_DONTCARE+DEFAULT_PITCH,_l("Webdings")};
 arrowsFont=CreateFontIndirect(&lf);

 dlg=findParentDlg();
 if (IsWindow(dlg))
  {
   if (resorePos && cfgGet(IDFF_dlgRestorePos))
    {
     int x,y;
     x=cfgGet(IDFF_dlgPosX);
     y=cfgGet(IDFF_dlgPosY);
     WINDOWPLACEMENT wpl;
     wpl.length=sizeof(wpl);
     GetWindowPlacement(dlg,&wpl);

⌨️ 快捷键说明

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