ComPropertySheet.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 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. // CComPropertyPageSite
  28. class CComPropertyPageSite : public CUnknown, public IPropertyPageSite
  29. {
  30. IComPropertyPageDirty* m_pPPD;
  31. public:
  32. CComPropertyPageSite(IComPropertyPageDirty* pPPD) : CUnknown(NAME("CComPropertyPageSite"), NULL), m_pPPD(pPPD) {}
  33. DECLARE_IUNKNOWN
  34. STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv)
  35. {
  36. return 
  37. QI(IPropertyPageSite)
  38. __super::NonDelegatingQueryInterface(riid, ppv);
  39. }
  40. // IPropertyPageSite
  41. STDMETHODIMP OnStatusChange(DWORD flags)
  42. {
  43. if(m_pPPD)
  44. {
  45. if(flags&PROPPAGESTATUS_DIRTY) m_pPPD->OnSetDirty(true); 
  46. if(flags&PROPPAGESTATUS_CLEAN) m_pPPD->OnSetDirty(false);
  47. }
  48. return S_OK;
  49. }
  50. STDMETHODIMP GetLocaleID(LCID* pLocaleID)
  51. {
  52. CheckPointer(pLocaleID, E_POINTER);
  53. *pLocaleID = ::GetUserDefaultLCID();
  54. return S_OK;
  55. }
  56. STDMETHODIMP GetPageContainer(IUnknown** ppUnk) {return E_NOTIMPL;}
  57. STDMETHODIMP TranslateAccelerator(LPMSG pMsg) {return E_NOTIMPL;}
  58. };
  59. // CComPropertySheet
  60. IMPLEMENT_DYNAMIC(CComPropertySheet, CPropertySheet)
  61. CComPropertySheet::CComPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
  62. : CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
  63. {
  64. m_pSite = new CComPropertyPageSite(this);
  65. m_size.SetSize(0, 0);
  66. }
  67. CComPropertySheet::CComPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
  68. : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
  69. {
  70. m_pSite = new CComPropertyPageSite(this);
  71. m_size.SetSize(0, 0);
  72. }
  73. CComPropertySheet::~CComPropertySheet()
  74. {
  75. }
  76. int CComPropertySheet::AddPages(CComPtr<ISpecifyPropertyPages> pSPP)
  77. {
  78. if(!pSPP) return(0);
  79. CAUUID caGUID;
  80. caGUID.pElems = NULL;
  81. if(FAILED(pSPP->GetPages(&caGUID)))
  82. return(0);
  83. IUnknown* lpUnk = NULL;
  84. if(FAILED(pSPP.QueryInterface(&lpUnk)))
  85. return(0);
  86. m_spp.AddTail(pSPP);
  87. ULONG nPages = 0;
  88. for(ULONG i = 0; i < caGUID.cElems; i++)
  89. {
  90. CComPtr<IPropertyPage> pPage;
  91. HRESULT hr = pPage.CoCreateInstance(caGUID.pElems[i]);
  92. if(FAILED(hr))
  93. {
  94. if(CComQIPtr<IPersist> pP = pSPP)
  95. hr = LoadExternalPropertyPage(pP, caGUID.pElems[i], &pPage);
  96. }
  97. if(SUCCEEDED(hr))
  98. {
  99. HRESULT hr;
  100. hr = pPage->SetPageSite(m_pSite);
  101. hr = pPage->SetObjects(1, &lpUnk);
  102. PROPPAGEINFO ppi;
  103. hr = pPage->GetPageInfo(&ppi);
  104. m_size.cx = max(m_size.cx, ppi.size.cx);
  105. m_size.cy = max(m_size.cy, ppi.size.cy);
  106. CAutoPtr<CComPropertyPage> p(new CComPropertyPage(pPage));
  107. AddPage(p);
  108. m_pages.AddTail(p);
  109. nPages++;
  110. }
  111. }
  112. if(caGUID.pElems) CoTaskMemFree(caGUID.pElems);
  113. lpUnk->Release();
  114. return(nPages);
  115. }
  116. void CComPropertySheet::OnActivated(CPropertyPage* pPage)
  117. {
  118. if(!pPage) return;
  119. CRect bounds(30000,30000,-30000,-30000);
  120. CRect wr, cr;
  121. GetWindowRect(wr);
  122. GetClientRect(cr);
  123. CSize ws = wr.Size(), cs = cr.Size();
  124. CRect twr, tcr;
  125. CTabCtrl* pTC = (CTabCtrl*)GetDlgItem(AFX_IDC_TAB_CONTROL);
  126. pTC->GetWindowRect(twr);
  127. pTC->GetClientRect(tcr);
  128. CSize tws = twr.Size(), tcs = tcr.Size();
  129. if(CWnd* pChild = pPage->GetWindow(GW_CHILD))
  130. {
  131. pChild->ModifyStyle(WS_CAPTION|WS_THICKFRAME, 0);
  132. pChild->ModifyStyleEx(WS_EX_DLGMODALFRAME, 0);
  133. for(CWnd* pGrandChild = pChild->GetWindow(GW_CHILD); pGrandChild; pGrandChild = pGrandChild->GetNextWindow())
  134. {
  135. if(!(pGrandChild->GetStyle()&WS_VISIBLE)) continue;
  136. CRect r;
  137. pGrandChild->GetWindowRect(&r);
  138. pChild->ScreenToClient(r);
  139. bounds |= r;
  140. }
  141. }
  142. bounds |= CRect(0,0,0,0);
  143. bounds.SetRect(0, 0, bounds.right + max(bounds.left, 4), bounds.bottom + max(bounds.top, 4));
  144. CRect r = CRect(CPoint(0,0), bounds.Size());
  145. pTC->AdjustRect(TRUE, r);
  146. r.SetRect(twr.TopLeft(), twr.TopLeft() + r.Size());
  147. ScreenToClient(r);
  148. pTC->MoveWindow(r);
  149. pTC->ModifyStyle(TCS_MULTILINE, TCS_SINGLELINE);
  150. CSize diff = r.Size() - tws;
  151. if(!bounds.IsRectEmpty())
  152. {
  153. if(CWnd* pChild = pPage->GetWindow(GW_CHILD))
  154. pChild->MoveWindow(bounds);
  155. CRect r = twr;
  156. pTC->AdjustRect(FALSE, r);
  157. ScreenToClient(r);
  158. pPage->MoveWindow(CRect(r.TopLeft(), bounds.Size()));
  159. }
  160. int _afxPropSheetButtons[] = { IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP };
  161. for(int i = 0; i < countof(_afxPropSheetButtons); i++)
  162. {
  163. if(CWnd* pWnd = GetDlgItem(_afxPropSheetButtons[i]))
  164. {
  165. pWnd->GetWindowRect(r);
  166. ScreenToClient(r);
  167. pWnd->MoveWindow(CRect(r.TopLeft() + diff, r.Size()));
  168. }
  169. }
  170. MoveWindow(CRect(wr.TopLeft(), ws + diff));
  171. Invalidate();
  172. }
  173. BEGIN_MESSAGE_MAP(CComPropertySheet, CPropertySheet)
  174. END_MESSAGE_MAP()
  175. // CComPropertySheet message handlers
  176. BOOL CComPropertySheet::OnInitDialog()
  177. {
  178. BOOL bResult = (BOOL)Default();//CPropertySheet::OnInitDialog();
  179. if (!(GetStyle() & WS_CHILD))
  180. CenterWindow();
  181. return bResult;
  182. }