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