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

📄 tffdshowpagebase.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 2 页
字号:
     OffsetRect(&wpl.rcNormalPosition,x-wpl.rcNormalPosition.left,y-wpl.rcNormalPosition.top);
     SetWindowPlacement(dlg,&wpl);
    }
   if (cfgGet(IDFF_alwaysOnTop))
    SetWindowPos(dlg,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  }

 htv=GetDlgItem(m_hwnd,IDC_TV_TREE);
 SetWindowLong(htv,GWL_STYLE,TVS_NOHSCROLL|GetWindowLong(htv,GWL_STYLE));

 hil=ImageList_Create(16,16,ILC_COLOR|ILC_MASK,2,2);
 ilClear  =ImageList_Add(hil,bmp1[0]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_CLEAR  )),bmp2[0]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_CHB_MASK      )));
 ilChecked=ImageList_Add(hil,bmp1[1]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_CHECKED)),bmp2[1]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_CHB_MASK      )));
 ilArrowUD=ImageList_Add(hil,bmp1[2]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_ARROWS )),bmp2[2]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_ARROWS_MASK_UD)));
 ilArrowU =ImageList_Add(hil,bmp1[3]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_ARROWS )),bmp2[3]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_ARROWS_MASK_U )));
 ilArrowD =ImageList_Add(hil,bmp1[4]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_ARROWS )),bmp2[4]=LoadBitmap(hi,MAKEINTRESOURCE(IDB_ARROWS_MASK_D )));

 onActivate();
 static const TanchorInfo ainfo[]=
  {
   IDC_PLACE_PAGE,TanchorInfo::LEFT|TanchorInfo::RIGHT|TanchorInfo::TOP|TanchorInfo::BOTTOM,
   0,0
  };
 anchors.add(ainfo,*this);
 TreeView_SetIndent(htv,24);
 //TreeView_SetItemHeight(htv,26);

 showShowHide();

 int lastPage=cfgGet(IDFF_lastPage);
 treeSelectItem(lastPage);
 enableHints(!!cfgGet(IDFF_showHints));
 deci->setCfgDlgHwnd(dlg);
 deci->setOnChangeMsg(m_hwnd,WM_FFONCHANGE);
 deci->setOnFrameMsg(m_hwnd,WM_FFONFRAME);
 return NOERROR;
}

void TffdshowPageBase::treeSelectItem(int uniqueId,int prevVisId)
{
 for (HTREEITEM hti=TreeView_GetRoot(htv);hti;hti=TreeView_GetNextVisible(htv,hti))
  {
   TconfPageBase *page=hti2page(hti);
   if (page->uniqueID()==uniqueId)
    {
     TreeView_SelectItem(htv,hti);
     if (prevVisId)
      for (HTREEITEM htivis=TreeView_GetRoot(htv);htivis;htivis=TreeView_GetNextVisible(htv,htivis))
       {
        TconfPageBase *pagevis=hti2page(htivis);
        if (pagevis->uniqueID()==prevVisId)
         TreeView_EnsureVisible(htv,htivis);
       }
     return;
    }
  }
}

void TffdshowPageBase::saveDialogSettings(void)
{
 if (IsWindow(dlg))
  {
   WINDOWPLACEMENT wpl;
   wpl.length=sizeof(wpl);
   GetWindowPlacement(dlg,&wpl);
   cfgSet(IDFF_dlgPosX,wpl.rcNormalPosition.left);
   cfgSet(IDFF_dlgPosY,wpl.rcNormalPosition.top);
  }
 deci->saveDialogSettings();
}

STDMETHODIMP TffdshowPageBase::Deactivate(void)
{
 deci->setOnChangeMsg(NULL,0);
 deci->setOnFrameMsg(NULL,0);

 if (m_hwnd==NULL) return E_UNEXPECTED;

 // Remove WS_EX_CONTROLPARENT before DestroyWindow call
 DWORD dwStyle = GetWindowLong(m_hwnd,GWL_EXSTYLE);
 dwStyle=dwStyle&~WS_EX_CONTROLPARENT;
 // Set m_hwnd to be NULL temporarily so the message handler
 // for WM_STYLECHANGING doesn't add the WS_EX_CONTROLPARENT
 // style back in
 HWND hwnd = m_hwnd;
 m_hwnd=NULL;
 SetWindowLong(hwnd,GWL_EXSTYLE,dwStyle);
 m_hwnd=hwnd;
 // Destroy the dialog window
 DestroyWindow(m_hwnd);
 m_hwnd=NULL;

 saveDialogSettings();
 deci->setCfgDlgHwnd(NULL);
 return S_OK;
}

