//==========================================================================; // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (c) 1997 - 1998 Microsoft Corporation. All Rights Reserved. // //--------------------------------------------------------------------------; #include "vcproj.h" // Local Header Files #include "vidclip.h" #include "resource.h" #include "atlbase.h" extern CComModule _Module; #include "atlcom.h" #include "strmif.h" #include "uuids.h" #include "document.h" class CSettings { public: CSettings(CDocument *pDoc) : m_pDocument(pDoc) {}; void Init(HWND hDlg); void FillCompressorList(HWND hWndCombo, REFGUID CatGuid, ICreateDevEnum *pCreateDevEnum, CComBSTR& szDisplayName); void CleanCompressorList(HWND hWndCombo, LPOLESTR * ppDisplayName); void CleanUp(HWND hDlg, bool bSave); CDocument * m_pDocument; }; void GetMonikerName(IMoniker *pM, LPOLESTR *ppDisplayName) { CComPtr pBindCtx; CreateBindCtx(0, &pBindCtx); pM->GetDisplayName(pBindCtx, NULL, ppDisplayName); } void CSettings::FillCompressorList( HWND hWndCombo, REFGUID CatGuid, ICreateDevEnum *pCreateDevEnum, CComBSTR &szDisplayName) { CComPtr pMalloc; CoGetMalloc(1, &pMalloc); bool bFoundPrevSelection = false; IEnumMoniker *pEm; HRESULT hr = pCreateDevEnum->CreateClassEnumerator( CatGuid, &pEm, 0); if(hr == S_OK) { // enumerator returns S_FALSE if the category is empty ULONG cFetched; IMoniker *pM; while(hr = pEm->Next(1, &pM, &cFetched), hr == S_OK) { IPropertyBag *pPropBag; hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag); if(SUCCEEDED(hr)) { VARIANT var; var.vt = VT_BSTR; hr = pPropBag->Read(L"FriendlyName", &var, 0); if(SUCCEEDED(hr)) { TCHAR szString[MAX_PATH]; WideCharToMultiByte( CP_ACP, 0, var.bstrVal, -1, szString, sizeof(szString), 0, 0); int ID = SendMessage(hWndCombo, CB_ADDSTRING, 0, (LPARAM)&szString); SendMessage(hWndCombo, CB_SETITEMDATA, ID, (LPARAM)pM); SysFreeString(var.bstrVal); if (!bFoundPrevSelection && szDisplayName) { LPOLESTR pThisDevName; GetMonikerName(pM, &pThisDevName); if (pThisDevName) { if (wcscmp(szDisplayName, pThisDevName) == 0) { bFoundPrevSelection = true; SendMessage(hWndCombo, CB_SETCURSEL, ID, 0); } pMalloc->Free(pThisDevName); } } } pPropBag->Release(); } /// pM->Release(); -- Will do this later! } pEm->Release(); } static TCHAR szNone[] = ""; int ID = SendMessage(hWndCombo, CB_ADDSTRING, 0, (LPARAM)&szNone); if (!bFoundPrevSelection) { SendMessage(hWndCombo, CB_SETCURSEL, ID, 0); } } void inline SetEditLong(HWND hDlg, int ID, long val) { TCHAR s[20]; wsprintf(s, _T("%li"), val); SendDlgItemMessage(hDlg, ID, WM_SETTEXT, 0, (LPARAM)s); } void CSettings::Init(HWND hDlg) { USES_CONVERSION; CComPtr pCreateDevEnum; HRESULT hr = CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum); if(SUCCEEDED(hr)) { FillCompressorList(GetDlgItem(hDlg, IDC_COMBO_VIDCOMP), CLSID_VideoCompressorCategory, pCreateDevEnum, m_pDocument->m_VideoCodecDisplayName); FillCompressorList(GetDlgItem(hDlg, IDC_COMBO_AUDIOCOMP), CLSID_AudioCompressorCategory, pCreateDevEnum, m_pDocument->m_AudioCodecDisplayName); } CheckRadioButton(hDlg, IDC_RADIO16BIT, IDC_RADIO24BIT, IDC_RADIO16BIT + m_pDocument->m_PixelDepth); SendDlgItemMessage(hDlg, IDC_EDIT_FILENAME, WM_SETTEXT, 0, (LPARAM)W2T(m_pDocument->m_TargetFileName)); SetEditLong(hDlg, IDC_HEIGHT, m_pDocument->m_Height); SetEditLong(hDlg, IDC_WIDTH, m_pDocument->m_Width); } void CSettings::CleanCompressorList(HWND hWndCombo, LPOLESTR * ppDisplayName) { *ppDisplayName = NULL; int IDSelected = SendMessage(hWndCombo, CB_GETCURSEL, 0, 0); if (IDSelected != CB_ERR) { IMoniker *pMoniker = (IMoniker *)SendMessage(hWndCombo, CB_GETITEMDATA, IDSelected, 0); if (pMoniker) { GetMonikerName(pMoniker, ppDisplayName); } } int NumItems = SendMessage(hWndCombo, CB_GETCOUNT, 0, 0); for (int i = 0; i < NumItems; i++) { IMoniker *pMoniker = (IMoniker *)SendMessage(hWndCombo, CB_GETITEMDATA, i, 0); if (pMoniker) { pMoniker->Release(); } } } void CSettings::CleanUp(HWND hDlg, bool bSave) { USES_CONVERSION; WCHAR *pVideoName = NULL; WCHAR *pAudioName = NULL; CleanCompressorList(GetDlgItem(hDlg, IDC_COMBO_VIDCOMP), &pVideoName); CleanCompressorList(GetDlgItem(hDlg, IDC_COMBO_AUDIOCOMP), &pAudioName); if (bSave) { m_pDocument->m_VideoCodecDisplayName = pVideoName; m_pDocument->m_AudioCodecDisplayName = pAudioName; } CComPtr pMalloc; CoGetMalloc(1, &pMalloc); pMalloc->Free(pVideoName); pMalloc->Free(pAudioName); if (bSave) { TCHAR szEditContents[MAX_PATH]; TCHAR *pUnused; m_pDocument->MarkDirty(); SendDlgItemMessage(hDlg, IDC_EDIT_FILENAME, WM_GETTEXT, sizeof(szEditContents) / sizeof(TCHAR), (LPARAM)szEditContents); m_pDocument->m_TargetFileName = szEditContents; SendDlgItemMessage(hDlg, IDC_HEIGHT, WM_GETTEXT, sizeof(szEditContents) / sizeof(TCHAR), (LPARAM)szEditContents); m_pDocument->m_Height = strtol(szEditContents, &pUnused, 10); SendDlgItemMessage(hDlg, IDC_WIDTH, WM_GETTEXT, sizeof(szEditContents) / sizeof(TCHAR), (LPARAM)szEditContents); m_pDocument->m_Width = strtol(szEditContents, &pUnused, 10); m_pDocument->m_PixelDepth = IsDlgButtonChecked(hDlg, IDC_RADIO16BIT) ? 0 : 1; } } void DoSettingsDialog(HINSTANCE hInst, HWND hWnd, CDocument *pDoc) { CSettings Settings(pDoc); DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SETTINGS), hWnd, (DLGPROC)SettingsDlg, (LPARAM)&Settings); } // // FUNCTION: Settings(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for "About" dialog box // This version allows greater flexibility over the contents of the 'About' box, // by pulling out values from the 'Version' resource. // // MESSAGES: // // WM_INITDIALOG - initialize dialog box // WM_COMMAND - Input received // // LRESULT CALLBACK SettingsDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { CSettings *pSettings = (CSettings *)GetWindowLong(hDlg, DWL_USER); switch (message) { case WM_INITDIALOG: pSettings = (CSettings *)lParam; SetWindowLong(hDlg, DWL_USER, lParam); pSettings->Init(hDlg); return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { pSettings->CleanUp(hDlg, LOWORD(wParam) == IDOK); EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; }