/* *************************************************************** * sndsel.c * * This file contains the dialogproc and the dialog initialization code * * Copyright 1993, Microsoft Corporation * * History: * * 07/94 - VijR (Created) * *************************************************************** */ #include #include #include #include #include #include #include #define NOSTATUSBAR #include #include #include #include #include #include #include #include "mmcpl.h" #include "medhelp.h" #include "sound.h" #include "utils.h" #include "rcids.h" /* *************************************************************** * Defines *************************************************************** */ #define DF_PM_SETBITMAP (WM_USER+1) /* *************************************************************** * Globals *************************************************************** */ SZCODE gszWindowsHlp[] = TEXT("windows.hlp"); SZCODE gszNull[2] = TEXT("\0"); SZCODE gszNullScheme[] = TEXT(".none"); TCHAR gszCurDir[MAXSTR] = TEXT("\0"); TCHAR gszNone[32]; TCHAR gszRemoveScheme[MAXSTR]; TCHAR gszChangeScheme[MAXSTR]; TCHAR gszMediaDir[MAXSTR]; TCHAR gszDefaultApp[32]; int giScheme; BOOL gfChanged; //set to TRUE if sound info change BOOL gfNewScheme; BOOL gfDeletingTree; HWND ghWnd; OPENFILENAME ofn; /* *************************************************************** * Globals used in painting disp chunk display. *************************************************************** */ BOOL gfWaveExists = FALSE; // indicates wave device in system. HTREEITEM ghOldItem = NULL; /* *************************************************************** * File Globals *************************************************************** */ static TCHAR aszFileName[MAXSTR] = TEXT("\0"); static TCHAR aszPath[MAXSTR] = TEXT("\0"); static TCHAR aszBrowse[MAXSTR]; static TCHAR aszBrowseStr[64]; static TCHAR aszNullSchemeLabel[MAXSTR]; static TCHAR aszFilter[MAXSTR]; static TCHAR aszNullChar[2]; static SZCODE aszLnk[] = TEXT(".lnk"); static SZCODE aszWavFilter[] = TEXT("*.wav"); static SZCODE aszDefaultScheme[] = TEXT("Appevents\\schemes"); static SZCODE aszNames[] = TEXT("Appevents\\schemes\\Names"); static SZCODE aszDefault[] = TEXT(".default"); static SZCODE aszCurrent[] = TEXT(".current"); static INTCODE aKeyWordIds[] = { CB_SCHEMES, IDH_EVENT_SCHEME, IDC_TEXT_14, IDH_EVENT_SCHEME, ID_SAVE_SCHEME, IDH_EVENT_SAVEAS_BUTTON, ID_REMOVE_SCHEME, IDH_EVENT_DELETE_BUTTON, IDC_EVENT_TREE, IDH_EVENT_EVENT, IDC_SOUNDGRP, IDH_COMM_GROUPBOX, ID_PLAY, IDH_EVENT_PLAY, IDC_STATIC_EVENT, IDH_COMM_GROUPBOX, IDC_STATIC_NAME, IDH_EVENT_FILE, IDC_SOUND_FILES, IDH_EVENT_FILE, ID_BROWSE, IDH_EVENT_BROWSE, 0,0 }; BOOL gfEditBoxChanged; BOOL gfSubClassedEditWindow; BOOL gfSoundPlaying; HBITMAP hBitmapPlay; HBITMAP hBitmapStop; HIMAGELIST hSndImagelist; /* *************************************************************** * extern *************************************************************** */ extern HSOUND ghse; extern BOOL gfNukeExt; /* *************************************************************** * Prototypes *************************************************************** */ BOOL PASCAL DoCommand (HWND, int, HWND, UINT); BOOL PASCAL InitDialog (HWND); BOOL PASCAL InitStringTable (void); BOOL PASCAL InitFileOpen (HWND, LPOPENFILENAME); BOOL PASCAL SoundCleanup (HWND); LPTSTR PASCAL NiceName (LPTSTR, BOOL); BOOL ResolveLink (LPTSTR, LPTSTR, LONG); void CreateTooltip (HWND hwnd, LPTSTR lpszTip); // stuff in sndfile.c // BOOL PASCAL ShowSoundMapping (HWND, PEVENT); BOOL PASCAL ChangeSoundMapping (HWND, LPTSTR, PEVENT); BOOL PASCAL PlaySoundFile (HWND, LPTSTR); BOOL PASCAL QualifyFileName (LPTSTR, LPTSTR, int, BOOL); // Stuff in scheme.c // INT_PTR CALLBACK SaveSchemeDlg(HWND, UINT, WPARAM, LPARAM); BOOL PASCAL RegNewScheme (HWND, LPTSTR, LPTSTR, BOOL); BOOL PASCAL RegSetDefault (LPTSTR); BOOL PASCAL ClearModules (HWND, HWND, BOOL); BOOL PASCAL LoadModules (HWND, LPTSTR); BOOL PASCAL RemoveScheme (HWND); BOOL PASCAL AddScheme (HWND, LPTSTR, LPTSTR, BOOL, int); BOOL PASCAL RegDeleteScheme(HWND hWndC, int iIndex); /* *************************************************************** *************************************************************** */ void AddExt(LPTSTR sz, LPCTSTR x) { UINT cb; for (cb = lstrlen(sz); cb; --cb) { if (TEXT('.') == sz[cb]) return; if (TEXT('\\') == sz[cb]) break; } lstrcat (sz, x); } static void AddFilesToLB(HWND hwndList, LPTSTR pszDir, LPCTSTR szSpec) { WIN32_FIND_DATA fd; HANDLE h; TCHAR szBuf[MAXSTR]; ComboBox_ResetContent(hwndList); if ((lstrlen(pszDir)+ lstrlen(cszSlash)+ lstrlen(szSpec)) < ARRAYSIZE(szBuf)) { lstrcpyn(szBuf, pszDir, ARRAYSIZE(szBuf)); lstrcat(szBuf, cszSlash); lstrcat(szBuf, szSpec); h = FindFirstFile(szBuf, &fd); if (h != INVALID_HANDLE_VALUE) { // If we have only a short name, make it pretty. do { NiceName(fd.cFileName, TRUE); SendMessage(hwndList, CB_ADDSTRING, 0, (LPARAM)(LPTSTR)fd.cFileName); } while (FindNextFile(h, &fd)); FindClose(h); } } ComboBox_InsertString(hwndList, 0, (LPARAM)(LPTSTR)gszNone); } static void SetCurDir(HWND hDlg, LPTSTR lpszPath, BOOL fParse, BOOL fChangeDir) { TCHAR szTmp[MAX_PATH]; TCHAR szOldDir[MAXSTR]; LPTSTR lpszTmp; lstrcpy (szOldDir, gszCurDir); if (!fParse) { lstrcpy(gszCurDir, lpszPath); goto AddFiles; } lstrcpy(szTmp, lpszPath); for (lpszTmp = (LPTSTR)(szTmp + lstrlen(szTmp)); lpszTmp > szTmp; lpszTmp = CharPrev(szTmp, lpszTmp)) { if (*lpszTmp == TEXT('\\')) { *lpszTmp = TEXT('\0'); lstrcpy(gszCurDir, szTmp); break; } } if (lpszTmp <= szTmp) lstrcpy(gszCurDir, gszMediaDir); AddFiles: if (fChangeDir) { if (!SetCurrentDirectory(gszCurDir)) { if (lstrcmp (gszMediaDir, lpszPath)) SetCurrentDirectory (gszMediaDir); else { if (GetWindowsDirectory (gszCurDir, sizeof(gszCurDir)/sizeof(TCHAR))) SetCurrentDirectory (gszCurDir); } } } if (lstrcmpi (szOldDir, gszCurDir)) { AddFilesToLB(GetDlgItem(hDlg, IDC_SOUND_FILES),gszCurDir, aszWavFilter); } } static BOOL TranslateDir(HWND hDlg, LPTSTR pszPath) { TCHAR szCurDir[MAX_PATH]; int nFileOffset = lstrlen(pszPath); lstrcpy(szCurDir, pszPath); if (szCurDir[nFileOffset - 1] == TEXT('\\')) szCurDir[--nFileOffset] = 0; if (SetCurrentDirectory(szCurDir)) { if (GetCurrentDirectory(sizeof(szCurDir)/sizeof(TCHAR), szCurDir)) { SetCurDir(hDlg, szCurDir, FALSE, FALSE); return TRUE; } } return FALSE; } ///HACK ALERT!!!! HACK ALERT !!! HACK ALERT !!!! // BEGIN (HACKING) HHOOK gfnKBHookScheme = NULL; HWND ghwndDlg = NULL; WNDPROC gfnEditWndProc = NULL; #define WM_NEWEVENTFILE (WM_USER + 1000) #define WM_RESTOREEVENTFILE (WM_USER + 1001) LRESULT CALLBACK SchemeKBHookProc(int code, WPARAM wParam, LPARAM lParam) { if (wParam == VK_RETURN || wParam == VK_ESCAPE) { HWND hwndFocus = GetFocus(); if (IsWindow(hwndFocus)) { if (lParam & 0x80000000) //Key Up { DPF("*****WM_KEYUP for VK_RETURN/ESC\r\n"); if (wParam == VK_RETURN) { if (SendMessage(ghwndDlg, WM_NEWEVENTFILE, 0, 0L)) { SetFocus(hwndFocus); gfEditBoxChanged = TRUE; return 1; } } else SendMessage(ghwndDlg, WM_RESTOREEVENTFILE, 0, 0L); } } if (gfnKBHookScheme && (lParam & 0x80000000)) { UnhookWindowsHookEx(gfnKBHookScheme); gfnKBHookScheme = NULL; } return 1; //remove message } return CallNextHookEx(gfnKBHookScheme, code, wParam, lParam); } STATIC void SetSchemesKBHook(HWND hwnd) { if (gfnKBHookScheme) return; gfnKBHookScheme = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)SchemeKBHookProc, ghInstance,0); } LRESULT CALLBACK SubClassedEditWndProc(HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam) { switch(wMsg) { case WM_SETFOCUS: DPF("*****WM_SETFOCUS\r\n"); SetSchemesKBHook(hwnd); gfEditBoxChanged = FALSE; break; case WM_KILLFOCUS: if (gfnKBHookScheme) { DPF("*****WM_KILLFOCUS\r\n"); UnhookWindowsHookEx(gfnKBHookScheme); gfnKBHookScheme = NULL; if (gfEditBoxChanged) SendMessage(ghwndDlg, WM_NEWEVENTFILE, 0, 1L); } break; } return CallWindowProc((WNDPROC)gfnEditWndProc, hwnd, wMsg, wParam, lParam); } STATIC void SubClassEditWindow(HWND hwndEdit) { gfnEditWndProc = (WNDPROC)GetWindowLongPtr(hwndEdit, GWLP_WNDPROC); SetWindowLongPtr(hwndEdit, GWLP_WNDPROC, (LONG_PTR)SubClassedEditWndProc); } // END (HACKING) STATIC void EndSound(HSOUND * phse) { if (*phse) { HSOUND hse = *phse; *phse = NULL; soundStop(hse); soundOnDone(hse); soundClose(hse); } } // Create a tooltip for the passed window void CreateTooltip (HWND hwnd, LPTSTR lpszTip) { HWND hwndTT; TOOLINFO ti; INITCOMMONCONTROLSEX iccex; // Init Common Controls iccex.dwICC = ICC_WIN95_CLASSES; iccex.dwSize = sizeof (INITCOMMONCONTROLSEX); InitCommonControlsEx (&iccex); // Create Window hwndTT = CreateWindowEx (WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, NULL, ghInstance, NULL); SetWindowPos (hwndTT, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); // Get Tip Area (entire window) GetClientRect (hwnd, &(ti.rect)); // Init Tip ti.cbSize = sizeof(TOOLINFO); ti.uFlags = TTF_SUBCLASS; ti.hwnd = hwnd; ti.hinst = ghInstance; ti.uId = 0; ti.lpszText = lpszTip; // Add Tip SendMessage (hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); } /* *************************************************************** * SoundDlg * * Description: * DialogProc for sound control panel applet. * * Parameters: * HWND hDlg window handle of dialog window * UINT uiMessage message number * WPARAM wParam message-dependent * LPARAM lParam message-dependent * * Returns: BOOL * TRUE if message has been processed, else FALSE * *************************************************************** */ BOOL CALLBACK SoundDlg(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) { NMHDR FAR *lpnm; TCHAR szBuf[MAXSTR]; static BOOL fClosingDlg = FALSE; PEVENT pEvent; switch (uMsg) { case WM_NOTIFY: lpnm = (NMHDR FAR *)lParam; switch(lpnm->code) { case PSN_KILLACTIVE: FORWARD_WM_COMMAND(hDlg, IDOK, 0, 0, SendMessage); break; case PSN_APPLY: FORWARD_WM_COMMAND(hDlg, ID_APPLY, 0, 0, SendMessage); break; case PSN_RESET: FORWARD_WM_COMMAND(hDlg, IDCANCEL, 0, 0, SendMessage); break; case TVN_SELCHANGED: { TV_ITEM tvi; LPNM_TREEVIEW lpnmtv = (LPNM_TREEVIEW)lParam; if (fClosingDlg || gfDeletingTree) break; if (gfnKBHookScheme) { UnhookWindowsHookEx(gfnKBHookScheme); gfnKBHookScheme = NULL; if (gfEditBoxChanged) { ghOldItem = lpnmtv->itemOld.hItem; SendMessage(ghwndDlg, WM_NEWEVENTFILE, 0, 1L); ghOldItem = NULL; } } tvi = lpnmtv->itemNew; if (tvi.lParam) { if (*((short NEAR *)tvi.lParam) == 2) { pEvent = (PEVENT)tvi.lParam; ShowSoundMapping(hDlg, pEvent); SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)tvi.lParam); } else { ShowSoundMapping(hDlg, NULL); SetWindowLongPtr(hDlg, DWLP_USER, 0L); } } else { ShowSoundMapping(hDlg, NULL); SetWindowLongPtr(hDlg, DWLP_USER, 0L); } break; } case TVN_ITEMEXPANDING: { LPNM_TREEVIEW lpnmtv = (LPNM_TREEVIEW)lParam; if (lpnmtv->action == TVE_COLLAPSE) { SetWindowLongPtr(hDlg, DWLP_MSGRESULT, (LPARAM)(LRESULT)TRUE); return TRUE; } break; } } break; case WM_INITDIALOG: { InitStringTable(); giScheme = 0; ghWnd = hDlg; gfChanged = FALSE; gfNewScheme = FALSE; hBitmapStop = LoadBitmap(ghInstance, MAKEINTRESOURCE(IDB_STOP)); if (!hBitmapStop) DPF("loadbitmap failed\n"); hBitmapPlay = LoadBitmap(ghInstance, MAKEINTRESOURCE(IDB_PLAY)); if (!hBitmapPlay) DPF("loadbitmap failed\n"); SendMessage(GetDlgItem(hDlg, ID_PLAY), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmapPlay); ShowSoundMapping(hDlg, NULL); gfSoundPlaying = FALSE; // Add tool tip LoadString (ghInstance, IDS_TIP_PLAY, szBuf, sizeof(szBuf)/sizeof(TCHAR)); CreateTooltip (GetDlgItem (hDlg, ID_PLAY), szBuf); /* Determine if there is a wave device */ FORWARD_WM_COMMAND(hDlg, ID_INIT, 0, 0, SendMessage); InitFileOpen(hDlg, &ofn); ghwndDlg = hDlg; DragAcceptFiles(hDlg, TRUE); gfSubClassedEditWindow = FALSE; fClosingDlg = FALSE; gfDeletingTree = FALSE; } break; case WM_DESTROY: { DWORD i = 0; LPTSTR pszKey = NULL; fClosingDlg = TRUE; if (gfnKBHookScheme) { UnhookWindowsHookEx(gfnKBHookScheme); gfnKBHookScheme = NULL; } SoundCleanup(hDlg); //delete item data in tree ClearModules(hDlg,GetDlgItem(hDlg, IDC_EVENT_TREE),TRUE); //delete item data in combobox for (i = 0; i < ComboBox_GetCount(GetDlgItem(hDlg, CB_SCHEMES)); i++) { pszKey = (LPTSTR)ComboBox_GetItemData(GetDlgItem(hDlg, CB_SCHEMES), i); if (pszKey) { //can't free a couple of these, as they point to static mem if ((pszKey != aszDefault) && (pszKey != aszCurrent)) { LocalFree(pszKey); } } } break; } case WM_DROPFILES: { TV_HITTESTINFO ht; HWND hwndTree = GetDlgItem(hDlg, IDC_EVENT_TREE); DragQueryFile((HDROP)wParam, 0, szBuf, MAXSTR - 1); if (IsLink(szBuf, aszLnk)) if (!ResolveLink(szBuf, szBuf, sizeof(szBuf))) goto EndDrag; if (lstrcmpi((LPTSTR)(szBuf+lstrlen(szBuf)-4), cszWavExt)) goto EndDrag; GetCursorPos((LPPOINT)&ht.pt); MapWindowPoints(NULL, hwndTree,(LPPOINT)&ht.pt, 2); TreeView_HitTest( hwndTree, &ht); if (ht.hItem && (ht.flags & TVHT_ONITEM)) { TV_ITEM tvi; tvi.mask = TVIF_PARAM; tvi.hItem = ht.hItem; TreeView_GetItem(hwndTree, &tvi); if (*((short NEAR *)tvi.lParam) == 2) { TreeView_SelectItem(hwndTree, ht.hItem); pEvent = (PEVENT)(tvi.lParam); SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)tvi.lParam); SetFocus(hwndTree); } } pEvent = (PEVENT)(GetWindowLongPtr(hDlg, DWLP_USER)); ChangeSoundMapping(hDlg, szBuf,pEvent); DragFinish((HDROP) wParam); break; EndDrag: ErrorBox(hDlg, IDS_ISNOTSNDFILE, szBuf); DragFinish((HDROP) wParam); break; } case WM_NEWEVENTFILE: { DPF("*****WM_NEWEVENT\r\n"); gfEditBoxChanged = FALSE; ComboBox_GetText(GetDlgItem(hDlg, IDC_SOUND_FILES), szBuf, sizeof(szBuf)/sizeof(TCHAR)); pEvent = (PEVENT)(GetWindowLongPtr(hDlg, DWLP_USER)); if (!lstrcmp (szBuf, gszNone)) // Selected "(None)" with keyboard? { lstrcpy(szBuf, gszNull); ChangeSoundMapping(hDlg, szBuf, pEvent); goto ReturnFocus; } if (TranslateDir(hDlg, szBuf)) { ShowSoundMapping(hDlg, pEvent); goto ReturnFocus; } if (QualifyFileName((LPTSTR)szBuf, (LPTSTR)szBuf, sizeof(szBuf), TRUE)) { SetCurDir(hDlg, szBuf, TRUE, TRUE); ChangeSoundMapping(hDlg, szBuf,pEvent); } else { if (lParam) { ErrorBox(hDlg, IDS_INVALIDFILE, NULL); ShowSoundMapping(hDlg, pEvent); goto ReturnFocus; } if (DisplayMessage(hDlg, IDS_NOSNDFILETITLE, IDS_INVALIDFILEQUERY, MB_YESNO) == IDYES) { ShowSoundMapping(hDlg, pEvent); } else { SetWindowLongPtr(hDlg, DWLP_MSGRESULT, (LPARAM)(LRESULT)TRUE); return TRUE; } } ReturnFocus: SetFocus(GetDlgItem(hDlg,IDC_EVENT_TREE)); SetWindowLongPtr(hDlg, DWLP_MSGRESULT, (LPARAM)(LRESULT)FALSE); return TRUE; } case WM_RESTOREEVENTFILE: { DPF("*****WM_RESTOREEVENT\r\n"); pEvent = (PEVENT)(GetWindowLongPtr(hDlg, DWLP_USER)); ShowSoundMapping(hDlg, pEvent); if (lParam == 0) //Don't keep focus SetFocus(GetDlgItem(hDlg,IDC_EVENT_TREE)); break; } case WM_CONTEXTMENU: WinHelp((HWND)wParam, NULL, HELP_CONTEXTMENU, (UINT_PTR)(LPTSTR)aKeyWordIds); break; case WM_HELP: WinHelp(((LPHELPINFO)lParam)->hItemHandle, NULL, HELP_WM_HELP , (UINT_PTR)(LPTSTR)aKeyWordIds); break; case MM_WOM_DONE: { HWND hwndFocus = GetFocus(); HWND hwndPlay = GetDlgItem(hDlg, ID_PLAY); gfSoundPlaying = FALSE; SendMessage(hwndPlay, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmapPlay); if (ghse) { soundOnDone(ghse); soundClose(ghse); ghse = NULL; } pEvent = (PEVENT)(GetWindowLongPtr(hDlg, DWLP_USER)); ShowSoundMapping(hDlg, pEvent); if (hwndFocus == hwndPlay) if (IsWindowEnabled(hwndPlay)) SetFocus(hwndPlay); else SetFocus(GetDlgItem(hDlg, IDC_EVENT_TREE)); break; } case WM_COMMAND: HANDLE_WM_COMMAND(hDlg, wParam, lParam, DoCommand); break; default: break; } return FALSE; } /* *************************************************************** * doCommand * * Description: * Processes Control commands for main sound * control panel dialog. * * Parameters: * HWND hDlg - window handle of dialog window * int id - Message ID * HWND hwndCtl - Handle of window control * UINT codeNotify - Notification code for window * * Returns: BOOL * TRUE if message has been processed, else FALSE * *************************************************************** */ BOOL PASCAL DoCommand(HWND hDlg, int id, HWND hwndCtl, UINT codeNotify) { WAVEOUTCAPS woCaps; TCHAR szBuf[MAXSTR]; LPTSTR pszKey; int iIndex; HCURSOR hcur; HWND hWndC = GetDlgItem(hDlg, CB_SCHEMES); HWND hWndF = GetDlgItem(hDlg, IDC_SOUND_FILES); HWND hwndTree = GetDlgItem(hDlg, IDC_EVENT_TREE); PEVENT pEvent; static BOOL fSchemeCBDroppedDown = FALSE; static BOOL fFilesCBDroppedDown = FALSE; static BOOL fSavingPrevScheme = FALSE; switch (id) { case ID_APPLY: { EndSound(&ghse); if (!gfChanged) break; hcur = SetCursor(LoadCursor(NULL,IDC_WAIT)); if (gfNewScheme) { pszKey = (LPTSTR)ComboBox_GetItemData(hWndC, NONE_ENTRY); if (lstrcmpi(pszKey, aszCurrent)) { ComboBox_InsertString(hWndC, NONE_ENTRY, gszNull); ComboBox_SetItemData(hWndC, NONE_ENTRY, aszCurrent); ComboBox_SetCurSel(hWndC, NONE_ENTRY); giScheme = NONE_ENTRY; } gfNewScheme = FALSE; } iIndex = ComboBox_GetCurSel(hWndC); if (iIndex != CB_ERR) { pszKey = (LPTSTR)ComboBox_GetItemData(hWndC, iIndex); if (pszKey) { RegNewScheme(hDlg, (LPTSTR)aszCurrent, NULL, FALSE); } RegSetDefault(pszKey); } gfChanged = FALSE; SetCursor(hcur); return TRUE; } break; case IDOK: { EndSound(&ghse); break; } case IDCANCEL: { EndSound(&ghse); WinHelp(hDlg, gszWindowsHlp, HELP_QUIT, 0L); break; } case ID_INIT: hcur = SetCursor(LoadCursor(NULL,IDC_WAIT)); gfWaveExists = waveOutGetNumDevs() > 0 && (waveOutGetDevCaps(WAVE_MAPPER,&woCaps,sizeof(woCaps)) == 0) && woCaps.dwFormats != 0L; ComboBox_ResetContent(hWndC); ComboBox_SetText(hWndF, gszNone); InitDialog(hDlg); giScheme = ComboBox_GetCurSel(hWndC); ghWnd = hDlg; SetCursor(hcur); break; case ID_BROWSE: aszFileName[0] = aszPath[0] = TEXT('\0'); pEvent = (PEVENT)(GetWindowLongPtr(hDlg, DWLP_USER)); wsprintf((LPTSTR)aszBrowse, (LPTSTR)aszBrowseStr, (LPTSTR)pEvent->pszEventLabel); if (GetOpenFileName(&ofn)) { SetCurDir(hDlg, ofn.lpstrFile,TRUE, TRUE); ChangeSoundMapping(hDlg, ofn.lpstrFile, pEvent); } break; case ID_PLAY: { if (!gfSoundPlaying) { pEvent = (PEVENT)(GetWindowLongPtr(hDlg, DWLP_USER)); if (pEvent) { if (PlaySoundFile(hDlg, pEvent->pszPath)) { SendMessage(GetDlgItem(hDlg, ID_PLAY), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmapStop); gfSoundPlaying = TRUE; } } } else { SendMessage(GetDlgItem(hDlg, ID_PLAY), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmapPlay); gfSoundPlaying = FALSE; EndSound(&ghse); SetFocus(GetDlgItem(hDlg, ID_PLAY)); } } break; case CB_SCHEMES: switch (codeNotify) { case CBN_DROPDOWN: fSchemeCBDroppedDown = TRUE; break; case CBN_CLOSEUP: fSchemeCBDroppedDown = FALSE; break; case CBN_SELCHANGE: if (fSchemeCBDroppedDown) break; case CBN_SELENDOK: if (fSavingPrevScheme) break; iIndex = ComboBox_GetCurSel(hWndC); if (iIndex != giScheme) { TCHAR szScheme[MAXSTR]; BOOL fDeletedCurrent = FALSE; ComboBox_GetLBText(hWndC, iIndex, (LPTSTR)szScheme); if (giScheme == NONE_ENTRY) { pszKey = (LPTSTR)ComboBox_GetItemData(hWndC, giScheme); if (!lstrcmpi(pszKey, aszCurrent)) { int i; i = DisplayMessage(hDlg, IDS_SAVESCHEME, IDS_SCHEMENOTSAVED, MB_YESNOCANCEL); if (i == IDCANCEL) { ComboBox_SetCurSel(hWndC, giScheme); break; } if (i == IDYES) { fSavingPrevScheme = TRUE; if (DialogBoxParam(ghInstance, MAKEINTRESOURCE(SAVESCHEMEDLG), GetParent(hDlg), SaveSchemeDlg, (LPARAM)(LPTSTR)gszNull)) { fSavingPrevScheme = FALSE; ComboBox_SetCurSel(hWndC, iIndex); } else { fSavingPrevScheme = FALSE; ComboBox_SetCurSel(hWndC, NONE_ENTRY); break; } } } } pszKey = (LPTSTR)ComboBox_GetItemData(hWndC, NONE_ENTRY); if (!lstrcmpi(pszKey, aszCurrent)) { ComboBox_DeleteString(hWndC, NONE_ENTRY); fDeletedCurrent = TRUE; } iIndex = ComboBox_FindStringExact(hWndC, 0, szScheme); pszKey = (LPTSTR)ComboBox_GetItemData(hWndC, iIndex); giScheme = iIndex; EndSound(&ghse); ShowSoundMapping(hDlg, NULL); hcur = SetCursor(LoadCursor(NULL,IDC_WAIT)); if (LoadModules(hDlg, pszKey)) { EnableWindow(GetDlgItem(hDlg, ID_SAVE_SCHEME), TRUE); } SetCursor(hcur); if (!lstrcmpi((LPTSTR)pszKey, aszDefault) || !lstrcmpi((LPTSTR)pszKey, gszNullScheme)) EnableWindow(GetDlgItem(hDlg, ID_REMOVE_SCHEME), FALSE); else EnableWindow(GetDlgItem(hDlg, ID_REMOVE_SCHEME),TRUE); gfChanged = TRUE; gfNewScheme = FALSE; if (fDeletedCurrent) ComboBox_SetCurSel(hWndC, giScheme); PropSheet_Changed(GetParent(hDlg),hDlg); } break; } break; case IDC_SOUND_FILES: switch (codeNotify) { case CBN_SETFOCUS: { if (!gfSubClassedEditWindow) { HWND hwndEdit = GetFocus(); SubClassEditWindow(hwndEdit); gfSubClassedEditWindow = TRUE; SetFocus(GetDlgItem(hDlg, IDC_EVENT_TREE)); //This setfocus hack is needed SetFocus(hwndEdit); //to activate the hook. } } break; case CBN_EDITCHANGE: DPF("CBN_EDITCHANGE \r\n"); if (!gfEditBoxChanged) gfEditBoxChanged = TRUE; break; case CBN_DROPDOWN: DPF("CBN_DD\r\n"); fFilesCBDroppedDown = TRUE; break; case CBN_CLOSEUP: DPF("CBN_CLOSEUP\r\n"); fFilesCBDroppedDown = FALSE; break; case CBN_SELCHANGE: DPF("CBN_SELCHANGE\r\n"); if (fFilesCBDroppedDown) break; case CBN_SELENDOK: { HWND hwndS = GetDlgItem(hDlg, IDC_SOUND_FILES); DPF("CBN_SELENDOK\r\n"); iIndex = ComboBox_GetCurSel(hwndS); if (iIndex >= 0) { TCHAR szFile[MAX_PATH]; if (gfEditBoxChanged) gfEditBoxChanged = FALSE; lstrcpy(szFile, gszCurDir); lstrcat(szFile, cszSlash); ComboBox_GetLBText(hwndS, iIndex, (LPTSTR)(szFile + lstrlen(szFile))); if (iIndex) { if (gfNukeExt) AddExt(szFile, cszWavExt); } else { TCHAR szTmp[64]; ComboBox_GetText(hwndS, szTmp, sizeof(szTmp)/sizeof(TCHAR)); iIndex = ComboBox_FindStringExact(hwndS, 0, szTmp); if (iIndex == CB_ERR) { if (DisplayMessage(hDlg, IDS_SOUND, IDS_NONECHOSEN, MB_YESNO) == IDNO) { PostMessage(ghwndDlg, WM_RESTOREEVENTFILE, 0, 1L); break; } } lstrcpy(szFile, gszNull); } pEvent = (PEVENT)(GetWindowLongPtr(hDlg, DWLP_USER)); ChangeSoundMapping(hDlg, szFile, pEvent); SetFocus(GetDlgItem(hDlg, ID_PLAY)); } break; } } break; case ID_SAVE_SCHEME: // Retrieve current scheme and pass it to the savescheme dialog. iIndex = ComboBox_GetCurSel(hWndC); if (iIndex != CB_ERR) { ComboBox_GetLBText(hWndC, iIndex, szBuf); if (DialogBoxParam(ghInstance, MAKEINTRESOURCE(SAVESCHEMEDLG), GetParent(hDlg), SaveSchemeDlg, (LPARAM)(LPTSTR)szBuf)) { pszKey = (LPTSTR)ComboBox_GetItemData(hWndC, NONE_ENTRY); if (!lstrcmpi(pszKey, aszCurrent)) { ComboBox_DeleteString(hWndC, NONE_ENTRY); } } } break; case ID_REMOVE_SCHEME: if (RemoveScheme(hDlg)) { iIndex = ComboBox_FindStringExact(hWndC, 0, aszNullSchemeLabel); ComboBox_SetCurSel(hWndC, iIndex); giScheme = -1; FORWARD_WM_COMMAND(hDlg, CB_SCHEMES, hWndC, CBN_SELENDOK,SendMessage); } SetFocus(GetDlgItem(hDlg, CB_SCHEMES)); break; } return FALSE; } void InitImageList(HWND hwndTree) { HICON hIcon = NULL; UINT uFlags; int cxMiniIcon; int cyMiniIcon; DWORD dwLayout; if (hSndImagelist) { TreeView_SetImageList(hwndTree, NULL, TVSIL_NORMAL); ImageList_Destroy(hSndImagelist); hSndImagelist = NULL; } cxMiniIcon = GetSystemMetrics(SM_CXSMICON); cyMiniIcon = GetSystemMetrics(SM_CYSMICON); uFlags = ILC_MASK | ILC_COLOR32; if (GetProcessDefaultLayout(&dwLayout) && (dwLayout & LAYOUT_RTL)) { uFlags |= ILC_MIRROR; } hSndImagelist = ImageList_Create(cxMiniIcon,cyMiniIcon, uFlags, 4, 2); if (!hSndImagelist) return; hIcon = LoadImage(ghInstance, MAKEINTRESOURCE(IDI_PROGRAM),IMAGE_ICON,cxMiniIcon,cyMiniIcon,LR_DEFAULTCOLOR); ImageList_AddIcon(hSndImagelist, hIcon); DestroyIcon(hIcon); hIcon = LoadImage(ghInstance, MAKEINTRESOURCE(IDI_AUDIO),IMAGE_ICON,cxMiniIcon,cyMiniIcon,LR_DEFAULTCOLOR); ImageList_AddIcon(hSndImagelist, hIcon); DestroyIcon(hIcon); hIcon = LoadImage(ghInstance, MAKEINTRESOURCE(IDI_BLANK),IMAGE_ICON,cxMiniIcon,cyMiniIcon,LR_DEFAULTCOLOR); ImageList_AddIcon(hSndImagelist, hIcon); DestroyIcon(hIcon); TreeView_SetImageList(hwndTree, hSndImagelist, TVSIL_NORMAL); } /* *************************************************************** * InitDialog * * Description: * Reads the current event names and mappings from reg.db * * Each entry in the [reg.db] section is in this form: * * AppEvents * | * |___Schemes = * | * |______Names * | | * | |______SchemeKey = * | * |______Apps * | * |______Module * | * |_____Event * | * |_____SchemeKey = * | * |____Active = <1\0 * * The Module, Event and the file label are displayed in the * comboboxes. * * Parameters: * HWND hDlg - parent window. * * Return Value: BOOL * True if entire initialization is ok. * *************************************************************** */ BOOL PASCAL InitDialog(HWND hDlg) { TCHAR szDefKey[MAXSTR]; TCHAR szScheme[MAXSTR]; TCHAR szLabel[MAXSTR]; int iVal; int i; int cAdded; HWND hWndC; LONG cbSize; HKEY hkNames; HWND hwndTree = GetDlgItem(hDlg, IDC_EVENT_TREE); hWndC = GetDlgItem(hDlg, CB_SCHEMES); InitImageList(hwndTree); EnableWindow(GetDlgItem(hDlg, ID_SAVE_SCHEME), FALSE); EnableWindow(GetDlgItem(hDlg, ID_REMOVE_SCHEME), FALSE); EnableWindow(GetDlgItem(hDlg, ID_PLAY), FALSE); EnableWindow(GetDlgItem(hDlg, ID_BROWSE), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_SOUND_FILES), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_STATIC_NAME), FALSE); SetCurDir(hDlg, gszMediaDir, FALSE, TRUE); if (RegOpenKey(HKEY_CURRENT_USER, aszNames, &hkNames) != ERROR_SUCCESS) DPF("Failed to open aszNames\n"); else DPF("Opened HKEY_CURRENT_USERS\n"); cAdded = 0; for (i = 0; !RegEnumKey(hkNames, i, szScheme, sizeof(szScheme)/sizeof(TCHAR)); i++) { // Don't add the windows default key yet if (lstrcmpi(szScheme, aszDefault)) { cbSize = sizeof(szLabel); if ((RegQueryValue(hkNames, szScheme, szLabel, &cbSize) != ERROR_SUCCESS) || (cbSize < 2)) lstrcpy(szLabel, szScheme); if (!lstrcmpi(szScheme, gszNullScheme)) lstrcpy(aszNullSchemeLabel, szLabel); ++cAdded; AddScheme(hWndC, szLabel, szScheme, FALSE, 0); } } // Add the windows default key in the second position in the listbox cbSize = sizeof(szLabel); if ((RegQueryValue(hkNames, aszDefault, szLabel, &cbSize) != ERROR_SUCCESS) || (cbSize < 2)) { LoadString(ghInstance, IDS_WINDOWSDEFAULT, szLabel, MAXSTR); if (RegSetValue(hkNames, aszDefault, REG_SZ, szLabel, 0) != ERROR_SUCCESS) DPF("Failed to add printable name for default\n"); } if (cAdded == 0) AddScheme(hWndC, szLabel, (LPTSTR)aszDefault, TRUE, 0); else AddScheme(hWndC, szLabel, (LPTSTR)aszDefault, TRUE, WINDOWS_DEFAULTENTRY); cbSize = sizeof(szDefKey); if ((RegQueryValue(HKEY_CURRENT_USER, aszDefaultScheme, szDefKey, &cbSize) != ERROR_SUCCESS) || (cbSize < 2)) { ComboBox_SetCurSel(hWndC, 0); DPF("No default scheme found\n"); } else { if (!lstrcmpi(szDefKey, aszCurrent)) { ComboBox_InsertString(hWndC, NONE_ENTRY, gszNull); ComboBox_SetItemData(hWndC, NONE_ENTRY, aszCurrent); iVal = NONE_ENTRY; ComboBox_SetCurSel(hWndC, iVal); } else { cbSize = sizeof(szLabel); if ((RegQueryValue(hkNames, szDefKey, szLabel, &cbSize) != ERROR_SUCCESS) || (cbSize < 2)) { DPF("No Name for default scheme key %s found\n", (LPTSTR)szDefKey); lstrcpy(szLabel, szDefKey); } if ((iVal = ComboBox_FindStringExact(hWndC, 0, szLabel)) != CB_ERR) ComboBox_SetCurSel(hWndC, iVal); else if (lstrcmpi(aszDefault, szDefKey)) ComboBox_SetCurSel(hWndC, iVal); else { iVal = ComboBox_GetCount(hWndC); AddScheme(hWndC, szLabel, szDefKey, TRUE, iVal); ComboBox_SetCurSel(hWndC, iVal); } } giScheme = iVal; //setting the current global scheme; if (LoadModules(hDlg, (LPTSTR)aszCurrent)) { EnableWindow(GetDlgItem(hDlg, ID_SAVE_SCHEME), TRUE); } else { ClearModules(hDlg, hwndTree, TRUE); ComboBox_SetCurSel(hWndC, 0); DPF("LoadModules failed\n"); RegCloseKey(hkNames); return FALSE; } if (!lstrcmpi(szDefKey, aszDefault)) EnableWindow(GetDlgItem(hDlg, ID_REMOVE_SCHEME), FALSE); else EnableWindow(GetDlgItem(hDlg, ID_REMOVE_SCHEME), TRUE); // DPF("Finished doing init\n"); } RegCloseKey(hkNames); return TRUE; } const static DWORD aOpenHelpIDs[] = { // Context Help IDs IDC_STATIC_PREVIEW, IDH_EVENT_BROWSE_PREVIEW, ID_PLAY, IDH_EVENT_PLAY, ID_STOP, IDH_EVENT_STOP, 0, 0 }; INT_PTR CALLBACK OpenDlgHook(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HSOUND hse; switch (uMsg) { case WM_INITDIALOG: { TCHAR szOK[16]; TCHAR szBuf[MAXSTR]; LPTSTR lpszFile; // lParam is lpOFN DPF("****WM_INITDIALOG in HOOK **** \r\n"); LoadString(ghInstance, IDS_OK, szOK, sizeof(szOK)/sizeof(TCHAR)); SetDlgItemText(GetParent(hDlg), IDOK, szOK); hse = NULL; if (gfWaveExists) { HWND hwndPlay = GetDlgItem(hDlg, ID_PLAY); HWND hwndStop = GetDlgItem(hDlg, ID_STOP); SendMessage(hwndStop, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmapStop); SendMessage(hwndPlay, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmapPlay); EnableWindow(hwndStop, FALSE); EnableWindow(hwndPlay, FALSE); lpszFile = (LPTSTR)LocalAlloc(LPTR, MAX_PATH+sizeof(TCHAR)); SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)lpszFile); LoadString (ghInstance, IDS_TIP_PLAY, szBuf, sizeof(szBuf)/sizeof(TCHAR)); CreateTooltip (GetDlgItem (hDlg, ID_PLAY), szBuf); } break; } case WM_HELP: WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL, HELP_WM_HELP, (UINT_PTR)(LPTSTR) aOpenHelpIDs); break; case WM_CONTEXTMENU: WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU, (UINT_PTR)(LPVOID) aOpenHelpIDs); break; case WM_COMMAND: if (!gfWaveExists) break; switch (GET_WM_COMMAND_ID(wParam, lParam)) { case ID_PLAY: { LPTSTR lpszFile = (LPTSTR)GetWindowLongPtr(hDlg, DWLP_USER); MMRESULT err = MMSYSERR_NOERROR; DPF("*****ID_PLAY in Dlg Hook ***\r\n"); if((soundOpen(lpszFile, hDlg, &hse) != MMSYSERR_NOERROR) || ((err = soundPlay(hse)) != MMSYSERR_NOERROR)) { if (err == (MMRESULT)MMSYSERR_NOERROR || err != (MMRESULT)MMSYSERR_ALLOCATED) ErrorBox(hDlg, IDS_ERRORFILEPLAY, lpszFile); else ErrorBox(hDlg, IDS_ERRORDEVBUSY, lpszFile); hse = NULL; } else { EnableWindow(GetDlgItem(hDlg, ID_PLAY), FALSE); EnableWindow(GetDlgItem(hDlg, ID_STOP), TRUE); } break; } case ID_STOP: { DPF("*****ID_STOP in Dlg Hook ***\r\n"); EndSound(&hse); EnableWindow(GetDlgItem(hDlg, ID_STOP), FALSE); EnableWindow(GetDlgItem(hDlg, ID_PLAY), TRUE); break; } default: return(FALSE); } break; case MM_WOM_DONE: EnableWindow(GetDlgItem(hDlg, ID_STOP), FALSE); if (hse) { soundOnDone(hse); soundClose(hse); hse = NULL; } EnableWindow(GetDlgItem(hDlg, ID_PLAY), TRUE); break; case WM_DESTROY: { LPTSTR lpszFile; if (!gfWaveExists) break; lpszFile = (LPTSTR)GetWindowLongPtr(hDlg, DWLP_USER); DPF("**WM_DESTROY in Hook **\r\n"); if (lpszFile) LocalFree((HLOCAL)lpszFile); EndSound(&hse); break; } case WM_NOTIFY: { LPOFNOTIFY pofn; if (!gfWaveExists) break; pofn = (LPOFNOTIFY)lParam; switch (pofn->hdr.code) { case CDN_SELCHANGE: { TCHAR szCurSel[MAX_PATH]; HWND hwndPlay = GetDlgItem(hDlg, ID_PLAY); LPTSTR lpszFile = (LPTSTR)GetWindowLongPtr(hDlg, DWLP_USER); HFILE hFile; EndSound(&hse); if (CommDlg_OpenSave_GetFilePath(GetParent(hDlg),szCurSel, sizeof(szCurSel)/sizeof(TCHAR)) <= (int)(sizeof(szCurSel)/sizeof(TCHAR))) { OFSTRUCT of; if (!lstrcmpi(szCurSel, lpszFile)) break; DPF("****The current selection is %s ***\r\n", szCurSel); hFile = (HFILE)HandleToUlong(CreateFile(szCurSel,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)); if (lstrcmpi((LPTSTR)(szCurSel+lstrlen(szCurSel)-4), cszWavExt) || (-1 == hFile)) { if (lpszFile[0] == TEXT('\0')) break; lpszFile[0] = TEXT('\0'); EnableWindow(hwndPlay, FALSE); } else { CloseHandle(LongToHandle(hFile)); EnableWindow(hwndPlay, TRUE); lstrcpy(lpszFile, szCurSel); } } break; } case CDN_FOLDERCHANGE: { EnableWindow(GetDlgItem(hDlg, ID_PLAY), FALSE); break; } default: break; } break; } default: return FALSE; } return TRUE; } /* *************************************************************** * InitFileOpen * * Description: * Sets up the openfilestruct to read display .wav and .mid files * and sets up global variables for the filename and path. * * Parameters: * HWND hDlg - Window handle * LPOPENFILENAME lpofn - pointer to openfilename struct * * Returns: BOOL * *************************************************************** */ STATIC BOOL PASCAL InitFileOpen(HWND hDlg, LPOPENFILENAME lpofn) { lpofn->lStructSize = sizeof(OPENFILENAME); lpofn->hwndOwner = hDlg; lpofn->hInstance = ghInstance; lpofn->lpstrFilter = aszFilter; lpofn->lpstrCustomFilter = NULL; lpofn->nMaxCustFilter = 0; lpofn->nFilterIndex = 0; lpofn->lpstrFile = aszPath; lpofn->nMaxFile = sizeof(aszPath)/sizeof(TCHAR); lpofn->lpstrFileTitle = aszFileName; lpofn->nMaxFileTitle = sizeof(aszFileName)/sizeof(TCHAR); lpofn->lpstrInitialDir = gszCurDir; lpofn->lpstrTitle = aszBrowse; lpofn->Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST |OFN_HIDEREADONLY |OFN_EXPLORER |OFN_ENABLEHOOK; if (gfWaveExists) lpofn->Flags |= OFN_ENABLETEMPLATE; lpofn->nFileOffset = 0; lpofn->nFileExtension = 0; lpofn->lpstrDefExt = NULL; lpofn->lCustData = 0; lpofn->lpfnHook = OpenDlgHook; if (gfWaveExists) lpofn->lpTemplateName = MAKEINTRESOURCE(BROWSEDLGTEMPLATE); else lpofn->lpTemplateName = NULL; return TRUE; } /* FixupNulls(chNull, p) * * To facilitate localization, we take a localized string with non-NULL * NULL substitutes and replacement with a real NULL. */ STATIC void NEAR PASCAL FixupNulls( TCHAR chNull, LPTSTR p) { while (*p) { if (*p == chNull) *p++ = 0; else p = CharNext(p); } } /* FixupNulls */ /* GetDefaultMediaDirectory * * Returns C:\WINNT\Media, or whatever it's called. * */ BOOL GetDefaultMediaDirectory(LPTSTR pDirectory, DWORD cbDirectory) { static SZCODE szSetup[] = REGSTR_PATH_SETUP; static SZCODE szMedia[] = REGSTR_VAL_MEDIA; HKEY hkeySetup; LONG Result; Result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSetup, REG_OPTION_RESERVED, KEY_QUERY_VALUE, &hkeySetup); if (Result == ERROR_SUCCESS) { Result = RegQueryValueEx(hkeySetup, szMedia, NULL, REG_NONE, (LPBYTE)pDirectory, &cbDirectory); RegCloseKey(hkeySetup); } return (Result == ERROR_SUCCESS); } /* *************************************************************** * InitStringTable * * Description: * Load the RC strings into the storage for them * * Parameters: * void * * Returns: BOOL *************************************************************** */ STATIC BOOL PASCAL InitStringTable(void) { static SZCODE cszSetup[] = REGSTR_PATH_SETUP; static SZCODE cszMedia[] = REGSTR_VAL_MEDIA; LoadString(ghInstance, IDS_NONE, gszNone, sizeof(gszNone)/sizeof(TCHAR)); LoadString(ghInstance, IDS_BROWSEFORSOUND, aszBrowseStr, sizeof(aszBrowseStr)/sizeof(TCHAR)); LoadString(ghInstance, IDS_REMOVESCHEME, gszRemoveScheme,sizeof(gszRemoveScheme)/sizeof(TCHAR)); LoadString(ghInstance, IDS_CHANGESCHEME, gszChangeScheme,sizeof(gszChangeScheme)/sizeof(TCHAR)); LoadString(ghInstance, IDS_DEFAULTAPP, gszDefaultApp, sizeof(gszDefaultApp)/sizeof(TCHAR)); LoadString(ghInstance, IDS_WAVFILES, aszFilter, sizeof(aszFilter)/sizeof(TCHAR)); LoadString(ghInstance, IDS_NULLCHAR, aszNullChar, sizeof(aszNullChar)/sizeof(TCHAR)); FixupNulls(*aszNullChar, aszFilter); gszMediaDir[0] = TEXT('\0'); if (!GetDefaultMediaDirectory(gszMediaDir, sizeof(gszMediaDir)/sizeof(TCHAR))) { if (!GetWindowsDirectory (gszMediaDir, sizeof(gszMediaDir)/sizeof(TCHAR))) return FALSE; } return TRUE; } /* *************************************************************** * SoundCleanup * * Description: * Cleanup all the allocs and bitmaps when the sound page exists * * Parameters: * void * * Returns: BOOL *************************************************************** */ STATIC BOOL PASCAL SoundCleanup(HWND hDlg) { DeleteObject(hBitmapStop); DeleteObject(hBitmapPlay); TreeView_SetImageList(GetDlgItem(hDlg, IDC_EVENT_TREE), NULL, TVSIL_NORMAL); ImageList_Destroy(hSndImagelist); hSndImagelist = NULL; DPF("ending sound cleanup\n"); return TRUE; } /****************************************************************************/