// OXSoundCustomizeDlg.cpp : implementation file // // Version: 9.3 #include "stdafx.h" #include "OXSoundCustomizeDlg.h" #include "UTBStrOp.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COXSoundCustomizeDlg dialog // array of predefined sound events descriptions // static LPTSTR arrPredefinedEventDescription[][2] = { {_T("Mouse enter"), _T("HWM_MOUSEENTER")}, {_T("Mouse leave"), _T("HWM_MOUSELEAVE")}, {_T("Left button down"), _T("WM_LBUTTONDOWN")}, {_T("Left button up"), _T("WM_LBUTTONUP")}, {_T("Left button double click"), _T("WM_LBUTTONDBLCLK")}, {_T("Right button down"), _T("WM_RBUTTONDOWN")}, {_T("Right button up"), _T("WM_RBUTTONUP")}, {_T("Right button double click"), _T("WM_RBUTTONDBLCLK")}, {_T("Middle button down"), _T("WM_MBUTTONDOWN")}, {_T("Middle button up"), _T("WM_MBUTTONUP")}, {_T("Middle button double click"), _T("WM_MBUTTONDBLCLK")}, }; int arrSoundDescriptionID [11]= { IDS_OX_SOUNDCSTMZDLGMOUSEENTER, IDS_OX_SOUNDCSTMZDLGMOUSELEAVE, IDS_OX_SOUNDCSTMZDLGLBDOWN, IDS_OX_SOUNDCSTMZDLGLBUP, IDS_OX_SOUNDCSTMZDLGLBDBL, IDS_OX_SOUNDCSTMZDLGRBDOWN, IDS_OX_SOUNDCSTMZDLGRBUP, IDS_OX_SOUNDCSTMZDLGRBDBL, IDS_OX_SOUNDCSTMZDLGMBDOWN, IDS_OX_SOUNDCSTMZDLGMBUP, IDS_OX_SOUNDCSTMZDLGMBDBL }; TCHAR arrDescrs [11][_MAX_PATH]; ///////////////////////////////////////////////////////////////////////////// // array of predefined sound events identificators // static UINT arrPredefinedEventID[11] = { HWM_MOUSEENTER, HWM_MOUSELEAVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK, WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK, }; ///////////////////////////////////////////////////////////////////////////// // constructor COXSoundCustomizeDlg::COXSoundCustomizeDlg(CWnd* pParent, COXSoundEffectOrganizer* pSoundEffectOrganizer, enum LEVELTYPE nStartLevel/*=LT_EVENT*/, DWORD dwDlgStyle/*=SCDS_NOTOGGLE*/) : CDialog(COXSoundCustomizeDlg::IDD, pParent), m_cmbFileName(COXHistoryCombo::TBPHorizontalTopRight,TRUE) { //{{AFX_DATA_INIT(COXSoundCustomizeDlg) m_nEvent = -1; m_sFileName = _T(""); m_bForceToStart = FALSE; m_nLoopCount = 0; m_nLoopType = -1; //}}AFX_DATA_INIT // save specified parameters for future use // ASSERT(pSoundEffectOrganizer!=NULL); m_pSoundEffectOrganizer=pSoundEffectOrganizer; m_nStartLevel=nStartLevel; m_dwDlgStyle=dwDlgStyle; ///////////////////////////////////////////////////////////////////////////// // initialize internal variables // m_bEditing=FALSE; m_bAddingNew=FALSE; m_dwControlState=0xffffffff; ///////////////////////////////////////////////////////////////////////////// // fill array of all predefined events // for(int nIndex=0; nIndexGetProfileInt(_T("Sound Customize Dialog"), _T("EventColWidth"),nEventColWidth); nFileNameColWidth=pApp->GetProfileInt(_T("Sound Customize Dialog"), _T("FileNameColWidth"),nFileNameColWidth); nEventInfoColWidth=pApp->GetProfileInt(_T("Sound Customize Dialog"), _T("EventInfoColWidth"),nEventInfoColWidth); nLoopColWidth=pApp->GetProfileInt(_T("Sound Customize Dialog"), _T("LoopColWidth"),nLoopColWidth); bSortAscending=pApp->GetProfileInt(_T("Sound Customize Dialog"), _T("SortAscending"),bSortAscending); nSortCol=pApp->GetProfileInt(_T("Sound Customize Dialog"), _T("SortCol"),nSortCol); } } // create the image list that will be associated with the tree control m_ilTree.Create(IDB_OX_TREELIST_OXSOUND,16,1,RGB(255,0,255)); // insert tree columns LV_COLUMN lvc; memset(&lvc,0,sizeof(lvc)); lvc.fmt=LVCFMT_LEFT; lvc.cx=nEventColWidth; CString sItem; VERIFY(sItem.LoadString(IDS_OX_SOUND_EVENT));//"Event" lvc.pszText=sItem.GetBuffer(sItem.GetLength()); lvc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT; m_treeEffect.SetColumn(0,&lvc); sItem.ReleaseBuffer(); VERIFY(sItem.LoadString(IDS_OX_SOUNDFILE));//"Sound File" m_treeEffect.InsertColumn(1,sItem,LVCFMT_LEFT,nFileNameColWidth,1); VERIFY(sItem.LoadString(IDS_OX_SOUNDEVENT));//"Event Info" m_treeEffect.InsertColumn(2,sItem,LVCFMT_LEFT,nEventInfoColWidth,2); VERIFY(sItem.LoadString(IDS_OX_SOUNDLOOP));//"Loop" m_treeEffect.InsertColumn(3,sItem,LVCFMT_CENTER,nLoopColWidth,3); m_treeEffect.SetImageList(&m_ilTree,TVSIL_NORMAL); // create fonts to customize tree items appearance LOGFONT lf; CFont fontRoot, fontSubroot; CFont* pFont=GetFont(); if(pFont->GetLogFont(&lf)) { lf.lfHeight=-14; UTBStr::tcsncpy(lf.lfFaceName, 6, _T("Arial"),LF_FACESIZE); fontRoot.CreateFontIndirect(&lf); UTBStr::tcsncpy(lf.lfFaceName, 16, _T("Times New Roman"),LF_FACESIZE); fontSubroot.CreateFontIndirect(&lf); } // loop through all registered windows POSITION pos=m_pSoundEffectOrganizer->GetFirstRegisteredWindow(); while(pos!=NULL) { CWnd* pWnd=m_pSoundEffectOrganizer->GetNextRegisteredWindow(pos); ASSERT(pWnd); ASSERT(pWnd->GetSafeHwnd()); // get corresponding COXSoundEffectManager object COXSoundEffectManager* pSoundEffectManager= m_pSoundEffectOrganizer->GetManager(pWnd); ASSERT(pSoundEffectManager); // get item text // CString sItemText; // for items that represent registered windows level we use type // of the control and window's text as item text CString sWindowText; pWnd->GetWindowText(sItemText); sWindowText=GetSubString(sItemText,1,_T('\n')); if(sWindowText.IsEmpty()) sWindowText=GetSubString(sItemText,2,_T('\n')); // flag that specifies if we have to add the window's text to the // window's type BOOL bAddWindowText=!sWindowText.IsEmpty(); // get windows type CString sWindowType=_T("Window"); if(pWnd->IsKindOf(RUNTIME_CLASS(CStatic))) sWindowType=_T("Static"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CButton))) sWindowType=_T("Button"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CAnimateCtrl))) sWindowType=_T("Animation"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CTreeCtrl))) sWindowType=_T("Tree Control"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CListCtrl))) sWindowType=_T("List Control"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CComboBox))) sWindowType=_T("ComboBox"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CListBox))) sWindowType=_T("ListBox"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CSliderCtrl))) sWindowType=_T("Slider"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CTabCtrl))) sWindowType=_T("Tab Control"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CEdit))) sWindowType=_T("Edit"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CRichEditCtrl))) sWindowType=_T("RichEdit"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CProgressCtrl))) sWindowType=_T("Progress Bar"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CSpinButtonCtrl))) sWindowType=_T("Spin Button"); else if(pWnd->IsKindOf(RUNTIME_CLASS(CScrollBar))) sWindowType=_T("Scroll Bar"); sItemText=sWindowType; if(bAddWindowText) sItemText.Format(_T("%s: %s"),sItemText,sWindowText); TV_ITEM tvi; HTREEITEM htiSubroot; POSITION posEvent; LPITEMINFO pItemInfo; // registered window HTREEITEM htiRoot=m_treeEffect.InsertItem(sItemText); ASSERT(htiRoot); // associate new font if((HFONT)fontRoot) VERIFY(m_treeEffect.SetItemFont(htiRoot,&fontRoot)); // and new color VERIFY(m_treeEffect.SetItemColor(htiRoot,RGB(0,0,255))); // create description of the new tree item pItemInfo=new ITEMINFO; pItemInfo->type=IT_WINDOW; pItemInfo->pWnd=pWnd; pItemInfo->dwControlState=CTL_OK|CTL_CANCEL|CTL_TREE|CTL_REMOVE; m_allTreeItems.SetAt((HANDLE)htiRoot,pItemInfo); // expand it if otherwise wasn't specified if(m_nStartLevel!=LT_WINDOW) m_treeEffect.Expand(htiRoot,TVE_EXPAND); /////////////////////////// // registered play events // // item for list of all start playing sound events CString sItem; VERIFY(sItem.LoadString(IDS_OX_SOUNDPLAYSOUND));//"Play sound events" htiSubroot=m_treeEffect.InsertItem(sItem,htiRoot); ASSERT(htiSubroot); // expand it if otherwise wasn't specified if(m_nStartLevel==LT_EVENT) m_treeEffect.Expand(htiSubroot,TVE_EXPAND); // associate new font if((HFONT)fontSubroot) VERIFY(m_treeEffect.SetItemFont(htiSubroot,&fontSubroot)); // and new color VERIFY(m_treeEffect.SetItemColor(htiSubroot,RGB(128,0,0))); // insert the item memset(&tvi,0,sizeof(tvi)); tvi.mask=TVIF_IMAGE|TVIF_HANDLE|TVIF_SELECTEDIMAGE; tvi.hItem=htiSubroot; tvi.iImage=1; tvi.iSelectedImage=1; m_treeEffect.SetItem(&tvi); // create description of the new tree item pItemInfo=new ITEMINFO; pItemInfo->type=IT_PLAYEVENTLIST; pItemInfo->pWnd=pWnd; pItemInfo->dwControlState=CTL_OK|CTL_CANCEL|CTL_TREE|CTL_REMOVE|CTL_ADD; m_allTreeItems.SetAt((HANDLE)htiSubroot,pItemInfo); // loop through all play events posEvent=pSoundEffectManager->GetFirstPlayEvent(); while(posEvent!=NULL) { // get the registered event ID UINT nPlayMsgID=pSoundEffectManager->GetNextPlayEvent(posEvent); ASSERT(nPlayMsgID!=SNDEVENT_NONE); // add new play event item to the tree AddEventItem(pWnd,htiSubroot,nPlayMsgID,pSoundEffectManager,TRUE); } /////////////////////////// // registered stop events // // item for list of all stop playing sound events VERIFY(sItem.LoadString(IDS_OX_SOUNDSTOPPLAYING));//"Stop playing events" htiSubroot=m_treeEffect.InsertItem(sItem,htiRoot); ASSERT(htiSubroot); // expand it if otherwise wasn't specified if(m_nStartLevel==LT_EVENT) m_treeEffect.Expand(htiSubroot,TVE_EXPAND); // associate new font if((HFONT)fontSubroot) VERIFY(m_treeEffect.SetItemFont(htiSubroot,&fontSubroot)); // and new color VERIFY(m_treeEffect.SetItemColor(htiSubroot,RGB(128,0,0))); // insert the item memset(&tvi,0,sizeof(tvi)); tvi.mask=TVIF_IMAGE|TVIF_HANDLE|TVIF_SELECTEDIMAGE; tvi.hItem=htiSubroot; tvi.iImage=2; tvi.iSelectedImage=2; m_treeEffect.SetItem(&tvi); // create description of the new tree item pItemInfo=new ITEMINFO; pItemInfo->type=IT_STOPEVENTLIST; pItemInfo->pWnd=pWnd; pItemInfo->dwControlState=CTL_OK|CTL_CANCEL|CTL_TREE|CTL_REMOVE|CTL_ADD; m_allTreeItems.SetAt((HANDLE)htiSubroot,pItemInfo); // loop through all stop events posEvent=pSoundEffectManager->GetFirstStopEvent(); while(posEvent!=NULL) { // get the registered event ID UINT nStopMsgID=pSoundEffectManager->GetNextStopEvent(posEvent); ASSERT(nStopMsgID!=SNDEVENT_NONE); // add new stop event item to the tree AddEventItem(pWnd,htiSubroot,nStopMsgID,pSoundEffectManager,FALSE); } /////////////////////////// } // set COXTreeCtrl styles m_treeEffect.ModifyExStyle(0,TVOXS_PICKANYWHERE|TVOXS_ROWSEL|TVOXS_MULTISEL); m_treeEffect.ModifyStyle(0,TVS_SHOWSELALWAYS); // sort the tree control if needed if(nSortCol!=-1) { ASSERT(nSortCol>=0 && nSortColdwControlState; else dwControlState&=pItemInfo->dwControlState; // populate controls depending on the type of the item switch(pItemInfo->type) { case IT_WINDOW: case IT_PLAYEVENTLIST: case IT_STOPEVENTLIST: { if(!bForFirstTime) { m_nEvent=-1; m_sFileName.Empty(); m_nLoopCount=0; m_nLoopType=-1; } break; } case IT_PLAYEVENT: { ASSERT(pItemInfo->nMsgID!=SNDEVENT_NONE); // sound event info LPCTSTR* ppszText=NULL; if(m_allDefinedEvents.Lookup(pItemInfo->nMsgID,ppszText)) { ASSERT(ppszText!=NULL); CString sEvent=ppszText[0]; if(bForFirstTime) m_nEvent=m_cmbEvent.FindStringExact(-1,sEvent); else if(m_nEvent!=m_cmbEvent.FindStringExact(-1,sEvent)) m_nEvent=-1; } else m_nEvent=-1; ASSERT(pItemInfo->pWnd!=NULL); ASSERT(::IsWindow(pItemInfo->pWnd->GetSafeHwnd())); LPSOUNDEFFECT pSoundEffect=pItemInfo->pSoundEffect; if(pSoundEffect!=NULL) { // sound source info LPSOUNDSOURCEINFO pSoundSourceInfo=pItemInfo->pSoundSourceInfo; ASSERT(pSoundSourceInfo!=NULL); CString sFileName; switch(pSoundSourceInfo->source) { case SNDSRC_FILE: sFileName=pSoundSourceInfo->sFileName; break; case SNDSRC_CFILE: VERIFY(sFileName.LoadString(IDS_OX_SOUNDOPENCFILE));//"Opened CFile object" //sFileName=_T(); break; case SNDSRC_INTRESOURCE: sFileName.Format(IDS_OX_SOUNDRESOURCEID,//"Resource: ID=%d" pSoundSourceInfo->nResourceID); break; default: ASSERT(FALSE); } if(bForFirstTime) m_sFileName=sFileName; else if(m_sFileName!=sFileName) m_sFileName.Empty(); // "Force To Start" flag if(bForFirstTime) m_bForceToStart=pSoundEffect->bForceToStart; else if(m_bForceToStart!=pSoundEffect->bForceToStart) m_bForceToStart=2; // loop type int nLoopCount=pSoundEffect->nLoopCount; int nLoopType=0; if(!pSoundEffect->bLoop || nLoopCount==0 || nLoopCount==1) { nLoopCount=0; nLoopType=0; } else if(nLoopCount==-1) { nLoopCount=0; nLoopType=1; } else if(nLoopCount>1) nLoopType=2; else ASSERT(FALSE); if(bForFirstTime) m_nLoopCount=nLoopCount; else if(m_nLoopCount!=nLoopCount) m_nLoopCount=0; if(bForFirstTime) m_nLoopType=nLoopType; else if(m_nLoopType!=nLoopType) m_nLoopType=-1; } break; } case IT_STOPEVENT: { ASSERT(pItemInfo->nMsgID!=SNDEVENT_NONE); if(!bForFirstTime) { m_sFileName.Empty(); m_nLoopCount=0; m_nLoopType=-1; } // sound event info LPCTSTR* ppszText=NULL; if(m_allDefinedEvents.Lookup(pItemInfo->nMsgID,ppszText)) { ASSERT(ppszText!=NULL); CString sEvent=ppszText[0]; if(bForFirstTime) m_nEvent=m_cmbEvent.FindStringExact(-1,sEvent); else if(m_nEvent!=m_cmbEvent.FindStringExact(-1,sEvent)) m_nEvent=-1; } else m_nEvent=-1; break; } default: ASSERT(FALSE); } bForFirstTime=FALSE; htiSelected=m_treeEffect.GetNextItem(htiSelected,TVGN_NEXTSELECTED); } // setupo availability of "Add" and "Remove" buttons if(m_treeEffect.GetSelectedCount()>1) dwControlState&=~(CTL_ADD|CTL_REMOVE); if(m_nEvent==-1) dwControlState&=~(CTL_EVENT); // enable/disable controls ShowControls(dwControlState); // show it UpdateData(FALSE); } LRESULT COXSoundCustomizeDlg::OnKickIdle(WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); UNUSED(wParam); //use this function to let History Combo's toolbars to get messages ASSERT_VALID(this); ASSERT(wParam == MSGF_DIALOGBOX); BOOL bContinueIdle = TRUE; // Pass on to the history combo m_cmbFileName.OnIdle(); return bContinueIdle; } LRESULT COXSoundCustomizeDlg::OnUpdateVars(WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam); // update only once !!! // MSG msg; while(::PeekMessage(&msg,GetSafeHwnd(),SMDM_UPDATEVARS, SMDM_UPDATEVARS,PM_REMOVE)); GetVars(); ////////////////////////// return (LRESULT)0; } void COXSoundCustomizeDlg::SetupBitmapButton(COXBitmapButton* m_pctl) { // new font CFont* pFont=m_pctl->GetTextFont(); if(pFont) { LOGFONT lf; if(pFont->GetLogFont(&lf)) { lf.lfWeight=FW_BOLD; lf.lfHeight=-14; UTBStr::tcsncpy(lf.lfFaceName, 16, _T("Times New Roman"),LF_FACESIZE); pFont->DeleteObject(); if(pFont->CreateFontIndirect(&lf)) m_pctl->SetTextFont(pFont); } } // new color m_pctl->SetTextColor(RGB(128,0,0)); // tooltip is enabled m_pctl->SetToolTip(TRUE); // track look is set m_pctl->SetTrackLook(TRUE); // alignment m_pctl->SetVerticalAlignment(BS_VCENTER); m_pctl->SetHorizontalAlignment(BS_LEFT); } CString COXSoundCustomizeDlg::GetSubString(LPCTSTR pszFullString, int nSubIndex, TCHAR cDelimiter) // --- In : pszFullString : The full string // nSubIndex : The ONE-based index of the substring requested // cDelimiter : Delimiter character used between all substrings // --- Out : // --- Returns : The requested substring or an empty string otherwise // --- Effect : { ASSERT(0 < nSubIndex); CString sSubString; if (pszFullString == NULL) { // Nothing to search : nothing to find ASSERT(sSubString.IsEmpty()); return sSubString; } // Set pszStart to first charecter and pszEnd after last charecter LPCTSTR pszBegin = pszFullString; LPCTSTR pszEnd = pszFullString + _tcslen(pszFullString); LPCTSTR pszDelimiter = _tcschr(pszBegin, cDelimiter); if (pszDelimiter == NULL) pszDelimiter = pszEnd; ASSERT((*pszDelimiter == cDelimiter) || (*pszDelimiter == _T('\0'))); ASSERT(pszBegin <= pszDelimiter); while (--nSubIndex != 0) { if (*pszDelimiter == _T('\0')) { // Search to end of string and not found ASSERT(sSubString.IsEmpty()); return sSubString; } pszBegin = pszDelimiter + 1; pszDelimiter = _tcschr(pszBegin, cDelimiter); if (pszDelimiter == NULL) pszDelimiter = pszEnd; ASSERT((*pszDelimiter == cDelimiter) || (*pszDelimiter == _T('\0'))); ASSERT(pszBegin <= pszDelimiter); } int nLen = PtrToInt(pszDelimiter) - PtrToInt(pszBegin); ASSERT(0 <= nLen); LPTSTR pszSubString = sSubString.GetBufferSetLength(nLen); ::CopyMemory(pszSubString, pszBegin, nLen * sizeof(TCHAR)); return sSubString; } HTREEITEM COXSoundCustomizeDlg::AddEventItem(CWnd* pWnd, HTREEITEM htiParent, UINT nMsgID, COXSoundEffectManager* pSoundEffectManager, BOOL bPlayEvent) { CString sEvent=_T(""); CString sFileName=_T(""); CString sEventID=_T(""); CString sLoop=_T(""); BOOL bIsSoundEditable=FALSE; // search for specified sound event ID LPCTSTR* ppszText=NULL; if(m_allDefinedEvents.Lookup(nMsgID,ppszText)) { ASSERT(ppszText!=NULL); sEvent=ppszText[0]; sEventID=ppszText[1]; } else { VERIFY(sEvent.LoadString(IDS_OX_SOUNDUNDEFINED));//"Undefined" sEventID.Format(_T("ID=%d"),nMsgID); } LPSOUNDEFFECT pSoundEffect=NULL; LPSOUNDSOURCEINFO pSoundSourceInfo=NULL; if(bPlayEvent) { pSoundEffect=pSoundEffectManager->GetSoundEffect(nMsgID); ASSERT(pSoundEffect!=NULL); COXSound* pSound=pSoundEffect->pSound; ASSERT(pSound!=NULL); // setup file name combo box pSoundSourceInfo=pSound->GetSoundSourceInfo(); ASSERT(pSoundSourceInfo!=NULL); switch(pSoundSourceInfo->source) { case SNDSRC_FILE: sFileName=pSoundSourceInfo->sFileName; bIsSoundEditable=TRUE; break; case SNDSRC_INTRESOURCE: sFileName.Format(IDS_OX_SOUNDRESOURCEID,pSoundSourceInfo->nResourceID); break; case SNDSRC_CFILE: VERIFY(sFileName.LoadString(IDS_OX_SOUNDOPENCFILE));//"Opened CFile object" break; default: ASSERT(FALSE); } // loop type if(pSoundEffect->bLoop && pSoundEffect->nLoopCount!=0 && pSoundEffect->nLoopCount!=1) { if(pSoundEffect->nLoopCount==-1) VERIFY(sLoop.LoadString(IDS_OX_SOUNDINFINITELY));//"Infinitely" else { CString sExt; VERIFY(sExt.LoadString(IDS_OX_SOUNDEXT)); sLoop.Format(IDS_OX_SOUNDTIMES/*"%d time%s"*/,pSoundEffect->nLoopCount, (pSoundEffect->nLoopCount>1 ? sExt : _T(""))); } } else VERIFY(sLoop.LoadString(IDS_OX_SOUNDONETIME)); //"One time" } // insert item HTREEITEM hti=m_treeEffect.InsertItem(sEvent,htiParent); if(hti==NULL) return NULL; // customize the inserted tree item // TV_ITEM tvi; memset(&tvi,0,sizeof(tvi)); tvi.mask=TVIF_IMAGE|TVIF_HANDLE|TVIF_SELECTEDIMAGE; tvi.hItem=hti; tvi.iImage=bIsSoundEditable ? 3 : 4; tvi.iSelectedImage=tvi.iImage; VERIFY(m_treeEffect.SetItem(&tvi)); // setup subitems VERIFY(m_treeEffect.SetSubItem(hti,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR, sFileName,0,NULL,RGB(0,128,0))); VERIFY(m_treeEffect.SetItemDrawEllipsis(hti,DT_PATH_ELLIPSIS,1)); VERIFY(m_treeEffect.SetSubItem(hti,2,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR, sEventID,0,NULL,RGB(0,0,128))); VERIFY(m_treeEffect.SetSubItem(hti,3,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR, sLoop,0,NULL,RGB(255,0,0))); // create new item description LPITEMINFO pItemInfo=new ITEMINFO; pItemInfo->type=bPlayEvent ? IT_PLAYEVENT : IT_STOPEVENT; pItemInfo->pWnd=pWnd; pItemInfo->nMsgID=nMsgID; if(pSoundEffect!=NULL) { pItemInfo->pSoundEffect=new SOUNDEFFECT; *pItemInfo->pSoundEffect=*pSoundEffect; } if(pSoundSourceInfo!=NULL) { pItemInfo->pSoundSourceInfo=new SOUNDSOURCEINFO; *pItemInfo->pSoundSourceInfo=*pSoundSourceInfo; } pItemInfo->dwControlState=CTL_OK|CTL_CANCEL|CTL_TREE|CTL_REMOVE|CTL_ADD|CTL_EVENT; if(bPlayEvent) { pItemInfo->dwControlState|=CTL_LOOPTYPE|CTL_FORCETOSTART; if(bIsSoundEditable) pItemInfo->dwControlState|=CTL_FILENAME|CTL_PLAY; } m_allTreeItems.SetAt((HANDLE)hti,pItemInfo); return hti; } void COXSoundCustomizeDlg::OnItemchangedExttreeEffectslist(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here if((pNMListView->uChanged&LVIF_STATE)!=0) { if(((pNMListView->uNewState&LVIS_SELECTED)==0 && (pNMListView->uOldState&LVIS_SELECTED)!=0) || ((pNMListView->uNewState&LVIS_SELECTED)!=0 && (pNMListView->uOldState&LVIS_SELECTED)==0)) PostMessage(SMDM_UPDATEVARS); } *pResult = 0; } void COXSoundCustomizeDlg::OnItemExpandingExttreeEffectslist(NMHDR* pNMHDR, LRESULT* pResult) { LPNMTREEVIEW pnmtv=(LPNMTREEVIEW)pNMHDR; // TODO: Add your control notification handler code here // toggling is on/off depending on the specified at the creation time style if((m_dwDlgStyle&SCDS_NOTOGGLE)!=0) { if(pnmtv->action==TVE_EXPAND) *pResult=0; else *pResult=1; } else *pResult=0; } void COXSoundCustomizeDlg::ShowControls(DWORD dwControlState) { if((m_dwDlgStyle&SCDS_READONLY)!=0) dwControlState&=~(CTL_FILENAME|CTL_EVENT|CTL_SAVE|CTL_RESTORE| CTL_REMOVE|CTL_ADD|CTL_FORCETOSTART|CTL_LOOPTYPE); if((dwControlState&CTL_TREE)!=(m_dwControlState&CTL_TREE)) m_treeEffect.EnableWindow((dwControlState&CTL_TREE)); if((dwControlState&CTL_OK)!=(m_dwControlState&CTL_OK)) m_btnOk.EnableWindow((dwControlState&CTL_OK)); if((dwControlState&CTL_CANCEL)!=(m_dwControlState&CTL_CANCEL)) m_btnCancel.EnableWindow((dwControlState&CTL_CANCEL)); if((dwControlState&CTL_FILENAME)!=(m_dwControlState&CTL_FILENAME)) m_cmbFileName.EnableWindow((dwControlState&CTL_FILENAME)); if((dwControlState&CTL_EVENT)!=(m_dwControlState&CTL_EVENT)) m_cmbEvent.EnableWindow((dwControlState&CTL_EVENT)); if((dwControlState&CTL_STOP)!=(m_dwControlState&CTL_STOP)) m_btnStop.EnableWindow((dwControlState&CTL_STOP)); if((dwControlState&CTL_SAVE)!=(m_dwControlState&CTL_SAVE)) m_btnSave.EnableWindow((dwControlState&CTL_SAVE)); if((dwControlState&CTL_RESTORE)!=(m_dwControlState&CTL_RESTORE)) m_btnRestore.EnableWindow((dwControlState&CTL_RESTORE)); if((dwControlState&CTL_REMOVE)!=(m_dwControlState&CTL_REMOVE)) m_btnRemove.EnableWindow((dwControlState&CTL_REMOVE)); if((dwControlState&CTL_PLAY)!=(m_dwControlState&CTL_PLAY)) m_btnPlay.EnableWindow((dwControlState&CTL_PLAY)); if((dwControlState&CTL_ADD)!=(m_dwControlState&CTL_ADD)) m_btnAdd.EnableWindow((dwControlState&CTL_ADD)); if((dwControlState&CTL_FORCETOSTART)!=(m_dwControlState&CTL_FORCETOSTART)) m_btnForceToStart.EnableWindow((dwControlState&CTL_FORCETOSTART)); if((dwControlState&CTL_LOOPTYPE)!=(m_dwControlState&CTL_LOOPTYPE)) { GetDlgItem(IDC_OX_RADIO_LOOPONCE_OXSOUND)->EnableWindow((dwControlState&CTL_LOOPTYPE)); GetDlgItem(IDC_OX_RADIO_LOOPINFINITELY_OXSOUND)->EnableWindow((dwControlState&CTL_LOOPTYPE)); GetDlgItem(IDC_OX_RADIO_LOOPREPEAT_OXSOUND)->EnableWindow((dwControlState&CTL_LOOPTYPE)); } m_editLoopCount.EnableWindow(((dwControlState&CTL_LOOPTYPE)!=0)&(m_nLoopType==2)); DWORD dwStyle=m_btnForceToStart.GetStyle(); if((dwStyle&0x0f)!=BS_AUTO3STATE && (m_bForceToStart!=FALSE && m_bForceToStart!=TRUE)) VERIFY(::SetWindowLongPtr(m_btnForceToStart.GetSafeHwnd(),GWL_STYLE, dwStyle+(BS_AUTO3STATE-BS_AUTOCHECKBOX))); else if((dwStyle&0x0f)==BS_AUTO3STATE && (m_bForceToStart==FALSE || m_bForceToStart==TRUE)) VERIFY(::SetWindowLongPtr(m_btnForceToStart.GetSafeHwnd(),GWL_STYLE, dwStyle-(BS_AUTO3STATE-BS_AUTOCHECKBOX))); m_dwControlState=dwControlState; } void COXSoundCustomizeDlg::StartEditItem(BOOL bAddingNew/*=FALSE*/) { // make sure we are not editing any item if(!m_bEditing) { m_bEditing=TRUE; m_bAddingNew=bAddingNew; DWORD dwControlState=m_dwControlState; dwControlState&=~(CTL_TREE|CTL_ADD); dwControlState|=(CTL_SAVE|CTL_RESTORE); ShowControls(dwControlState); } } BOOL COXSoundCustomizeDlg::VerifySoundFile(CString sFileName, BOOL bReportError) { // if COXSound::Open fail then there is something wrong with the specified // sound source BOOL bResult=m_TestSound.Open(sFileName); if(!bResult && bReportError) { CString sMessage; sMessage.Format(IDS_OX_SOUNDWRONGFILE,sFileName);//"Specified %s sound file doesn't exist or is not valid WAV object" AfxMessageBox(sMessage,MB_OK|MB_ICONEXCLAMATION); } if(!bResult) TRACE(_T("COXSoundCustomizeDlg::VerifySoundFile: failed to verify sound file")); return bResult; } BOOL COXSoundCustomizeDlg::VerifyEvent(CString sEvent, CWnd* pWnd, BOOL bReportError) { BOOL bResult=FALSE; // sound vent should be defined by default or set using // COXSoundCustomizeDlg::SetEvent function UINT nMsgID=SNDEVENT_NONE; CString sEventCompare; LPCTSTR* ppszText; POSITION pos=m_allDefinedEvents.GetStartPosition(); while(pos!=NULL) { m_allDefinedEvents.GetNextAssoc(pos,nMsgID,ppszText); ASSERT(ppszText!=NULL); ASSERT(nMsgID!=SNDEVENT_NONE); sEventCompare=ppszText[0]; if(sEvent==sEventCompare) { bResult=TRUE; break; } } CString sMessage; if(!bResult) { sMessage.Format(IDS_OX_SOUNDSPECEVENT,sEvent);//"Specified %s event wasn't defined" } else { // check if specified sound event wasn't registered before HTREEITEM hti=m_treeEffect.GetRootItem(); ASSERT(hti!=NULL); COXTreeItem* xti=m_treeEffect.GetXItem(hti); ASSERT(xti); while((xti=xti->GetNextInTree())!=NULL) { hti=(HTREEITEM)xti; LPITEMINFO pItemInfo=NULL; VERIFY(m_allTreeItems.Lookup(hti,pItemInfo)); if(pItemInfo->pWnd==pWnd && pItemInfo->nMsgID==nMsgID && (pItemInfo->type==IT_PLAYEVENT || pItemInfo->type==IT_STOPEVENT)) { bResult=FALSE; if(pItemInfo->type==IT_PLAYEVENT) { ASSERT(pItemInfo->pSoundEffect!=NULL); ASSERT(pItemInfo->pSoundSourceInfo!=NULL); sMessage.Format(IDS_OX_SOUNDEVENTREGRED,sEvent);//"Specified %s event is already registered as start playing event" } else sMessage.Format(IDS_OX_SOUNDEVENTREGSTOP,sEvent);//"Specified %s event is already registered as stop playing event" break; } } } if(!bResult && bReportError) AfxMessageBox(sMessage,MB_OK|MB_ICONEXCLAMATION); if(!bResult) TRACE(_T("COXSoundCustomizeDlg::VerifyEvent: failed to verify event")); return bResult; } BOOL COXSoundCustomizeDlg::VerifyLoopType(int nLoopType, int nLoopCount, BOOL bReportError) { UNREFERENCED_PARAMETER(bReportError); UNUSED(nLoopType); UNUSED(nLoopCount); ASSERT(nLoopType>=0 && nLoopType<=2 && nLoopCount>=0); return TRUE; } BOOL COXSoundCustomizeDlg::VerifyForceToStart(BOOL bForceToStart, BOOL bReportError) { UNREFERENCED_PARAMETER(bReportError); BOOL bResult=((bForceToStart==FALSE) | (bForceToStart==TRUE)); if(!bResult && bReportError) { CString sMessage; VERIFY(sMessage.LoadString(IDS_OX_SOUND_FORCEPLAYASSIGNED));//" has to be assigned TRUE or FALSE value" AfxMessageBox(sMessage,MB_OK|MB_ICONEXCLAMATION); } if(!bResult) TRACE(_T("COXSoundCustomizeDlg::VerifyForceToStart: failed to verify value")); return bResult; } LRESULT COXSoundCustomizeDlg::OnPlaybackComplete(WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam); DWORD dwControlState=m_dwControlState; dwControlState&=~(CTL_STOP); dwControlState|=(CTL_FILENAME|CTL_PLAY); ShowControls(dwControlState); return (LRESULT)0; } void COXSoundCustomizeDlg::OnCheckForce() { // TODO: Add your control notification handler code here StartEditItem(); } void COXSoundCustomizeDlg::OnEditchangeComboEvent() { // TODO: Add your control notification handler code here StartEditItem(); } void COXSoundCustomizeDlg::OnSelchangeComboEvent() { // TODO: Add your control notification handler code here if(m_cmbEvent.GetCurSel()!=m_nEvent) StartEditItem(); } void COXSoundCustomizeDlg::OnEditchangeComboFilename() { // TODO: Add your control notification handler code here StartEditItem(); } void COXSoundCustomizeDlg::OnSelchangeComboFilename() { // TODO: Add your control notification handler code here CString sText=m_sFileName; int nCurSel=m_cmbFileName.GetCurSel(); if(nCurSel!=CB_ERR) m_cmbFileName.GetLBText(nCurSel,sText); if(sText!=m_sFileName) StartEditItem(); } void COXSoundCustomizeDlg::OnChangeEditLoopcount() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function to send the EM_SETEVENTMASK message to the control // with the ENM_CHANGE flag ORed into the lParam mask. // TODO: Add your control notification handler code here StartEditItem(); } void COXSoundCustomizeDlg::OnRadioLoopinfinitely() { // TODO: Add your control notification handler code here if(m_nLoopType!=1) StartEditItem(); m_editLoopCount.EnableWindow(FALSE); } void COXSoundCustomizeDlg::OnRadioLooponce() { // TODO: Add your control notification handler code here if(m_nLoopType!=0) StartEditItem(); m_editLoopCount.EnableWindow(FALSE); } void COXSoundCustomizeDlg::OnRadioLooprepeat() { // TODO: Add your control notification handler code here if(m_nLoopType!=3) StartEditItem(); m_editLoopCount.EnableWindow(TRUE); } void COXSoundCustomizeDlg::OnButtonAdd() { // TODO: Add your control notification handler code here // it can happen only if one item in the tree is selected ASSERT(m_treeEffect.GetSelectedCount()==1); // get selected item in order to define whether start or stop playing event // will be added HTREEITEM htiSelected=m_treeEffect.GetNextItem(m_treeEffect.GetRootItem(), TVGN_FIRSTSELECTED); ASSERT(htiSelected!=NULL); LPITEMINFO pItemInfo; VERIFY(m_allTreeItems.Lookup(htiSelected,pItemInfo)); ASSERT(pItemInfo!=NULL); ASSERT(pItemInfo->type==IT_PLAYEVENT || pItemInfo->type==IT_STOPEVENT || pItemInfo->type==IT_PLAYEVENTLIST || pItemInfo->type==IT_STOPEVENTLIST); if((pItemInfo->type==IT_PLAYEVENTLIST || pItemInfo->type==IT_STOPEVENTLIST)) { m_nEvent=0; m_sFileName=_T(""); m_bForceToStart=TRUE; m_nLoopCount=0; m_nLoopType=0; UpdateData(FALSE); DWORD dwControlState=CTL_OK|CTL_CANCEL; if(pItemInfo->type==IT_PLAYEVENTLIST) dwControlState|=CTL_EVENT|CTL_FILENAME|CTL_PLAY|CTL_LOOPTYPE| CTL_FORCETOSTART|CTL_REMOVE; else dwControlState|=CTL_EVENT|CTL_ADD|CTL_REMOVE; ShowControls(dwControlState); } StartEditItem(TRUE); } void COXSoundCustomizeDlg::OnButtonPlay() { // TODO: Add your control notification handler code here CString sFileName; m_cmbFileName.GetWindowText(sFileName); ASSERT(!m_TestSound.IsPlaying()); if(m_TestSound.Open(sFileName)) { if(m_TestSound.Play()) { DWORD dwControlState=m_dwControlState; dwControlState|=(CTL_STOP); dwControlState&=~(CTL_FILENAME|CTL_PLAY); ShowControls(dwControlState); } } } void COXSoundCustomizeDlg::OnButtonRemove() { // TODO: Add your control notification handler code here HTREEITEM htiSelected=m_treeEffect.GetNextItem(m_treeEffect.GetRootItem(), TVGN_FIRSTSELECTED); ASSERT(htiSelected!=NULL); LPITEMINFO pItemInfo; VERIFY(m_allTreeItems.Lookup(htiSelected,pItemInfo)); ASSERT(pItemInfo!=NULL); switch(pItemInfo->type) { case IT_WINDOW: { // if item is on the window level then we remove all start and stop // playing events registered with the window HTREEITEM htiPlayEventsList= m_treeEffect.GetNextItem(htiSelected,TVGN_CHILD); ASSERT(htiPlayEventsList!=NULL); HTREEITEM hti; while((hti=m_treeEffect.GetNextItem(htiPlayEventsList,TVGN_CHILD))!=NULL) VERIFY(m_treeEffect.DeleteItem(hti)); HTREEITEM htiStopEventsList= m_treeEffect.GetNextSiblingItem(htiPlayEventsList); ASSERT(htiStopEventsList!=NULL); while((hti=m_treeEffect.GetNextItem(htiStopEventsList,TVGN_CHILD))!=NULL) VERIFY(m_treeEffect.DeleteItem(hti)); break; } case IT_PLAYEVENT: case IT_STOPEVENT: { VERIFY(m_treeEffect.DeleteItem(htiSelected)); ShowControls(CTL_TREE|CTL_OK|CTL_CANCEL); break; } case IT_PLAYEVENTLIST: case IT_STOPEVENTLIST: { HTREEITEM hti; while((hti=m_treeEffect.GetNextItem(htiSelected,TVGN_CHILD))!=NULL) VERIFY(m_treeEffect.DeleteItem(hti)); break; } } } void COXSoundCustomizeDlg::OnButtonSave() { // TODO: Add your control notification handler code here if(m_TestSound.IsPlaying()) m_TestSound.Stop(); int nOldEvent=m_nEvent; CString sOldFileName=m_sFileName; BOOL bOldForceToStart=m_bForceToStart; int nOldLoopCount=m_nLoopCount; int nOldLoopType=m_nLoopType; VERIFY(UpdateData()); CString sEvent; m_cmbEvent.GetLBText(m_nEvent,0,sEvent); BOOL bSaveEvent=((m_dwControlState&CTL_EVENT)!=0) & (nOldEvent!=m_nEvent || m_bAddingNew); BOOL bSaveFileName=((m_dwControlState&CTL_FILENAME)!=0) & (sOldFileName!=m_sFileName || m_bAddingNew); BOOL bSaveLoopType=((m_dwControlState&CTL_LOOPTYPE)!=0) & (nOldLoopType!=m_nLoopType || m_bAddingNew || (m_nLoopType==2 && nOldLoopCount!=m_nLoopCount)); BOOL bSaveForceToStart=((m_dwControlState&CTL_FORCETOSTART)!=0) & (bOldForceToStart!=m_bForceToStart || m_bAddingNew); HTREEITEM htiSelected=m_treeEffect.GetNextItem(m_treeEffect.GetRootItem(), TVGN_FIRSTSELECTED); ASSERT(htiSelected!=NULL); LPITEMINFO pItemInfo; VERIFY(m_allTreeItems.Lookup(htiSelected,pItemInfo)); ASSERT(pItemInfo!=NULL); // verified changed info if(bSaveEvent && !VerifyEvent(sEvent,pItemInfo->pWnd,TRUE)) return; if(pItemInfo->type==IT_PLAYEVENT || (m_bAddingNew && pItemInfo->type==IT_PLAYEVENTLIST)) if((bSaveFileName && !VerifySoundFile(m_sFileName,TRUE)) || (bSaveLoopType && !VerifyLoopType(m_nLoopType,m_nLoopCount,TRUE)) || (bSaveForceToStart && !VerifyForceToStart(m_bForceToStart,TRUE))) return; if(m_bAddingNew) { // add new tree item if needed // ASSERT(m_treeEffect.GetSelectedCount()==1); ASSERT(pItemInfo->type==IT_PLAYEVENT || pItemInfo->type==IT_STOPEVENT || pItemInfo->type==IT_PLAYEVENTLIST || pItemInfo->type==IT_STOPEVENTLIST); LPITEMINFO pNewItemInfo=new ITEMINFO; *pNewItemInfo=*pItemInfo; pItemInfo=pNewItemInfo; HTREEITEM htiParent=NULL; if(pItemInfo->type==IT_PLAYEVENTLIST || pItemInfo->type==IT_STOPEVENTLIST) htiParent=htiSelected; else htiParent=m_treeEffect.GetParentItem(htiSelected); ASSERT(htiParent!=NULL); htiSelected=m_treeEffect.InsertItem(_T(""),htiParent); ASSERT(htiSelected!=NULL); if(pItemInfo->type==IT_PLAYEVENTLIST) { pItemInfo->type=IT_PLAYEVENT; pItemInfo->pSoundSourceInfo->source=SNDSRC_FILE; } else if(pItemInfo->type==IT_STOPEVENTLIST) pItemInfo->type=IT_STOPEVENT; TV_ITEM tvi; memset(&tvi,0,sizeof(tvi)); tvi.mask=TVIF_IMAGE|TVIF_HANDLE|TVIF_SELECTEDIMAGE; tvi.hItem=htiSelected; tvi.iImage=pItemInfo->type==IT_PLAYEVENT ? 3 : 4; tvi.iSelectedImage=tvi.iImage; VERIFY(m_treeEffect.SetItem(&tvi)); VERIFY(m_treeEffect.SetSubItem(htiSelected,1,OX_SUBITEM_COLOR, NULL,0,NULL,RGB(0,128,0))); VERIFY(m_treeEffect.SetItemDrawEllipsis(htiSelected,DT_PATH_ELLIPSIS,1)); VERIFY(m_treeEffect.SetSubItem(htiSelected,2,OX_SUBITEM_COLOR, NULL,0,NULL,RGB(0,0,128))); VERIFY(m_treeEffect.SetSubItem(htiSelected,3,OX_SUBITEM_COLOR, NULL,0,NULL,RGB(255,0,0))); pItemInfo->dwControlState= CTL_TREE|CTL_OK|CTL_CANCEL|CTL_REMOVE|CTL_ADD|CTL_EVENT; if(pItemInfo->type==IT_PLAYEVENT) { pItemInfo->dwControlState|=CTL_LOOPTYPE|CTL_FORCETOSTART| CTL_FILENAME|CTL_PLAY; } m_allTreeItems.SetAt((HANDLE)htiSelected,pItemInfo); } else { ASSERT(pItemInfo->type==IT_PLAYEVENT || pItemInfo->type==IT_STOPEVENT); } while(htiSelected!=NULL) { // update item and subitems text // if(bSaveEvent) { TV_ITEM tvi; memset(&tvi,0,sizeof(tvi)); tvi.mask=TVIF_HANDLE|TVIF_TEXT; tvi.hItem=htiSelected; tvi.pszText=sEvent.GetBuffer(sEvent.GetLength()); VERIFY(m_treeEffect.SetItem(&tvi)); sEvent.ReleaseBuffer(); CString sEventID; m_cmbEvent.GetLBText(m_nEvent,1,sEventID); VERIFY(m_treeEffect.SetSubItem(htiSelected,2,OX_SUBITEM_TEXT,sEventID)); pItemInfo->nMsgID=0; UINT nMsgID; CString sEventIDCompare; LPCTSTR* ppszText; POSITION pos=m_allDefinedEvents.GetStartPosition(); while(pos!=NULL) { m_allDefinedEvents.GetNextAssoc(pos,nMsgID,ppszText); ASSERT(ppszText!=NULL); ASSERT(nMsgID!=SNDEVENT_NONE); sEventIDCompare=ppszText[1]; if(sEventID==sEventIDCompare) { pItemInfo->nMsgID=nMsgID; break; } } } if(pItemInfo->type==IT_PLAYEVENT) { ASSERT(pItemInfo->pSoundEffect!=NULL); ASSERT(pItemInfo->pSoundSourceInfo!=NULL); } if(bSaveFileName) { ASSERT(pItemInfo->type==IT_PLAYEVENT); ASSERT(pItemInfo->pSoundSourceInfo->source==SNDSRC_FILE); pItemInfo->pSoundSourceInfo->sFileName=m_sFileName; VERIFY(m_treeEffect.SetSubItem(htiSelected,1,OX_SUBITEM_TEXT,m_sFileName)); } if(bSaveLoopType) { ASSERT(pItemInfo->type==IT_PLAYEVENT); CString sLoop; pItemInfo->pSoundEffect->bLoop=TRUE; if(m_nLoopType==0 || (m_nLoopType==2 && (m_nLoopCount==0 || m_nLoopCount==1))) { VERIFY(sLoop.LoadString(IDS_OX_SOUNDONETIME));//"One time" pItemInfo->pSoundEffect->bLoop=FALSE; pItemInfo->pSoundEffect->nLoopCount=0; } else if(m_nLoopType==1) { VERIFY(sLoop.LoadString(IDS_OX_SOUNDINFINITELY));//"Infinitely" pItemInfo->pSoundEffect->nLoopCount=-1; } else if(m_nLoopType==2) { CString sExt; VERIFY(sExt.LoadString(IDS_OX_SOUNDEXT)); sLoop.Format(IDS_OX_SOUNDTIMES,m_nLoopCount,//"%d time%s" (m_nLoopCount>1 ? sExt : _T(""))); pItemInfo->pSoundEffect->nLoopCount=m_nLoopCount; } else ASSERT(FALSE); VERIFY(m_treeEffect.SetSubItem(htiSelected,3,OX_SUBITEM_TEXT,sLoop)); } if(bSaveForceToStart) { ASSERT(pItemInfo->type==IT_PLAYEVENT); pItemInfo->pSoundEffect->bForceToStart=m_bForceToStart; } if(!m_bAddingNew) { htiSelected=m_treeEffect.GetNextItem(htiSelected,TVGN_NEXTSELECTED); if(htiSelected!=NULL) { VERIFY(m_allTreeItems.Lookup(htiSelected,pItemInfo)); ASSERT(pItemInfo!=NULL); } } else break; } m_bEditing=FALSE; if(m_bAddingNew) { m_bAddingNew=FALSE; m_treeEffect.EnsureVisible(htiSelected); m_treeEffect.SelectItem(NULL); m_treeEffect.SelectItem(htiSelected); } else GetVars(); } void COXSoundCustomizeDlg::OnButtonStop() { // TODO: Add your control notification handler code here m_TestSound.Stop(); OnPlaybackComplete(0,0); } void COXSoundCustomizeDlg::OnButtonRestore() { // TODO: Add your control notification handler code here if(m_TestSound.IsPlaying()) m_TestSound.Stop(); UpdateData(FALSE); m_bEditing=FALSE; m_bAddingNew=FALSE; GetVars(); } void COXSoundCustomizeDlg::OnOK() { // TODO: Add extra validation here if(m_TestSound.IsPlaying()) m_TestSound.Stop(); if((m_dwDlgStyle&SCDS_SAVESTATE)!=0) SaveState(); if((m_dwDlgStyle&SCDS_READONLY)!=0) CDialog::OnOK(); if(m_bEditing) { CString sMsg; VERIFY(sMsg.LoadString(IDS_OX_SOUNDCURRENTLYEDITING));//"You are currently editing a sound event.\n Would you like to save changes before exit?" if(AfxMessageBox(sMsg,MB_YESNO|MB_ICONQUESTION)==IDYES) OnButtonSave(); } m_pSoundEffectOrganizer->StopPlaying(); // reregister all stop events m_pSoundEffectOrganizer->UnregisterAllStopEvents(); // reregister all start playing events that use a file or resource ID // as sound source POSITION pos=m_pSoundEffectOrganizer->GetFirstRegisteredWindow(); while(pos!=NULL) { CWnd* pWnd=m_pSoundEffectOrganizer->GetNextRegisteredWindow(pos); ASSERT(pWnd); ASSERT(pWnd->GetSafeHwnd()); COXSoundEffectManager* pSoundEffectManager= m_pSoundEffectOrganizer->GetManager(pWnd); ASSERT(pSoundEffectManager); POSITION posEvent=pSoundEffectManager->GetFirstPlayEvent(); while(posEvent!=NULL) { UINT nPlayMsgID=pSoundEffectManager->GetNextPlayEvent(posEvent); ASSERT(nPlayMsgID!=SNDEVENT_NONE); LPSOUNDEFFECT pSoundEffect=pSoundEffectManager-> GetSoundEffect(nPlayMsgID); ASSERT(pSoundEffect!=NULL); ASSERT(pSoundEffect->pSound!=NULL); LPSOUNDSOURCEINFO pSoundSourceInfo=pSoundEffect->pSound-> GetSoundSourceInfo(); ASSERT(pSoundSourceInfo!=NULL); ASSERT(pSoundSourceInfo->source!=SNDSRC_UNKNOWN); if(pSoundSourceInfo->source==SNDSRC_FILE || pSoundSourceInfo->source==SNDSRC_INTRESOURCE) pSoundEffectManager->UnregisterPlayEvent(nPlayMsgID); } } // register all stop playing and sound events all start playing events // that use a file or resource ID as sound source from the tree HTREEITEM hti=m_treeEffect.GetRootItem(); ASSERT(hti!=NULL); COXTreeItem* xti=m_treeEffect.GetXItem(hti); ASSERT(xti); while((xti=xti->GetNextInTree())!=NULL) { hti=(HTREEITEM)xti; LPITEMINFO pItemInfo=NULL; VERIFY(m_allTreeItems.Lookup(hti,pItemInfo)); if(pItemInfo->type==IT_PLAYEVENT || pItemInfo->type==IT_STOPEVENT) { ASSERT(pItemInfo->type!=IT_UNKNOWN); ASSERT(pItemInfo->pWnd!=NULL); ASSERT(pItemInfo->nMsgID!=SNDEVENT_NONE); ASSERT(::IsWindow(pItemInfo->pWnd->GetSafeHwnd())); if(pItemInfo->type==IT_PLAYEVENT) { ASSERT(pItemInfo->pSoundEffect!=NULL); ASSERT(pItemInfo->pSoundSourceInfo!=NULL); switch(pItemInfo->pSoundSourceInfo->source) { case SNDSRC_FILE: VERIFY(m_pSoundEffectOrganizer-> RegisterPlayEvent(pItemInfo->pWnd,pItemInfo->nMsgID, pItemInfo->pSoundSourceInfo->sFileName, pItemInfo->pSoundEffect->bLoop, pItemInfo->pSoundEffect->nLoopCount, pItemInfo->pSoundEffect->bForceToStart)); break; case SNDSRC_INTRESOURCE: VERIFY(m_pSoundEffectOrganizer-> RegisterPlayEvent(pItemInfo->pWnd,pItemInfo->nMsgID, pItemInfo->pSoundSourceInfo->nResourceID, pItemInfo->pSoundSourceInfo->hInstance, pItemInfo->pSoundEffect->bLoop, pItemInfo->pSoundEffect->nLoopCount, pItemInfo->pSoundEffect->bForceToStart)); break; case SNDSRC_CFILE: break; default: ASSERT(FALSE); } } else if(pItemInfo->type==IT_STOPEVENT) { VERIFY(m_pSoundEffectOrganizer-> RegisterStopEvent(pItemInfo->pWnd,pItemInfo->nMsgID)); } } } CDialog::OnOK(); } void COXSoundCustomizeDlg::OnCancel() { // TODO: Add extra validation here if(m_TestSound.IsPlaying()) m_TestSound.Stop(); if(m_bEditing) { CString sMsg; VERIFY(sMsg.LoadString(IDS_OX_SOUNDCURRENTLYEDITING));//"You are currently editing a sound event.\n Would you like to save changes before exit?" if(AfxMessageBox(sMsg,MB_YESNO|MB_ICONQUESTION)==IDYES) return; } if((m_dwDlgStyle&SCDS_SAVESTATE)!=0) SaveState(); CDialog::OnCancel(); } void COXSoundCustomizeDlg::SaveState() { ASSERT(::IsWindow(m_treeEffect.GetSafeHwnd())); CWinApp* pApp=AfxGetApp(); if(pApp!=NULL) { pApp->WriteProfileInt(_T("Sound Customize Dialog"), _T("EventColWidth"),m_treeEffect.GetColumnWidth(0)); pApp->WriteProfileInt(_T("Sound Customize Dialog"), _T("FileNameColWidth"),m_treeEffect.GetColumnWidth(1)); pApp->WriteProfileInt(_T("Sound Customize Dialog"), _T("EventInfoColWidth"),m_treeEffect.GetColumnWidth(2)); pApp->WriteProfileInt(_T("Sound Customize Dialog"), _T("LoopColWidth"),m_treeEffect.GetColumnWidth(3)); pApp->WriteProfileInt(_T("Sound Customize Dialog"), _T("SortAscending"),(m_treeEffect.GetSortOrder()==1 ? TRUE : FALSE)); pApp->WriteProfileInt(_T("Sound Customize Dialog"), _T("SortCol"),m_treeEffect.GetSortCol()); } }