STDMETHODIMP TffdshowPageBase::Apply(void)
{
 if (wasobjectset==FALSE) return E_UNEXPECTED;
 if (pageSite==NULL) return E_UNEXPECTED;
 if (!dirty) return NOERROR;
 HRESULT hr=OnApplyChanges();
 if (SUCCEEDED(hr))
  dirty=false;
 return hr;
}

HRESULT TffdshowPageBase::OnApplyChanges(void)
{
 cfgSet(IDFF_applying,1);
 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)->applySettings();
 deci->saveGlobalSettings();
 onApplyChanges();
 if (page && tr->translateMode && page->dialogId!=IDD_ABOUT)
  {
   HWND hed=GetDlgItem(page->m_hwnd,IDC_ED_HELP);
   if (hed && SendMessage(hed,EM_GETMODIFY,0,0))
    {
     int len=GetWindowTextLength(hed);
     char_t *text=(char_t*)_alloca((len+2)*sizeof(char_t));
     GetWindowText(hed,text,len+1);
     tr->newTranslation(page->dialogId,IDC_ED_HELP,text);
    }
  }
 deci->putParam(IDFF_applying,0);
 return S_OK;
}

void TffdshowPageBase::deletePage(ThtiPage *htiPage)
{
 ThtiPages::iterator p=std::find(htiPages.begin(),htiPages.end(),htiPage);
 if (p!=htiPages.end())
  {
   if ((*p)->hti)
    TreeView_DeleteItem(htv,(*p)->hti);
   delete *p;
   htiPages.erase(p);
  }
}

INT_PTR TffdshowPageBase::msgProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 switch (uMsg)
  {
   case WM_DESTROY:
    {
     for (ThtiPages::const_iterator htiPage=htiPages.begin();htiPage!=htiPages.end();htiPage++)
      delete *htiPage;
     htiPages.clear();
     page=NULL;
     if (arrowsFont) DeleteObject(arrowsFont);arrowsFont=NULL;
     if (hil) ImageList_Destroy(hil);hil=NULL;
     for (int i=0;i<countof(bmp1);i++)
      {
       DeleteObject(bmp1[i]);
       DeleteObject(bmp2[i]);
      }
     break;
    }
   case WM_FFONCHANGE:
    DPRINTF(_l("onChangeParam"));
    if (wParam==IDFF_alwaysOnTop && IsWindow(dlg))
     SetWindowPos(dlg,lParam?HWND_TOPMOST:HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
    if (wParam!=0)
     setChange();
    return TRUE;
   case WM_FFONFRAME:
    {
     MSG msg;
     if (PeekMessage(&msg,m_hwnd,WM_FFONFRAME,WM_FFONFRAME,PM_NOREMOVE))
      return TRUE; // drop msg when next WM_FFONFRAME is already in the message queue.
     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)->onFrame();
     return TRUE;
    }
   case WM_COMMAND:
    switch (LOWORD(wParam))
     {
      case IDC_BT_HELP:
       if (HIWORD(wParam)==BN_CLICKED)
        {
         onHelp();
         return TRUE;
        }
       break;
     }
    break;
   case WM_CONTEXTMENU:
    if (translateTV())
     return TRUE;
    break;
   case WM_NOTIFY:
    {
     NMHDR *nmhdr=LPNMHDR(lParam);
     if (nmhdr->hwndFrom==htv && nmhdr->idFrom==IDC_TV_TREE)
      switch (nmhdr->code)
       {
        case TVN_SELCHANGED:
         {
          NMTREEVIEW *nmtv=LPNMTREEVIEW(lParam);
          if (nmtv->itemNew.hItem)
           {
            selectPage(hti2page(nmtv->itemNew.hItem));
            return TRUE;
           }
          break;
         }
        case TVN_ITEMEXPANDING:
         {
          NMTREEVIEW *nmtv=LPNMTREEVIEW(lParam);
          if (nmtv->action==TVE_COLLAPSE) setDlgResult(TRUE);
          return TRUE;
         }
       }
     break;
    }
  }
 return Twindow::msgProc(uMsg,wParam,lParam);
}
INT_PTR TffdshowPageBase::defMsgProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 // we would like the TAB key to move around the tab stops in our property
 // page, but for some reason OleCreatePropertyFrame clears the CONTROLPARENT
 // style behind our back, so we need to switch it back on now behind its
 // back.  Otherwise the tab key will be useless in every page.

 if (m_hwnd==NULL)
  return 0;
 switch (uMsg)
  {
   case WM_STYLECHANGING:
    if (wParam==GWL_EXSTYLE)
     {
      LPSTYLESTRUCT lpss=(LPSTYLESTRUCT)lParam;
      lpss->styleNew|=WS_EX_CONTROLPARENT;
      return 0;
     }
  }
 return DefWindowProc(m_hwnd,uMsg,wParam,lParam);
}


