tffdshowpagedec.cpp

来自「从FFMPEG转换而来的H264解码程序,VC下编译..」· C++ 代码 · 共 520 行 · 第 1/2 页

CPP
520
字号
 if (htiLast0) TreeView_Expand(htv,htiLast0,TVE_EXPAND);
 sortOrder();
 if (previd)
  treeSelectItem(previd,prevVisId);
}

INT_PTR TffdshowPageDec::msgProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 switch (uMsg)
  {
   case WM_COMMAND:
    switch (LOWORD(wParam))
     {
      case IDC_CBX_PRESETS:
       if (HIWORD(wParam)==CBN_SELCHANGE)
        {
         char_t presetName[256],actPresetName[256];
         GetDlgItemText(m_hwnd,IDC_CBX_PRESETS,presetName,255);
         deciD->getActivePresetName(actPresetName,255);
         if (stricmp(presetName,actPresetName)!=0)
          selectPreset(presetName);
         return TRUE;
        }
       break;
     }
    break;
   case WM_FFONNEWFILTERS:
    {
     for (ThtiPages::const_iterator hp=filterPages.begin();hp!=filterPages.end();hp++)
      for (TconfPages::const_iterator i=(*hp)->begin();i!=(*hp)->end();i++)
       ((TconfPageDec*)(*i))->onNewFilter();
     return TRUE;
    }
   case WM_NOTIFY:
    {
     NMHDR *nmhdr=LPNMHDR(lParam);
     if (nmhdr->hwndFrom==htv && nmhdr->idFrom==IDC_TV_TREE)
      switch (nmhdr->code)
       {
        case TVN_GETINFOTIP:
         {
          if (!cfgGet(IDFF_showHints)) return FALSE;
          NMTVGETINFOTIP *nmtvit=LPNMTVGETINFOTIP(lParam);
          TconfPageBase *page=hti2page(nmtvit->hItem);
          char_t tipS[1024]=_l("");
          if (deciD->getFilterTipEx(page->filterID,page->filterPageID,tipS,1023)!=S_OK)
           page->getTip(tipS,1023);
          if (tipS[0]=='\0') return FALSE;
          memset(nmtvit->pszText,0,nmtvit->cchTextMax);
          strncpy(nmtvit->pszText,tipS,nmtvit->cchTextMax-1);
          return TRUE;
         }
        case NM_CUSTOMDRAW:
         {
          NMTVCUSTOMDRAW *tvcd=LPNMTVCUSTOMDRAW(lParam);
          int rcDy=tvcd->nmcd.rc.bottom-tvcd->nmcd.rc.top;
          if (tvcd->nmcd.dwDrawStage==CDDS_PREPAINT)
           {
            setDlgResult(CDRF_NOTIFYITEMDRAW);
            return TRUE;
           }
          else if (tvcd->nmcd.dwDrawStage==CDDS_ITEMPREPAINT)
           {
            TconfPageBase *page=((ThtiPage*)tvcd->nmcd.lItemlParam)->getPage();
            if (page->getInter()==-1 && page->getOrder()==-1) return FALSE;
            setDlgResult(CDRF_NOTIFYPOSTPAINT);
            return TRUE;
           }
          else if (tvcd->nmcd.dwDrawStage==CDDS_ITEMPOSTPAINT)
           {
            RECT &tr=tvcd->nmcd.rc;
            if (tr.right>tr.left && tr.bottom>tr.top)
             {
              RECT rr;
              TreeView_GetItemRect(htv,HTREEITEM(tvcd->nmcd.dwItemSpec),&rr,true);
              rr.left-=24;
              TconfPageBase *page=((ThtiPage*)tvcd->nmcd.lItemlParam)->getPage();
              if (page->getInter()!=-1) ImageList_Draw(hil,page->getInter()?ilChecked:ilClear,tvcd->nmcd.hdc,tr.left+8+rr.left,tr.top+(rcDy-16)/2,ILD_TRANSPARENT);
              if (isIn(page->getOrder(),deciD->getMinOrder2(),deciD->getMaxOrder2()) && (tvcd->nmcd.uItemState&CDIS_SELECTED))
               {
                int img;
                HTREEITEM hti=page->hti;
                HTREEITEM htiPrev=TreeView_GetPrevVisible(htv,hti),htiNext=TreeView_GetNextVisible(htv,hti);
                int order=page->getOrder(),orderPrev=hti2page(htiPrev)->getOrder(),orderNext=hti2page(htiNext)->getOrder();
                if (order==deciD->getMinOrder2()) img=ilArrowD;
                else if (order==deciD->getMaxOrder2()) img=ilArrowU;
                else img=ilArrowUD;
                ImageList_DrawEx(hil,img,tvcd->nmcd.hdc,tr.left+2+rr.left,tr.top+(rcDy-16)/2,5,16,CLR_DEFAULT,CLR_DEFAULT,ILD_TRANSPARENT);
               }
             }
            return TRUE;
           }
          return FALSE;
         }
        case NM_CLICK:
         {
          POINT ps;
          GetCursorPos(&ps);
          ScreenToClient(htv,&ps);
          TVHITTESTINFO tvhti;
          tvhti.pt=ps;
          HTREEITEM hti=TreeView_HitTest(htv,&tvhti);
          if (!hti) return FALSE;
          RECT rr;
          TreeView_GetItemRect(htv,hti,&rr,TRUE);
          RECT r;
          TreeView_GetItemRect(htv,hti,&r,FALSE);
          ps.x-=rr.left-24;
          int iconTop=((r.bottom-r.top)-16)/2;
          ps.y-=r.top;
          if (ps.x>=8 && ps.x<=16+8 && ps.y>=iconTop+2 && ps.y<=iconTop+13)
           {
            if (invInter(hti2page(hti),&r))
             return TRUE;
           }
          else if (ps.x>=2 && ps.x<=7 && TreeView_GetSelection(htv)==tvhti.hItem)
           {
            int center=(r.bottom-r.top)/2;
            if (ps.y>center-6 && ps.y<center-1 && page->getOrder()>deciD->getMinOrder2())
             {
              swap(-1);
              return TRUE;
             }
            else if (ps.y>center+1 && ps.y<center+6 && page->getOrder()<deciD->getMaxOrder2())
             {
              swap(1);
              return TRUE;
             }
           }
          return FALSE;
         }
        case TVN_BEGINDRAG:
         {
          NMTREEVIEW *nmtv=LPNMTREEVIEW(lParam);
          dragpage=hti2page(nmtv->itemNew.hItem);
          int order=dragpage->getOrder();
          TreeView_SelectItem(htv,nmtv->itemNew.hItem);
          if (isIn(order,deciD->getMinOrder2(),deciD->getMaxOrder2()))
           SetCapture(m_hwnd);
          else
           dragpage=NULL;
          break;
         }
       }
     break;
    }
   case WM_MOUSEMOVE:
    if (dragpage)
     {
      TVHITTESTINFO tvhti;
      tvhti.pt.x=LOWORD(lParam)-tvx;
      tvhti.pt.y=HIWORD(lParam)-tvy;
      if (HTREEITEM htiTarget=TreeView_HitTest(htv,&tvhti))
       {
        //TreeView_SelectDropTarget(htv,htiTarget);
        TconfPageBase *targetpage=hti2page(htiTarget);
        if (isIn(targetpage->getOrder(),deciD->getMinOrder2(),deciD->getMaxOrder2()))
         swap(dragpage,targetpage);
       }
      return TRUE;
     }
    break;
   case WM_LBUTTONUP:
    if (dragpage)
     {
      dragpage=NULL;
      ReleaseCapture();
      return TRUE;
     }
    break;
  }
 return TffdshowPageBase::msgProc(uMsg,wParam,lParam);
}

