200 lines
6.3 KiB
C++
200 lines
6.3 KiB
C++
// Copyright (c) 1996 - 1998 Microsoft Corporation. All Rights Reserved.
|
|
#include <streams.h>
|
|
#include <mmreg.h>
|
|
#include <commctrl.h>
|
|
|
|
#include "project.h"
|
|
#include "mpgcodec.h"
|
|
#include <olectl.h>
|
|
#include <stdio.h>
|
|
extern HINSTANCE hInst;
|
|
|
|
// these lines copied from SDK\CLASSES\BASE\FILTER.H
|
|
#define QueryFilterInfoReleaseGraph(fi) if ((fi).pGraph) (fi).pGraph->Release();
|
|
|
|
typedef HRESULT (STDAPICALLTYPE *LPOCPF)(HWND hwndOwner, UINT x, UINT y,
|
|
LPCOLESTR lpszCaption, ULONG cObjects, LPUNKNOWN FAR* ppUnk, ULONG cPages,
|
|
LPCLSID pPageClsID, LCID lcid, DWORD dwReserved, LPVOID pvReserved);
|
|
|
|
typedef HRESULT (STDAPICALLTYPE *LPOI)(LPVOID pvReserved);
|
|
typedef void (STDAPICALLTYPE *LPOUI)(void);
|
|
|
|
|
|
//
|
|
// Release the reference count for those filters put into the configuration
|
|
// listbox
|
|
//
|
|
|
|
void ReleaseFilters(HWND hwndListbox)
|
|
{
|
|
if (hwndListbox) {
|
|
IBaseFilter* pFilter;
|
|
|
|
for (int i=ListBox_GetCount(hwndListbox); i--;) {
|
|
if (pFilter = (IBaseFilter*)ListBox_GetItemData(hwndListbox, i))
|
|
pFilter->Release();
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
INT_PTR CALLBACK ConfigDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (wMsg) {
|
|
case WM_INITDIALOG:
|
|
{
|
|
IFilterGraph *pFG = (IFilterGraph *) lParam;
|
|
|
|
IEnumFilters* pEF;
|
|
IBaseFilter* pFilter;
|
|
FILTER_INFO Info;
|
|
|
|
HWND hlist = GetDlgItem(hDlg, IDC_FILTERS);
|
|
if (pFG == NULL)
|
|
return FALSE;
|
|
|
|
// Grab an enumerator for the filter graph.
|
|
HRESULT hr = pFG->EnumFilters(&pEF);
|
|
|
|
// ASSERT(SUCCEEDED(hr));
|
|
|
|
// Check out each filter.
|
|
while (pEF->Next(1, &pFilter, NULL) == S_OK)
|
|
{
|
|
int Index;
|
|
|
|
hr = pFilter->QueryFilterInfo(&Info);
|
|
// ASSERT(SUCCEEDED(hr));
|
|
QueryFilterInfoReleaseGraph(Info);
|
|
|
|
#ifdef UNICODE
|
|
Index = ListBox_AddString(hlist, Info.achName);
|
|
#else
|
|
CHAR aFilterName[MAX_FILTER_NAME];
|
|
WideCharToMultiByte(CP_ACP, 0, Info.achName, -1, aFilterName, MAX_FILTER_NAME, NULL, NULL);
|
|
Index = ListBox_AddString(hlist, aFilterName);
|
|
#endif
|
|
|
|
// ASSERT(Index != LB_ERR);
|
|
// ASSERT(Index != LB_ERRSPACE);
|
|
|
|
// Store the IBaseFilter pointer with the listbox item.
|
|
// it gets used if the properties have to be queried
|
|
ListBox_SetItemData(hlist, Index, pFilter);
|
|
}
|
|
|
|
pEF->Release();
|
|
}
|
|
return TRUE;
|
|
|
|
case WM_ENDSESSION:
|
|
if (wParam) {
|
|
ReleaseFilters(GetDlgItem(hDlg, IDC_FILTERS));
|
|
EndDialog(hDlg, FALSE);
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam)) {
|
|
case IDOK:
|
|
ReleaseFilters(GetDlgItem(hDlg, IDC_FILTERS));
|
|
EndDialog(hDlg, TRUE);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
ReleaseFilters(GetDlgItem(hDlg, IDC_FILTERS));
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
case IDC_FILTERS:
|
|
if (HIWORD(wParam) == LBN_SELCHANGE) {
|
|
|
|
HRESULT hr = E_FAIL;
|
|
|
|
HWND hlist = GetDlgItem(hDlg, IDC_FILTERS);
|
|
IBaseFilter *pF;
|
|
ISpecifyPropertyPages *pSPP;
|
|
|
|
pF = (IBaseFilter *)
|
|
ListBox_GetItemData(hlist, ListBox_GetCurSel(hlist));
|
|
|
|
if (pF) {
|
|
hr = pF->QueryInterface(IID_ISpecifyPropertyPages,
|
|
(void **)&pSPP);
|
|
}
|
|
|
|
if (hr == S_OK) {
|
|
pSPP->Release();
|
|
}
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PROPERTIES), hr == S_OK);
|
|
}
|
|
else if (HIWORD(wParam) == LBN_DBLCLK) {
|
|
HWND hwndBtn = GetDlgItem(hDlg, IDC_PROPERTIES);
|
|
SendMessage(hwndBtn, WM_LBUTTONDOWN, 0, 0L);
|
|
SendMessage(hwndBtn, WM_LBUTTONUP, 0, 0L);
|
|
}
|
|
break;
|
|
|
|
case IDC_PROPERTIES:
|
|
{
|
|
HWND hlist = GetDlgItem(hDlg, IDC_FILTERS);
|
|
IBaseFilter *pF;
|
|
pF = (IBaseFilter *)
|
|
ListBox_GetItemData(hlist, ListBox_GetCurSel(hlist));
|
|
|
|
static const TCHAR szOleControlDll[] = TEXT("OLEPRO32.dll");
|
|
static const char szOCPF[] = "OleCreatePropertyFrame";
|
|
static const TCHAR szOleDll[] = TEXT("OLE32.dll");
|
|
static const char szOleInit[] = "OleInitialize";
|
|
static const char szOleUninit[] = "OleUninitialize";
|
|
|
|
HINSTANCE hinst = LoadLibrary(szOleControlDll);
|
|
if (!hinst) break;
|
|
|
|
LPOCPF lpfn = (LPOCPF)GetProcAddress(hinst, szOCPF);
|
|
HINSTANCE hinstOLE = LoadLibrary(szOleDll);
|
|
|
|
if (hinstOLE) {
|
|
LPOI lpfnInit = (LPOI)GetProcAddress(hinstOLE, szOleInit);
|
|
LPOUI lpfnUninit = (LPOUI)GetProcAddress(hinstOLE, szOleUninit);
|
|
|
|
if (lpfn && lpfnInit && lpfnUninit) {
|
|
|
|
(*lpfnInit) (NULL);
|
|
(*lpfn)(hDlg, // Parent
|
|
0, // x coordinate
|
|
0, // y coordinate
|
|
L"Filter", // Caption
|
|
1, // Number of objects
|
|
(IUnknown**)&pF, // 1 object
|
|
0, // No pages :- will use
|
|
NULL, // ISpecifyPropertyPages
|
|
0, // AmbientLocaleID(),
|
|
0, // Reserved
|
|
NULL); // Reserved
|
|
(*lpfnUninit) ();
|
|
}
|
|
FreeLibrary(hinstOLE);
|
|
}
|
|
FreeLibrary(hinst);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
BOOL CMpegMovie::ConfigDialog(HWND hwnd)
|
|
{
|
|
BOOL f = TRUE;
|
|
|
|
f = (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PROPPAGE),
|
|
hwnd, ConfigDlgProc, (DWORD_PTR)m_Fg);
|
|
|
|
return f;
|
|
}
|