STDMETHODIMP TffdshowPageBase::NonDelegatingQueryInterface(REFIID riid,void **ppv)
{
 CheckPointer(ppv,E_POINTER);
 if (riid==IID_IPropertyPageFF)
  return GetInterface<IPropertyPageFF>(this,ppv);
 else if (riid==IID_IPropertyPage)
  return GetInterface<IPropertyPage>(this,ppv);
 else
  return CUnknown::NonDelegatingQueryInterface(riid,ppv);
}

STDMETHODIMP_(ULONG) TffdshowPageBase::NonDelegatingAddRef(void)
{
 LONG lRef = InterlockedIncrement((LONG*)&m_cRef);
 ASSERT(lRef > 0);
 return std::max(ULONG(m_cRef),1ul);
}
// Release a reference count and protect against reentrancy
STDMETHODIMP_(ULONG) TffdshowPageBase::NonDelegatingRelease(void)
{
 // If the reference count drops to zero delete ourselves
 if (InterlockedDecrement((LONG*)&m_cRef) == 0)
  {
   m_cRef++;
   SetPageSite(NULL);
   SetObjects(0,NULL);
   delete this;
   return ULONG(0);
  }
 else
  return std::max(ULONG(m_cRef),1ul);
}

STDMETHODIMP TffdshowPageBase::toTop(void)
{
 if (!m_hwnd) return E_UNEXPECTED;
 SetWindowPos(m_hwnd,HWND_TOP,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
 return S_OK;
}
STDMETHODIMP TffdshowPageBase::resize(const CRect &newrect)
{
 setSize(newrect.Width(),newrect.Height());
 anchors.resize(*this,newrect);
 if (page)
  page->resize(getChildRect(IDC_PLACE_PAGE));
 return S_OK;
}

HRESULT STDMETHODCALLTYPE TffdshowPageBase::TranslateAccelerator(MSG *pMsg)
{
 return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TffdshowPageBase::Help(LPCOLESTR pszHelpDir)
{
 return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TffdshowPageBase::IsPageDirty(void)
{
 return dirty?S_OK:S_FALSE;
}
HRESULT STDMETHODCALLTYPE TffdshowPageBase::Move(LPCRECT pRect)
{
 CheckPointer(pRect,E_POINTER);
 if (m_hwnd==NULL) return E_UNEXPECTED;
 MoveWindow(m_hwnd,pRect->left,pRect->top,pRect->right-pRect->left,pRect->bottom-pRect->top,TRUE);
 return S_OK;
}
HRESULT STDMETHODCALLTYPE TffdshowPageBase::Show(UINT nCmdShow)
{
 if (m_hwnd==NULL) return E_UNEXPECTED;
 // Ignore wrong show flags
 if (nCmdShow!=SW_SHOW && nCmdShow!=SW_SHOWNORMAL && nCmdShow!=SW_HIDE)
  return E_INVALIDARG;
 ShowWindow(m_hwnd,nCmdShow);
 repaint(m_hwnd);
 return NOERROR;
}

⌨️ 快捷键说明

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