ComPropertySheet.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // ComPropertySheet.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "ComPropertySheet.h"
  26. #include "....DSUtilDSUtil.h"
  27. #include "....filtersInternalPropertyPage.h"
  28. // CComPropertyPageSite
  29. class CComPropertyPageSite : public CUnknown, public IPropertyPageSite
  30. {
  31. IComPropertyPageDirty* m_pPPD;
  32. public:
  33. CComPropertyPageSite(IComPropertyPageDirty* pPPD) : CUnknown(NAME("CComPropertyPageSite"), NULL), m_pPPD(pPPD) {}
  34. DECLARE_IUNKNOWN
  35. STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv)
  36. {
  37. return 
  38. QI(IPropertyPageSite)
  39. __super::NonDelegatingQueryInterface(riid, ppv);
  40. }
  41. // IPropertyPageSite
  42. STDMETHODIMP OnStatusChange(DWORD flags)
  43. {
  44. if(m_pPPD)
  45. {
  46. if(flags&PROPPAGESTATUS_DIRTY) m_pPPD->OnSetDirty(true); 
  47. if(flags&PROPPAGESTATUS_CLEAN) m_pPPD->OnSetDirty(false);
  48. }
  49. return S_OK;
  50. }
  51. STDMETHODIMP GetLocaleID(LCID* pLocaleID)
  52. {
  53. CheckPointer(pLocaleID, E_POINTER);
  54. *pLocaleID = ::GetUserDefaultLCID();
  55. return S_OK;
  56. }
  57. STDMETHODIMP GetPageContainer(IUnknown** ppUnk) {return E_NOTIMPL;}
  58. STDMETHODIMP TranslateAccelerator(LPMSG pMsg) {return E_NOTIMPL;}
  59. };
  60. // CComPropertySheet
  61. IMPLEMENT_DYNAMIC(CComPropertySheet, CPropertySheet)
  62. CComPropertySheet::CComPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
  63. : CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
  64. {
  65. m_pSite = new CComPropertyPageSite(this);
  66. m_size.SetSize(0, 0);
  67. }
  68. CComPropertySheet::CComPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
  69. : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
  70. {
  71. m_pSite = new CComPropertyPageSite(this);
  72. m_size.SetSize(0, 0);
  73. }
  74. CComPropertySheet::~CComPropertySheet()
  75. {
  76. }
  77. int CComPropertySheet::AddPages(CComPtr<ISpecifyPropertyPages> pSPP)
  78. {
  79. if(!pSPP) return(0);
  80. CAUUID caGUID;
  81. caGUID.pElems = NULL;
  82. if(FAILED(pSPP->GetPages(&caGUID)))
  83. return(0);
  84. IUnknown* lpUnk = NULL;
  85. if(FAILED(pSPP.QueryInterface(&lpUnk)))
  86. return(0);
  87. m_spp.AddTail(pSPP);
  88. CComQIPtr<ISpecifyPropertyPages2> pSPP2 = pSPP;
  89. CComQIPtr<IPersist> pPersist = pSPP;
  90. ULONG nPages = 0;
  91. for(ULONG i = 0; i < caGUID.cElems; i++)
  92. {
  93. CComPtr<IPropertyPage> pPage;
  94. HRESULT hr = E_FAIL;
  95. if(FAILED(hr) && !pPage && pSPP2)
  96. {
  97. hr = pSPP2->CreatePage(caGUID.pElems[i], &pPage);
  98. }
  99. if(FAILED(hr) && !pPage)
  100. {
  101. hr = pPage.CoCreateInstance(caGUID.pElems[i]);
  102. }
  103. if(FAILED(hr) && !pPage && pPersist)
  104. {
  105. hr = LoadExternalPropertyPage(pPersist, caGUID.pElems[i], &pPage);
  106. }
  107. if(SUCCEEDED(hr))
  108. {
  109. if(AddPage(pPage, lpUnk))
  110. nPages++;
  111. }
  112. }
  113. if(caGUID.pElems) CoTaskMemFree(caGUID.pElems);
  114. lpUnk->Release();
  115. return(nPages);
  116. }
  117. bool CComPropertySheet::AddPage(IPropertyPage* pPage, IUnknown* pUnk)
  118. {
  119. if(!pPage || !pUnk) return false;
  120. HRESULT hr;
  121. hr = pPage->SetPageSite(m_pSite);
  122. hr = pPage->SetObjects(1, &pUnk);
  123. PROPPAGEINFO ppi;
  124. hr = pPage->GetPageInfo(&ppi);
  125. m_size.cx = max(m_size.cx, ppi.size.cx);
  126. m_size.cy = max(m_size.cy, ppi.size.cy);
  127. CAutoPtr<CComPropertyPage> p(new CComPropertyPage(pPage));
  128. __super::AddPage(p);
  129. m_pages.AddTail(p);
  130. return true;
  131. }
  132. void CComPropertySheet::OnActivated(CPropertyPage* pPage)
  133. {
  134. if(!pPage) return;
  135. CRect bounds(30000,30000,-30000,-30000);
  136. CRect wr, cr;
  137. GetWindowRect(wr);
  138. GetClientRect(cr);
  139. CSize ws = wr.Size(), cs = cr.Size();
  140. CRect twr, tcr;
  141. CTabCtrl* pTC = (CTabCtrl*)GetDlgItem(AFX_IDC_TAB_CONTROL);
  142. pTC->GetWindowRect(twr);
  143. pTC->GetClientRect(tcr);
  144. CSize tws = twr.Size(), tcs = tcr.Size();
  145. if(CWnd* pChild = pPage->GetWindow(GW_CHILD))
  146. {
  147. pChild->ModifyStyle(WS_CAPTION|WS_THICKFRAME, 0);
  148. pChild->ModifyStyleEx(WS_EX_DLGMODALFRAME, WS_EX_CONTROLPARENT);
  149. for(CWnd* pGrandChild = pChild->GetWindow(GW_CHILD); pGrandChild; pGrandChild = pGrandChild->GetNextWindow())
  150. {
  151. if(!(pGrandChild->GetStyle()&WS_VISIBLE)) continue;
  152. CRect r;
  153. pGrandChild->GetWindowRect(&r);
  154. pChild->ScreenToClient(r);
  155. bounds |= r;
  156. }
  157. }
  158. bounds |= CRect(0,0,0,0);
  159. bounds.SetRect(0, 0, bounds.right + max(bounds.left, 4), bounds.bottom + max(bounds.top, 4));
  160. CRect r = CRect(CPoint(0,0), bounds.Size());
  161. pTC->AdjustRect(TRUE, r);
  162. r.SetRect(twr.TopLeft(), twr.TopLeft() + r.Size());
  163. ScreenToClient(r);
  164. pTC->MoveWindow(r);
  165. pTC->ModifyStyle(TCS_MULTILINE, TCS_SINGLELINE);
  166. CSize diff = r.Size() - tws;
  167. if(!bounds.IsRectEmpty())
  168. {
  169. if(CWnd* pChild = pPage->GetWindow(GW_CHILD))
  170. pChild->MoveWindow(bounds);
  171. CRect r = twr;
  172. pTC->AdjustRect(FALSE, r);
  173. ScreenToClient(r);
  174. pPage->MoveWindow(CRect(r.TopLeft(), bounds.Size()));
  175. }
  176. int _afxPropSheetButtons[] = { IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP };
  177. for(int i = 0; i < countof(_afxPropSheetButtons); i++)
  178. {
  179. if(CWnd* pWnd = GetDlgItem(_afxPropSheetButtons[i]))
  180. {
  181. pWnd->GetWindowRect(r);
  182. ScreenToClient(r);
  183. pWnd->MoveWindow(CRect(r.TopLeft() + diff, r.Size()));
  184. }
  185. }
  186. MoveWindow(CRect(wr.TopLeft(), ws + diff));
  187. Invalidate();
  188. }
  189. BEGIN_MESSAGE_MAP(CComPropertySheet, CPropertySheet)
  190. END_MESSAGE_MAP()
  191. // CComPropertySheet message handlers
  192. BOOL CComPropertySheet::OnInitDialog()
  193. {
  194. BOOL bResult = (BOOL)Default();//CPropertySheet::OnInitDialog();
  195. if (!(GetStyle() & WS_CHILD))
  196. CenterWindow();
  197. return bResult;
  198. }