twindow.cpp
来自「从FFMPEG转换而来的H264解码程序,VC下编译..」· C++ 代码 · 共 1,109 行 · 第 1/3 页
CPP
1,109 行
case WM_VSCROLL:
if (onTrack(bindsVtrack,lParam))
return TRUE;
break;
case WM_COMMAND:
{
if (bindsCheckbox)
for (int i=0;bindsCheckbox[i].idc;i++)
if (bindsCheckbox[i].idc==LOWORD(wParam))
{
if (bindsCheckbox[i].idff<0)
cfgSet(-bindsCheckbox[i].idff,!getCheck(LOWORD(wParam)));
else
cfgSet(bindsCheckbox[i].idff,getCheck(LOWORD(wParam)));
if (bindsCheckbox[i].onClick)
(this->*bindsCheckbox[i].onClick)();
return TRUE;
}
if (bindsRadiobutton)
for (int i=0;bindsRadiobutton[i].idc;i++)
if (bindsRadiobutton[i].idc==LOWORD(wParam) && getCheck(LOWORD(bindsRadiobutton[i].idc)))
{
cfgSet(bindsRadiobutton[i].idff,bindsRadiobutton[i].val);
if (bindsRadiobutton[i].onClick)
(this->*bindsRadiobutton[i].onClick)();
return TRUE;
}
if (bindsButton)
if (HIWORD(wParam)==BN_CLICKED) // works also for static
for (int i=0;bindsButton[i].idc;i++)
if (bindsButton[i].idc==LOWORD(wParam) && bindsButton[i].onClick)
{
(this->*bindsButton[i].onClick)();
return TRUE;
}
if (HIWORD(wParam)==EN_CHANGE && !isSetWindowText)
{
if (LOWORD(wParam)==IDC_ED_HELP && tr->translateMode)
onEditChange();
if (bindsEditInt)
for (int i=0;bindsEditInt[i].idc;i++)
if (bindsEditInt[i].idc==LOWORD(wParam))
{
HWND hed=GetDlgItem(m_hwnd,bindsEditInt[i].idc);
if (hed!=GetFocus()) return FALSE;
repaint(hed);
eval(hed,bindsEditInt[i].min,bindsEditInt[i].max,bindsEditInt[i].idff);
if (bindsEditInt[i].onClick)
(this->*bindsEditInt[i].onClick)();
return TRUE;
}
if (bindsEditReal)
for (int i=0;bindsEditReal[i].idc;i++)
if (bindsEditReal[i].idc==LOWORD(wParam))
{
HWND hed=GetDlgItem(m_hwnd,bindsEditReal[i].idc);
if (hed!=GetFocus()) return FALSE;
repaint(hed);
eval(hed,bindsEditReal[i].min,bindsEditReal[i].max,bindsEditReal[i].idff,bindsEditReal[i].mult);
if (bindsEditReal[i].onClick)
(this->*bindsEditReal[i].onClick)();
return TRUE;
}
}
else if (HIWORD(wParam)==CBN_SELCHANGE)
{
if (bindsCombobox)
for (int i=0;bindsCombobox[i].idc;i++)
if (bindsCombobox[i].idc==LOWORD(wParam))
{
switch (bindsCombobox[i].mode)
{
case BINDCBX_DATA:cfgSet(bindsCombobox[i].idff,(int)cbxGetCurItemData(bindsCombobox[i].idc));break;
case BINDCBX_SEL:cfgSet(bindsCombobox[i].idff,cbxGetCurSel(bindsCombobox[i].idc));break;
case BINDCBX_TEXT:cfgSet(bindsCombobox[i].idff,cbxGetCurText(bindsCombobox[i].idc));break;
case BINDCBX_DATATEXT:cfgSet(bindsCombobox[i].idff,(const char_t*)cbxGetCurItemData(bindsCombobox[i].idc));break;
}
if (bindsCombobox[i].onClick)
(this->*bindsCombobox[i].onClick)();
return TRUE;
}
}
break;
}
case WM_CTLCOLOREDIT:
if (bindsEditInt)
if (onCtlColorEdit(bindsEditInt,lParam,wParam))
return INT_PTR(getRed());
if (bindsEditReal)
if (onCtlColorEdit(bindsEditReal,lParam,wParam))
return INT_PTR(getRed());
break;
}
return defMsgProc(uMsg,wParam,lParam);
}
INT_PTR CALLBACK Twindow::msgProc0(HWND m_hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_MEASUREITEM:
if (wParam==IDC_CBX_FONT_CHARSET || wParam==IDC_CBX_ENCODER)
{
MEASUREITEMSTRUCT *mis=(MEASUREITEMSTRUCT*)lParam;
UINT h=(UINT)SendMessage(GetDlgItem(m_hwnd,wParam==IDC_CBX_FONT_CHARSET?IDC_CBX_FONT_NAME:IDC_CBX_FOURCC),CB_GETITEMHEIGHT,WPARAM((int)mis->itemID==-1?-1:0),0);
mis->itemHeight=h;
SetWindowLongPtr(m_hwnd,DWLP_MSGRESULT,TRUE);
return TRUE;
}
break;
case WM_INITDIALOG:
{
TwindowWidget *self=(TwindowWidget*)lParam;
if (self) self->window->setHWND(m_hwnd,0);
break;
}
case WM_NCDESTROY:
return FALSE;
case WM_NOTIFYFORMAT:
{
#ifdef UNICODE
SetWindowLongPtr(m_hwnd,DWLP_MSGRESULT,NFR_UNICODE);
#else
SetWindowLongPtr(m_hwnd,DWLP_MSGRESULT,NFR_ANSI);
#endif
break;
}
}
TwindowWidget *self=(TwindowWidget*)Twidget::getDlgItem(m_hwnd);
return self?self->window->msgProc(uMsg,wParam,lParam):1;
}
LRESULT Twindow::TwidgetSubclassTbr::onContextMenu(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static const char_t *menu[]={_l("Reset"),_l("Edit"),NULL};
switch (self->selectFromMenu(menu,0))
{
case 0:
if (!onReset())
return 0;
else
break;
case 1:
{
if (!onEdit())
return 0;
else
break;
}
default:
return 0;
}
if (bind && bind->onClick)
(self->*bind->onClick)();
else
self->cfg2dlg();
return 0;
}
bool Twindow::TwidgetSubclassTbr::onReset(void)
{
return self->deci->resetParam(self->getTbrIdff(id,bind))==S_OK;
}
void Twindow::TwidgetSubclassTbr::getEditMinMaxVal(const TffdshowParamInfo &info,int *min,int *max,int *val)
{
*min=info.min;
*max=info.max;
*val=self->cfgGet(info.id);
}
void Twindow::TwidgetSubclassTbr::storeEditValue(const TffdshowParamInfo &info,int min,int max,const char_t *valS)
{
self->eval(valS,min,max,info.id,1,true);
}
bool Twindow::TwidgetSubclassTbr::onEdit(void)
{
int idff=self->getTbrIdff(id,bind);
TffdshowParamInfo info;memset(&info,0,sizeof(info));
if (self->deci->getParamInfo(idff,&info)!=S_OK)
return false;
int min,max,val;getEditMinMaxVal(info,&min,&max,&val);
char_t valS[20];_itoa(val,valS,10);
char_t query[100];tsprintf(query,self->_(0,_l("Enter value in range from %i to %i")),min,max);
if (!self->inputString(self->_(0,_l("Edit trackbar value")),query,valS,20))
return false;
storeEditValue(info,min,max,valS);
return true;
}
LRESULT Twindow::TwidgetSubclassChb::onContextMenu(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
if (self->tr->translateMode) return TwidgetSubclass::onContextMenu(hwnd,uMsg,wParam,lParam);
static const char_t *menu[]={_l("Reset"),NULL};
if (self->selectFromMenu(menu,0)==0)
if (self->deci->resetParam(ff_abs(bind->idff))!=S_OK)
return 0;
else
if (bind->onClick)
(self->*bind->onClick)();
else
self->cfg2dlg();
return 0;
}
//================================= TdlgWindow =================================
TdlgWindow::TdlgWindow(int IdialogId,IffdshowBase *Ideci):Twindow(Ideci)
{
dialogId=IdialogId;
}
//=============================== TdlgPropsEdit ================================
TdlgPropsEdit::TdlgPropsEdit(TstringProps &Iprops,IffdshowBase *deci):TdlgWindow(IDD_PROPSEDIT,deci),props(Iprops)
{
italicFont=NULL;
}
TdlgPropsEdit::~TdlgPropsEdit()
{
if (italicFont) DeleteObject(italicFont);
}
bool TdlgPropsEdit::execute(HWND wndParent)
{
return dialogBox(dialogId,wndParent)==IDOK;
}
INT_PTR TdlgPropsEdit::msgProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
hlv=GetDlgItem(m_hwnd,IDC_LV_PROPS);
int ncol=0;
ListView_AddCol(hlv,ncol,300,_l("Original:/Translation"),false);
ListView_SetItemCount(hlv,props.size()*2);
ListView_SetExtendedListViewStyleEx(hlv,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
return TRUE;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
if (HWND(lParam)==GetDlgItem(m_hwnd,IDOK) || HWND(lParam)==GetDlgItem(m_hwnd,IDCANCEL))
{
EndDialog(m_hwnd,LOWORD(wParam));
return TRUE;
}
break;
};
break;
case WM_NOTIFY:
{
NMHDR *nmhdr=LPNMHDR(lParam);
if (nmhdr->idFrom==IDC_LV_PROPS)
switch (nmhdr->code)
{
case LVN_GETDISPINFO:
{
NMLVDISPINFO *nmdi=(NMLVDISPINFO*)lParam;
int i=nmdi->item.iItem;
if (i==-1) break;
if (nmdi->item.mask&LVIF_TEXT)
switch (nmdi->item.iSubItem)
{
case 0:
{
//strcpy(nmdi->item.pszText,((i&1)==0)?props[i/2].first.c_str():props[i/2].second.c_str());
nmdi->item.pszText=(LPTSTR)((i&1)==0?props[i/2].first.c_str():props[i/2].second.c_str());
break;
}
}
return TRUE;
}
case NM_CUSTOMDRAW:
{
NMLVCUSTOMDRAW *lvcd=LPNMLVCUSTOMDRAW(lParam);
if (lvcd->nmcd.dwDrawStage==CDDS_PREPAINT)
{
setDlgResult(CDRF_NOTIFYITEMDRAW);
return TRUE;
}
if (lvcd->nmcd.dwDrawStage==CDDS_ITEMPREPAINT)
{
if (!italicFont)
{
LOGFONT oldFont;
HFONT hf=(HFONT)GetCurrentObject(lvcd->nmcd.hdc,OBJ_FONT);
GetObject(hf,sizeof(LOGFONT),&oldFont);
oldFont.lfItalic=TRUE;
italicFont=CreateFontIndirect(&oldFont);
}
if ((lvcd->nmcd.dwItemSpec&1)==0)
SelectObject(lvcd->nmcd.hdc,italicFont);
setDlgResult(CDRF_NEWFONT);
return TRUE;
}
return TRUE;
}
case LVN_BEGINLABELEDIT:
{
NMLVDISPINFO *nmdi=(NMLVDISPINFO*)lParam;
if ((nmdi->item.iItem&1)==0)
{
setDlgResult(TRUE);
return TRUE;
}
break;
}
case LVN_ENDLABELEDIT:
{
NMLVDISPINFO *nmdi=(NMLVDISPINFO*)lParam;
if (nmdi->item.pszText)
{
props[nmdi->item.iItem/2].second=nmdi->item.pszText;
setDlgResult(TRUE);
return TRUE;
}
break;
}
case LVN_KEYDOWN:
{
NMLVKEYDOWN *nmkd=(NMLVKEYDOWN*)lParam;
if (nmkd->wVKey==VK_F2)
{
ListView_EditLabel(hlv,ListView_GetNextItem(hlv,-1,LVNI_SELECTED));
return TRUE;
}
break;
}
}
break;
}
}
return Twindow::msgProc(uMsg,wParam,lParam);
}
//============================== TdlgInputString ===============================
TdlgInputString::TdlgInputString(const char_t *Icapt,const char_t *Iquery,char_t *Istr,size_t Ilen,IffdshowBase *deci):
TdlgWindow(IDD_INPUTSTRING,deci),
capt(Icapt),
query(Iquery),
str(Istr),
len(Ilen)
{
}
bool TdlgInputString::execute(HWND wndParent)
{
return dialogBox(dialogId,wndParent)==IDOK;
}
INT_PTR TdlgInputString::msgProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
setWindowText(m_hwnd,capt);
setDlgItemText(m_hwnd,IDC_LBL_INPUTSTRING,query);
setDlgItemText(m_hwnd,IDC_ED_INPUTSTRING,str);
edLimitText(IDC_ED_INPUTSTRING,len-1);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
GetDlgItemText(m_hwnd,IDC_ED_INPUTSTRING,str,int(len));
case IDCANCEL:
EndDialog(m_hwnd,LOWORD(wParam));
return TRUE;
}
};
return TdlgWindow::msgProc(uMsg,wParam,lParam);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?