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 + -
显示快捷键?