/****************************************************************************** Copyright (C) Microsoft Corporation 1985-1991. All rights reserved. Title: config.c - Multimedia Systems Media Control Interface driver for AVI - configuration dialog. *****************************************************************************/ #include "graphic.h" #include "cnfgdlg.h" #define comptypeNONE mmioFOURCC('n','o','n','e') #ifndef WIN32 #define SZCODE char _based(_segname("_CODE")) #else #define SZCODE TCHAR #endif SZCODE szDEFAULTVIDEO[] = TEXT("DefaultVideo"); SZCODE szVIDEOWINDOW[] = TEXT("Window"); SZCODE szVIDEO240[] = TEXT("240 Line Fullscreen"); SZCODE szSEEKEXACT[] = TEXT("AccurateSeek"); SZCODE szZOOMBY2[] = TEXT("ZoomBy2"); //SZCODE szSTUPIDMODE[] = TEXT("DontBufferOffscreen"); SZCODE szSKIPFRAMES[] = TEXT("SkipFrames"); SZCODE szUSEAVIFILE[] = TEXT("UseAVIFile"); SZCODE szIni[] = TEXT("MCIAVI"); SZCODE sz1[] = TEXT("1"); SZCODE sz0[] = TEXT("0"); SZCODE szIntl[] = TEXT("Intl"); SZCODE szDecimal[] = TEXT("sDecimal"); SZCODE szThousand[] = TEXT("sThousand"); /* Make sure we only have one configure box up at a time.... */ HWND ghwndConfig = NULL; #ifdef DEBUG BOOL FAR PASCAL _LOADDS DebugDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) { static NPMCIGRAPHIC npMCI = NULL; HWND cb; int i; TCHAR ach[40]; extern int giDebugLevel; // current debug level (common.h) switch (wMsg) { case WM_INITDIALOG: npMCI = (NPMCIGRAPHIC)(UINT)lParam; // // set the DEBUG stuff. // CheckDlgButton(hDlg, ID_SCREEN, GetProfileInt(TEXT("DrawDib"), TEXT("DecompressToScreen"), 2)); CheckDlgButton(hDlg, ID_BITMAP, GetProfileInt(TEXT("DrawDib"), TEXT("DecompressToBitmap"), 2)); CheckDlgButton(hDlg, ID_SUCKS, GetProfileInt(TEXT("DrawDib"), TEXT("DrawToBitmap"), 2)); CheckDlgButton(hDlg, ID_USE_AVIFILE, (npMCI->dwOptionFlags & MCIAVIO_USEAVIFILE) != 0); SetScrollRange(GetDlgItem(hDlg, ID_RATE), SB_CTL, 0, 1000, TRUE); SetScrollPos(GetDlgItem(hDlg, ID_RATE), SB_CTL, (int)npMCI->PlaybackRate,TRUE); cb = GetDlgItem(hDlg, ID_LEVEL); SetWindowFont(cb, GetStockObject(ANSI_VAR_FONT), FALSE); ComboBox_AddString(cb, "0 - None"); ComboBox_AddString(cb, "1 - Level 1"); ComboBox_AddString(cb, "2 - Level 2"); ComboBox_AddString(cb, "3 - Level 3"); ComboBox_AddString(cb, "4 - Level 4"); ComboBox_SetCurSel(cb, giDebugLevel); #include "..\verinfo\usa\verinfo.h" wsprintf(ach,TEXT("Build %d.%02d.%02d"), MMVERSION, MMREVISION, MMRELEASE); SetDlgItemText(hDlg, ID_BUILD, ach); return TRUE; case WM_HSCROLL: i = GetScrollPos((HWND)HIWORD(lParam),SB_CTL); switch (LOWORD(wParam)) { case SB_LINEDOWN: i+=10; break; case SB_LINEUP: i-=10; break; case SB_PAGEDOWN: i+=100; break; case SB_PAGEUP: i-=100; break; case SB_THUMBTRACK: case SB_THUMBPOSITION: i = LOWORD(lParam); break; } if (i<0) i=0; if (i>1000) i=1000; SetScrollPos((HWND)HIWORD(lParam),SB_CTL,i,TRUE); break; case WM_COMMAND: switch (wParam) { case IDCANCEL: case IDOK: i = IsDlgButtonChecked(hDlg, ID_SUCKS); if (i == 2) WriteProfileString(TEXT("DrawDib"), TEXT("DrawToBitmap"), NULL); else WriteProfileString(TEXT("DrawDib"), TEXT("DrawToBitmap"), (LPTSTR)(i ? sz1 : sz0)); i = IsDlgButtonChecked(hDlg, ID_SCREEN); if (i == 2) WriteProfileString(TEXT("DrawDib"), TEXT("DecompressToScreen"),NULL); else WriteProfileString(TEXT("DrawDib"), TEXT("DecompressToScreen"),(LPTSTR)(i ? sz1 : sz0)); i = IsDlgButtonChecked(hDlg, ID_BITMAP); if (i == 2) WriteProfileString(TEXT("DrawDib"), TEXT("DecompressToBitmap"),NULL); else WriteProfileString(TEXT("DrawDib"), TEXT("DecompressToBitmap"),(LPTSTR)(i ? sz1 : sz0)); npMCI->PlaybackRate = GetScrollPos(GetDlgItem(hDlg, ID_RATE), SB_CTL); giDebugLevel = ComboBox_GetCurSel(GetDlgItem(hDlg, ID_LEVEL)); wsprintf(ach,TEXT("%d"),giDebugLevel); WriteProfileString(TEXT("Debug"),TEXT("MCIAVI"),ach); if (IsDlgButtonChecked(hDlg, ID_USE_AVIFILE)) npMCI->dwOptionFlags |= MCIAVIO_USEAVIFILE; else npMCI->dwOptionFlags &= ~MCIAVIO_USEAVIFILE; EndDialog(hDlg, TRUE); break; case ID_RATE: break; } break; } return FALSE; } #endif // DEBUG LONG AVIGetFileSize(LPTSTR szFile) { LONG lSize; #ifdef WIN32 DWORD dwHigh; HANDLE fh; fh = CreateFile(szFile, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (fh == (HANDLE)HFILE_ERROR) return 0; lSize = (LONG)GetFileSize(fh, &dwHigh); CloseHandle(fh); #else OFSTRUCT of; HFILE fh; fh = OpenFile(szFile, &of, OF_READ | OF_SHARE_DENY_NONE); if (fh == HFILE_ERROR) fh = OpenFile(szFile, &of, OF_READ); if (fh == HFILE_ERROR) return 0; lSize = _llseek(fh, 0, SEEK_END); _lclose(fh); #endif return lSize; } // //fill in the info box. // BOOL ConfigInfo(NPMCIGRAPHIC npMCI, HWND hwnd) { PTSTR pchInfo; LONG len; DWORD time; PTSTR pch; TCHAR ach[80]; TCHAR achDecimal[4]; TCHAR achThousand[4]; int i; if (npMCI == NULL) return FALSE; achDecimal[0] = '.'; achDecimal[1] = 0; achThousand[0] = ','; achThousand[1] = 0; GetProfileString(szIntl, szDecimal, achDecimal, achDecimal, sizeof(achDecimal)); GetProfileString(szIntl, szThousand, achThousand, achThousand, sizeof(achThousand)); pchInfo = (PTSTR)LocalAlloc(LPTR, 8192*sizeof(TCHAR)); if (pchInfo == NULL) return FALSE; pch = pchInfo; // // display file name // // File: full path. // LoadString(ghModule, INFO_FILE, ach, sizeof(ach)); pch += wsprintf(pch, ach, (LPTSTR)npMCI->szFilename); // // display file type // // Type: type // if (npMCI->pf) { #ifdef USEAVIFILE AVIFILEINFO info; LoadString(ghModule, INFO_FILETYPE, ach, sizeof(ach)); npMCI->pf->lpVtbl->Info(npMCI->pf, &info, sizeof(info)); pch += wsprintf(pch, ach, (LPSTR)info.szFileType); #endif } else if (npMCI->dwFlags & MCIAVI_NOTINTERLEAVED) { LoadString(ghModule, INFO_FILETYPE_AVI, pch, 80); pch += lstrlen(pch); } else { LoadString(ghModule, INFO_FILETYPE_INT, pch, 80); pch += lstrlen(pch); } // // display length // // Length: ## Frames (#.## sec) // LoadString(ghModule, INFO_LENGTH, ach, sizeof(ach)); time = muldivru32(npMCI->lFrames, npMCI->dwMicroSecPerFrame, 1000L); pch += wsprintf(pch, ach, npMCI->lFrames, time/1000, achDecimal[0], (int)(time%1000)); // // display the average data rate // // Data Rate: #k/sec // len = npMCI->dwBigListEnd - npMCI->dwMovieListOffset; if (len == 0) len = AVIGetFileSize(npMCI->szFilename); if (len > 0) { LoadString(ghModule, INFO_DATARATE, ach, sizeof(ach)); pch += wsprintf(pch, ach,muldiv32(len,1000,time) / 1024); } // // dump info on each stream. // for (i=0; istreams; i++) { STREAMINFO *psi = SI(i); LONG rate = muldiv32(psi->sh.dwRate,1000,psi->sh.dwScale); // // display video format // // Video: MSVC 160x120x8 (cram) 15.000 fps // if (psi->lpFormat && psi->sh.fccType == streamtypeVIDEO) { LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)psi->lpFormat; DWORD fccHandler = psi->sh.fccHandler; DWORD fccFormat = lpbi->biCompression; if (fccHandler == 0) fccHandler = comptypeNONE; if (fccHandler == BI_RLE8) fccHandler = comptypeRLE; if (fccFormat == 0) fccFormat = comptypeNONE; if (fccFormat == BI_RLE8) fccFormat = comptypeRLE; LoadString(ghModule, INFO_VIDEOFORMAT, ach, sizeof(ach)); pch += wsprintf(pch, ach, (LPVOID)&fccHandler, (int)lpbi->biWidth, (int)lpbi->biHeight, (int)lpbi->biBitCount, (LPVOID)&fccFormat, (UINT)(rate/1000), achDecimal[0], (UINT)(rate%1000)); } // // display audio format // // Audio: Mono 11.024KHz 8bit // else if (psi->lpFormat && psi->sh.fccType == streamtypeAUDIO) { LPWAVEFORMAT pwf = (LPWAVEFORMAT)psi->lpFormat; if (pwf->nChannels == 1) LoadString(ghModule, INFO_MONOFORMAT, ach, sizeof(ach)); else LoadString(ghModule, INFO_STEREOFORMAT, ach, sizeof(ach)); pch += wsprintf(pch, ach, (int)(pwf->nSamplesPerSec/1000),achDecimal[0], (int)(pwf->nSamplesPerSec%1000), (int)(pwf->nAvgBytesPerSec * 8 / (pwf->nSamplesPerSec * pwf->nChannels))); if (pwf->wFormatTag == WAVE_FORMAT_PCM) { } else if (pwf->wFormatTag == 2) { // ADPCM pch -= 2; // skip over \r\n LoadString(ghModule, INFO_ADPCM, pch, 20); pch += lstrlen(pch); } else { pch -= 2; // skip over \r\n LoadString(ghModule, INFO_COMPRESSED, pch, 20); pch += lstrlen(pch); } } // // Other stream. // else if (psi->sh.fccType != 0) { LoadString(ghModule, INFO_STREAM, ach, sizeof(ach)); pch += wsprintf(pch, ach, (LPSTR)&psi->sh.fccType, (LPSTR)&psi->sh.fccHandler); } if (!(psi->dwFlags & STREAM_ENABLED)) { pch -= 2; // skip over \r\n LoadString(ghModule, INFO_DISABLED, ach, sizeof(ach)); pch += wsprintf(pch, ach); } } #ifdef DEBUG // // show the frames skipped on the last play // if (npMCI->lFramesPlayed > 0) { LoadString(ghModule, INFO_SKIP, ach, sizeof(ach)); pch += wsprintf(pch, ach, npMCI->lSkippedFrames, npMCI->lFramesPlayed, (int)(100L * npMCI->lSkippedFrames / npMCI->lFramesPlayed)); // // show the frames not read on the last play // if (npMCI->lFramesSeekedPast > 0) { LoadString(ghModule, INFO_NOTREAD, ach, sizeof(ach)); pch += wsprintf(pch, ach, npMCI->lFramesSeekedPast, (int)(100L * npMCI->lFramesSeekedPast / npMCI->lFramesPlayed)); } } // // show the # audio breaks on the last play // if (npMCI->lFramesPlayed > 0 && npMCI->lAudioBreaks > 0) { LoadString(ghModule, INFO_SKIPAUDIO, ach, sizeof(ach)); pch += wsprintf(pch, ach, npMCI->lAudioBreaks); } #endif if (npMCI->dwKeyFrameInfo == 1) { LoadString(ghModule, INFO_ALLKEYFRAMES, ach, sizeof(ach)); pch += wsprintf(pch, ach, (int)npMCI->dwKeyFrameInfo); } else if (npMCI->dwKeyFrameInfo == 0) { LoadString(ghModule, INFO_NOKEYFRAMES, ach, sizeof(ach)); pch += wsprintf(pch, ach, (int)npMCI->dwKeyFrameInfo); } else { LoadString(ghModule, INFO_KEYFRAMES, ach, sizeof(ach)); pch += wsprintf(pch, ach, (int)npMCI->dwKeyFrameInfo); } #ifdef DEBUG // // timing info // #define SEC(time) (UINT)(time / 1000l) , (UINT)(time % 1000l) #define SECX(time,t) SEC(time) , (t ? (UINT)(time * 100l / t) : 0) if (npMCI->lFramesPlayed > 0) { DRAWDIBTIME ddt; pch += wsprintf(pch, TEXT("MCIAVI-------------------------------------\r\n")); pch += wsprintf(pch, TEXT("timePlay: \t%3d.%03dsec\r\n"),SEC(npMCI->timePlay)); pch += wsprintf(pch, TEXT("timeRead: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeRead, npMCI->timePlay)); pch += wsprintf(pch, TEXT("timeWait: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeWait, npMCI->timePlay)); pch += wsprintf(pch, TEXT("timeYield: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeYield, npMCI->timePlay)); pch += wsprintf(pch, TEXT("timeVideo: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeVideo, npMCI->timePlay)); pch += wsprintf(pch, TEXT("timeDraw: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeDraw, npMCI->timePlay)); pch += wsprintf(pch, TEXT("timeDecomp: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeDecompress, npMCI->timePlay)); pch += wsprintf(pch, TEXT("timeAudio: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeAudio, npMCI->timePlay)); pch += wsprintf(pch, TEXT("timePaused: \t%3d.%03dsec\r\n"),SEC(npMCI->timePaused)); pch += wsprintf(pch, TEXT("timePrepare: \t%3d.%03dsec\r\n"),SEC(npMCI->timePrepare)); pch += wsprintf(pch, TEXT("timeCleanup: \t%3d.%03dsec\r\n"),SEC(npMCI->timeCleanup)); if (npMCI->hdd && DrawDibTime(npMCI->hdd, &ddt)) { pch += wsprintf(pch, TEXT("DrawDib-------------------------------------\r\n")); pch += wsprintf(pch, TEXT("timeDraw: \t%3d.%03dsec\r\n"), SEC(ddt.timeDraw)); pch += wsprintf(pch, TEXT("timeDecompress: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeDecompress, ddt.timeDraw)); pch += wsprintf(pch, TEXT("timeDither: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeDither, ddt.timeDraw)); pch += wsprintf(pch, TEXT("timeStretch: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeStretch, ddt.timeDraw)); pch += wsprintf(pch, TEXT("timeSetDIBits: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeSetDIBits, ddt.timeDraw)); pch += wsprintf(pch, TEXT("timeBlt: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeBlt, ddt.timeDraw)); } } #endif // // now shove this mess into the info window. // Assert(pch - pchInfo < 8192); SetWindowFont(GetDlgItem(hwnd, ID_INFO), GetStockObject(ANSI_VAR_FONT), TRUE); SetDlgItemText(hwnd, ID_INFO, pchInfo); LocalFree((HLOCAL)pchInfo); return TRUE; } BOOL FAR PASCAL _LOADDS ConfigDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) { static NPMCIGRAPHIC npMCI = NULL; DWORD dwOptions; TCHAR ach[80]; switch (wMsg) { case WM_INITDIALOG: npMCI = (NPMCIGRAPHIC)(UINT)lParam; ghwndConfig = hDlg; if (npMCI) dwOptions = npMCI->dwOptionFlags; else dwOptions = ReadConfigInfo(); #ifndef WIN32 // On NT we do not support full screen. I wonder if this // will ever change ? CheckRadioButton(hDlg, ID_WINDOW, ID_VGA240, (dwOptions & MCIAVIO_USEVGABYDEFAULT) ? ID_VGA240 : ID_WINDOW); #endif CheckDlgButton(hDlg, ID_ZOOM2, (dwOptions & MCIAVIO_ZOOMBY2) != 0); CheckDlgButton(hDlg, ID_SKIPFRAMES, (dwOptions & MCIAVIO_SKIPFRAMES) != 0); #if 0 ///////////////////////////////////////////////////////////////////// CheckDlgButton(hDlg, ID_FAILIFNOWAVE, (dwOptions & MCIAVIO_FAILIFNOWAVE) != 0); CheckDlgButton(hDlg, ID_SEEKEXACT, (dwOptions & MCIAVIO_SEEKEXACT) == 0); #endif ///////////////////////////////////////////////////////////////////// // CheckDlgButton(hDlg, ID_STUPIDMODE, // (dwOptions & MCIAVIO_STUPIDMODE) != 0); EnableWindow(GetDlgItem(hDlg, ID_ZOOM2), TRUE); // (dwOptions & MCIAVIO_STUPIDMODE) == 0); if (npMCI == NULL) { GetDlgItemText(hDlg, ID_DEFAULT, ach, sizeof(ach)/sizeof(TCHAR)); SetDlgItemText(hDlg, IDOK, ach); ShowWindow(GetDlgItem(hDlg, ID_DEFAULT),SW_HIDE); } if (!ConfigInfo(npMCI, hDlg)) { RECT rcWindow; RECT rc; GetWindowRect(hDlg, &rcWindow); GetWindowRect(GetDlgItem(hDlg, ID_SIZE), &rc); SetWindowPos(hDlg, NULL, 0, 0, rcWindow.right-rcWindow.left, rc.top - rcWindow.top, SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); } return TRUE; case WM_ENDSESSION: if (wParam) EndDialog(hDlg, FALSE); break; case WM_COMMAND: switch (wParam) { case ID_DEFAULT: case IDOK: if (npMCI) dwOptions = npMCI->dwOptionFlags; else dwOptions = 0; /* Clear the flags we might set */ dwOptions &= ~(MCIAVIO_USEVGABYDEFAULT | MCIAVIO_SKIPFRAMES | //// MCIAVIO_FAILIFNOWAVE | //// MCIAVIO_SEEKEXACT | MCIAVIO_ZOOMBY2 | MCIAVIO_STUPIDMODE); #ifndef WIN32 // On NT we do not support full screen. I wonder if this // will ever change ? if (!IsDlgButtonChecked(hDlg, ID_WINDOW)) dwOptions |= MCIAVIO_USEVGABYDEFAULT; #endif if (IsDlgButtonChecked(hDlg, ID_SKIPFRAMES)) dwOptions |= MCIAVIO_SKIPFRAMES; //// if (IsDlgButtonChecked(hDlg, ID_FAILIFNOWAVE)) //// dwOptions |= MCIAVIO_FAILIFNOWAVE; //// if (!IsDlgButtonChecked(hDlg, ID_SEEKEXACT)) dwOptions |= MCIAVIO_SEEKEXACT; // if (IsDlgButtonChecked(hDlg, ID_STUPIDMODE)) // dwOptions |= MCIAVIO_STUPIDMODE; // // else if (IsDlgButtonChecked(hDlg, ID_ZOOM2)) if (IsDlgButtonChecked(hDlg, ID_ZOOM2)) dwOptions |= MCIAVIO_ZOOMBY2; if (wParam == ID_DEFAULT || npMCI == NULL) WriteConfigInfo(dwOptions); if (wParam == IDOK) { if (npMCI) npMCI->dwOptionFlags = dwOptions; EndDialog(hDlg, TRUE); } break; // case ID_STUPIDMODE: // EnableWindow(GetDlgItem(hDlg, ID_ZOOM2), // !IsDlgButtonChecked(hDlg, ID_STUPIDMODE)); // // /* Clear "zoom" if easy mode checked */ // if (IsDlgButtonChecked(hDlg, ID_STUPIDMODE)) // CheckDlgButton(hDlg, ID_ZOOM2, FALSE); // break; case IDCANCEL: EndDialog(hDlg, FALSE); break; #ifdef DEBUG case ID_DEBUG: DialogBoxParam(ghModule, MAKEINTRESOURCE(IDA_DEBUG), hDlg, DebugDlgProc, (DWORD)(UINT)npMCI); break; #endif } break; } return FALSE; } DWORD FAR PASCAL ReadConfigInfo(void) { int i; DWORD dwOptions = 0L; HDC hdc; // // ask the display device if it can do 256 color. // hdc = GetDC(NULL); i = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES); ReleaseDC(NULL, hdc); i = GetProfileInt(szIni, szDEFAULTVIDEO, (i < 8 && (GetWinFlags() & WF_CPU286)) ? 240 : 0); if (i >= 200) dwOptions |= MCIAVIO_USEVGABYDEFAULT; ////if (GetProfileInt(szIni, szSEEKEXACT, 1)) dwOptions |= MCIAVIO_SEEKEXACT; if (GetProfileInt(szIni, szZOOMBY2, 0)) dwOptions |= MCIAVIO_ZOOMBY2; ////if (GetProfileInt(szIni, szFAILIFNOWAVE, 0)) //// dwOptions |= MCIAVIO_FAILIFNOWAVE; // if (GetProfileInt(szIni, szSTUPIDMODE, 0)) // dwOptions |= MCIAVIO_STUPIDMODE; if (GetProfileInt(szIni, szSKIPFRAMES, 1)) dwOptions |= MCIAVIO_SKIPFRAMES; if (GetProfileInt(szIni, szUSEAVIFILE, 0)) dwOptions |= MCIAVIO_USEAVIFILE; return dwOptions; } void FAR PASCAL WriteConfigInfo(DWORD dwOptions) { // !!! This shouldn't get written out if it is the default! WriteProfileString(szIni, szDEFAULTVIDEO, (dwOptions & MCIAVIO_USEVGABYDEFAULT) ? szVIDEO240 : szVIDEOWINDOW); ////WriteProfileString(szIni, szSEEKEXACT, //// (dwOptions & MCIAVIO_SEEKEXACT) ? sz1 : sz0); WriteProfileString(szIni, szZOOMBY2, (dwOptions & MCIAVIO_ZOOMBY2) ? sz1 : sz0); ////WriteProfileString(szIni, szFAILIFNOWAVE, //// (dwOptions & MCIAVIO_FAILIFNOWAVE) ? sz1 : sz0); // WriteProfileString(szIni, szSTUPIDMODE, // (dwOptions & MCIAVIO_STUPIDMODE) ? sz1 : sz0); WriteProfileString(szIni, szSKIPFRAMES, (dwOptions & MCIAVIO_SKIPFRAMES) ? sz1 : sz0); WriteProfileString(szIni, szUSEAVIFILE, (dwOptions & MCIAVIO_USEAVIFILE) ? sz1 : sz0); } BOOL FAR PASCAL ConfigDialog(HWND hwnd, NPMCIGRAPHIC npMCI) { #define MAX_WINDOWS 10 HWND hwndActive[MAX_WINDOWS]; BOOL f; int i; HWND hwndT; if (ghwndConfig) { MessageBeep(0); return FALSE; } if (hwnd == NULL) hwnd = GetActiveWindow(); // // enum all the toplevel windows of this task and disable them! // for (hwndT = GetWindow(GetDesktopWindow(), GW_CHILD), i=0; hwndT && i < MAX_WINDOWS; hwndT = GetWindow(hwndT, GW_HWNDNEXT)) { if (IsWindowEnabled(hwndT) && IsWindowVisible(hwndT) && (HTASK)GetWindowTask(hwndT) == GetCurrentTask() && hwndT != hwnd) { // don't disable our parent hwndActive[i++] = hwndT; EnableWindow(hwndT, FALSE); } } f = DialogBoxParam(ghModule, MAKEINTRESOURCE(IDA_CONFIG), hwnd, ConfigDlgProc, (DWORD)(UINT)npMCI); // // restore all windows // while (i-- > 0) EnableWindow(hwndActive[i], TRUE); if (hwnd) SetActiveWindow(hwnd); ghwndConfig = NULL; return f; }