Twidget* TffdshowPageDec::createDlgItem(int id,HWND h)
{
 if (id==IDC_TV_TREE)
  return new TwidgetTv(h,this);
 else
  return TffdshowPageBase::createDlgItem(id,h);
}

void TffdshowPageDec::onReset(void)
{
 bool wasreset=false;
 if (page->filterID)
  if (page->filterPageID)
   wasreset|=deciD->resetFilterEx(page->filterID,page->filterPageID)==S_OK;
  else
   wasreset|=deciD->resetFilter(page->filterID)==S_OK;
 wasreset|=page->reset();
 page->cfg2dlg();
 setChange();
}
void TffdshowPageDec::onResetOrder(void)
{
 if (SUCCEEDED(deciD->resetOrder()))
  sortOrder();
}

LRESULT TffdshowPageDec::TwidgetTv::onKeyDown(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 switch (wParam)
  {
   case VK_SHIFT:
    self->isShift=true;
    break;
   case VK_UP:
   case VK_DOWN:
    if (self->isShift)
     {
      self->swap(wParam==VK_UP?-1:1);
      return 0;
     }
    else break;
   case VK_SPACE:
    self->invInter();
    return 0;
  }
 return Twidget::onKeyDown(hwnd,uMsg,wParam,lParam);
}
LRESULT TffdshowPageDec::TwidgetTv::onKeyUp(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 switch (wParam)
  {
   case VK_SHIFT:
    self->isShift=false;
    break;
   case VK_SPACE:
    return 0;
   case VK_UP:
   case VK_DOWN:
    if (self->isShift) return 0;
    else break;
  }
 return Twidget::onKeyUp(hwnd,uMsg,wParam,lParam);
}

// -------------------- configure ----------------------
extern "C" void CALLBACK configureDec(HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,int nCmdShow);
void CALLBACK configureDec(HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,int nCmdShow)
{
 if (CoInitialize(NULL)!=S_OK) return;
 comptr<IffdshowDecVideo> deciV;comptr<IffdshowDecAudio> deciA;
 const GUID &IID_IffdshowDecVideo=getGUID<IffdshowDecVideo>(),&IID_IffdshowDecAudio=getGUID<IffdshowDecAudio>();
 if (CoCreateInstance(CLSID_FFDSHOW,NULL,CLSCTX_INPROC_SERVER,IID_IffdshowDecVideo,(void**)&deciV)==S_OK &&
     CoCreateInstance(CLSID_FFDSHOWAUDIO,NULL,CLSCTX_INPROC_SERVER,IID_IffdshowDecAudio,(void**)&deciA)==S_OK)
  {
   comptrQ<IffdshowBase>(deciV)->putParam(IDFF_filterMode,IDFF_FILTERMODE_VIDEO|IDFF_FILTERMODE_CONFIG);
   comptrQ<IffdshowBase>(deciA)->putParam(IDFF_filterMode,IDFF_FILTERMODE_AUDIO|IDFF_FILTERMODE_CONFIG);
   if (strstr(lpCmdLine,_l("top")))
    {
     comptrQ<IffdshowBase>(deciV)->putParam(IDFF_alwaysOnTop,1);
     comptrQ<IffdshowBase>(deciA)->putParam(IDFF_alwaysOnTop,1);
    }
   TSpecifyPropertyPagesVE::show2configPages(IID_IffdshowDecVideo,deciV,IID_IffdshowDecAudio,deciA,IDS_FFDSHOWDEC,IDI_FFDSHOW,IDFF_dlgDecCurrentPage);
  }
 CoUninitialize();
}

⌨️ 快捷键说明

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