XTPSkinObject.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:22k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinObject.cpp: implementation of the CXTPSkinObject class.
  2. //
  3. // This file is a part of the XTREME SKINFRAMEWORK MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPVc50Helpers.h"
  22. #include "XTPSkinManager.h"
  23. #include "XTPSkinManagerApiHook.h"
  24. #include "XTPSkinObject.h"
  25. #include "XTPSkinObjectFrame.h"
  26. #include "XTPSkinObjectButton.h"
  27. #include "XTPSkinObjectEdit.h"
  28. #include "XTPSkinObjectComboBox.h"
  29. #include "XTPSkinObjectListView.h"
  30. #include "XTPSkinObjectListBox.h"
  31. #include "XTPSkinObjectTreeView.h"
  32. #include "XTPSkinObjectScrollBar.h"
  33. #include "XTPSkinObjectTab.h"
  34. #include "XTPSkinObjectToolBar.h"
  35. #include "XTPSkinObjectProgress.h"
  36. #include "XTPSkinObjectSpin.h"
  37. #include "XTPSkinObjectHeader.h"
  38. #include "XTPSkinObjectTrackBar.h"
  39. #include "XTPSkinObjectStatusBar.h"
  40. #include "XTPSkinObjectMDI.h"
  41. #include "XTPSkinObjectMenu.h"
  42. #ifdef _DEBUG
  43. #undef THIS_FILE
  44. static char THIS_FILE[]=__FILE__;
  45. #define new DEBUG_NEW
  46. #endif
  47. CXTPSkinObjectPaintDC::CXTPSkinObjectPaintDC(CWnd* pWnd)
  48. {
  49. ASSERT_VALID(pWnd);
  50. ASSERT(::IsWindow(pWnd->m_hWnd));
  51. MSG& curMsg = AfxGetThreadState()->m_lastSentMsg;
  52. m_ps.hdc = 0;
  53. m_hWnd = pWnd->m_hWnd;
  54. if (curMsg.wParam)
  55. {
  56. Attach((HDC)curMsg.wParam);
  57. }
  58. else
  59. {
  60. if (!Attach(::BeginPaint(m_hWnd, &m_ps)))
  61. AfxThrowResourceException();
  62. ASSERT(m_ps.hdc != NULL);
  63. }
  64. }
  65. CXTPSkinObjectPaintDC::~CXTPSkinObjectPaintDC()
  66. {
  67. ASSERT(m_hDC != NULL);
  68. ASSERT(::IsWindow(m_hWnd));
  69. if (m_ps.hdc != NULL)
  70. {
  71. ::EndPaint(m_hWnd, &m_ps);
  72. }
  73. Detach();
  74. }
  75. //////////////////////////////////////////////////////////////////////////
  76. //
  77. UINT CXTPSkinObject::m_nMsgUpdateSkinState = RegisterWindowMessage(_T("WM_SKINFRAMEWORK_UPDATESTATE"));
  78. UINT CXTPSkinObject::m_nMsgQuerySkinState = RegisterWindowMessage(_T("WM_SKINFRAMEWORK_QUERYSTATE"));
  79. CXTPSkinObject::CXTPSkinObject()
  80. {
  81. m_hWnd = 0;
  82. m_pManager = NULL;
  83. m_pOldWndProc = NULL;
  84. m_wndDefProcAddr = (WNDPROC)(DWORD_PTR)0x70000000;
  85. m_bActiveX = FALSE;
  86. m_bWindowsForms = FALSE;
  87. m_bCustomDraw = FALSE;
  88. m_bUnicode = FALSE;
  89. }
  90. CXTPSkinObject::~CXTPSkinObject()
  91. {
  92. m_hWnd = 0;
  93. }
  94. #if (_MSC_VER <= 1200) && !defined(_WIN64)
  95. #define GetWindowLongPtrW GetWindowLongW
  96. #define GetWindowLongPtrA GetWindowLongA
  97. #define SetWindowLongPtrW SetWindowLongW
  98. #define SetWindowLongPtrA SetWindowLongA
  99. #endif
  100. void CXTPSkinObject::UnattachHook(BOOL bAuto)
  101. {
  102. BOOL bWindowsForms = m_bWindowsForms;
  103. if (!bWindowsForms)
  104. {
  105. if (m_bUnicode)
  106. SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (DWORD_PTR)m_pOldWndProc);
  107. else
  108. SetWindowLongPtrA(m_hWnd, GWLP_WNDPROC, (DWORD_PTR)m_pOldWndProc);
  109. }
  110. OnHookDetached(bAuto);
  111. }
  112. void CXTPSkinObject::OnFinalRelease()
  113. {
  114. delete this;
  115. }
  116. WNDPROC* CXTPSkinObject::GetSuperWndProcAddr()
  117. {
  118. return &m_pOldWndProc;
  119. }
  120. LRESULT CXTPSkinObject::DoDefWindowProc (UINT nMsg, WPARAM wParam, LPARAM lParam)
  121. {
  122. OnBeginHook(nMsg, xtpSkinDefaultHookMessage, 0, 0);
  123. LRESULT lResult = DefWindowProc(nMsg, wParam, lParam);
  124. OnEndHook();
  125. return lResult;
  126. }
  127. LRESULT CXTPSkinObject::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
  128. {
  129. if (m_arrDescriptors.IsEmpty())
  130. return ::CallWindowProc(m_pOldWndProc, m_hWnd, nMsg, wParam, lParam);
  131. DEFWINDOW_DESCRIPTIOR& des = m_arrDescriptors.GetHead();
  132. if (des.defProc == xtpSkinDefaultHookMessage)
  133. return ::CallWindowProc(m_pOldWndProc, m_hWnd, nMsg, wParam, lParam);
  134. if (des.defProc == xtpSkinDefaultCallWindowProc)
  135. {
  136. ASSERT(des.lpPrev);
  137. ASSERT(des.defProcAddr);
  138. typedef LRESULT (WINAPI* LPFNCALLWINDOWPROC)(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  139. return ((LPFNCALLWINDOWPROC)des.defProcAddr)((WNDPROC)des.lpPrev, m_hWnd, nMsg, wParam, lParam);
  140. }
  141. if (des.defProc == xtpSkinDefaultDefWindowProc || des.defProc == xtpSkinDefaultDefMDIChildProc || des.defProc == xtpSkinDefaultDefDlgProc)
  142. {
  143. ASSERT(des.defProcAddr);
  144. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  145. return ((LPFNDEFWINDOWPROC)des.defProcAddr)(m_hWnd, nMsg, wParam, lParam);
  146. }
  147. if (des.defProc == xtpSkinDefaultDefFrameProc)
  148. {
  149. ASSERT(des.defProcAddr);
  150. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, HWND hWndMDIClient, UINT Msg, WPARAM wParam, LPARAM lParam);
  151. return ((LPFNDEFWINDOWPROC)des.defProcAddr)(m_hWnd, (HWND)des.lpPrev, nMsg, wParam, lParam);
  152. }
  153. return 0;
  154. }
  155. void CXTPSkinObject::AttachHook(HWND hWnd, LPCREATESTRUCT lpcs, BOOL bAuto)
  156. {
  157. m_hWnd = hWnd;
  158. m_bUnicode = IsWindowUnicode(hWnd);
  159. BOOL bWindowsForms = m_bWindowsForms;
  160. if (m_bUnicode)
  161. {
  162. m_pOldWndProc = (WNDPROC)GetWindowLongPtrW(hWnd, GWLP_WNDPROC);
  163. if (!bWindowsForms) SetWindowLongPtrW(hWnd, GWLP_WNDPROC, (DWORD_PTR)CXTPSkinManager::HookWndProc);
  164. }
  165. else
  166. {
  167. m_pOldWndProc = (WNDPROC)GetWindowLongPtrA(hWnd, GWLP_WNDPROC);
  168. if (!bWindowsForms) SetWindowLongPtrA(hWnd, GWLP_WNDPROC, (DWORD_PTR)CXTPSkinManager::HookWndProc);
  169. }
  170. if (CXTPSkinManagerApiHook::IsSystemWindowModule(m_pOldWndProc))
  171. {
  172. m_wndDefProcAddr = 0;
  173. }
  174. OnHookAttached(lpcs, bAuto);
  175. }
  176. CXTPSkinManagerClass* CXTPSkinObject::GetSkinClass() const
  177. {
  178. return GetSkinManager()->GetSkinClass(m_strClassName);
  179. }
  180. CXTPSkinManagerMetrics* CXTPSkinObject::GetMetrics() const
  181. {
  182. return GetSkinManager()->GetMetrics();
  183. }
  184. COLORREF CXTPSkinObject::GetColor(int nIndex) const
  185. {
  186. return GetMetrics()->GetColor(nIndex);
  187. }
  188. void CXTPSkinObject::OnSkinChanged(BOOL /*bPrevState*/, BOOL /*bNewState*/)
  189. {
  190. RefreshMetrics();
  191. }
  192. void CXTPSkinObject::OnHookAttached(LPCREATESTRUCT /*lpcs*/, BOOL /*bAuto*/)
  193. {
  194. m_bCustomDraw = CWnd::FromHandlePermanent(m_hWnd) ? SendMessage(m_nMsgQuerySkinState) != 0 : FALSE;
  195. RefreshMetrics();
  196. }
  197. void CXTPSkinObject::OnHookDetached(BOOL /*bAuto*/)
  198. {
  199. }
  200. void CXTPSkinObject::RefreshMetrics()
  201. {
  202. }
  203. BOOL CXTPSkinObject::IsDefWindowProcAvail(int nMessage) const
  204. {
  205. if (nMessage == WM_TIMER)
  206. return FALSE;
  207. if (m_wndDefProcAddr == 0)
  208. return FALSE;
  209. if (!m_pManager->IsWin9x())
  210. return TRUE;
  211. return ((DWORD_PTR)m_pOldWndProc < (DWORD_PTR)m_wndDefProcAddr) || (m_pOldWndProc == CXTPSkinManagerApiFunction::sm_pfnAfxWndProc);
  212. }
  213. BOOL CXTPSkinObject::PreHookMessage(UINT nMessage)
  214. {
  215. if (nMessage == WM_SETCURSOR || nMessage == WM_NOTIFY|| nMessage == WM_COMMAND || nMessage == WM_ACTIVATE)
  216. return TRUE;
  217. if (nMessage == m_nMsgUpdateSkinState)
  218. {
  219. m_bCustomDraw = SendMessage(m_nMsgQuerySkinState) != 0;
  220. }
  221. return FALSE;
  222. }
  223. BOOL CXTPSkinObject::OnHookDefWindowProc(UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult)
  224. {
  225. if (PreHookMessage(nMessage))
  226. return FALSE;
  227. if (nMessage == m_nMsgQuerySkinState)
  228. {
  229. lResult = 0;
  230. return TRUE;
  231. }
  232. if (OnWndMsg(nMessage, wParam, lParam, &lResult))
  233. {
  234. return TRUE;
  235. }
  236. return FALSE;
  237. }
  238. BOOL CXTPSkinObject::OnHookMessage(UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult)
  239. {
  240. if (PreHookMessage(nMessage))
  241. return FALSE;
  242. if (IsDefWindowProcAvail(nMessage))
  243. return FALSE;
  244. if (OnWndMsg(nMessage, wParam, lParam, &lResult))
  245. {
  246. return TRUE;
  247. }
  248. return FALSE;
  249. }
  250. //////////////////////////////////////////////////////////////////////
  251. // CXTPSkinManager
  252. void CXTPSkinManager::ApplyWindow(HWND hWnd)
  253. {
  254. if (Lookup(hWnd))
  255. return;
  256. TCHAR lpszClassName[50];
  257. GetClassName(hWnd, lpszClassName, 50);
  258. CREATESTRUCT cs;
  259. ZeroMemory(&cs, sizeof(cs));
  260. cs.dwExStyle = (DWORD)GetWindowLongPtr(hWnd, GWL_EXSTYLE);
  261. cs.style = (LONG)GetWindowLongPtr(hWnd, GWL_STYLE);
  262. cs.hwndParent = ::GetParent(hWnd);
  263. cs.lpszClass = lpszClassName;
  264. CXTPSkinObject* pSkinObject = SetHook(hWnd, lpszClassName, &cs, FALSE);
  265. if (pSkinObject)
  266. {
  267. pSkinObject->OnSkinChanged(FALSE, m_bEnabled);
  268. }
  269. hWnd = ::GetWindow(hWnd, GW_CHILD);
  270. while (hWnd)
  271. {
  272. ApplyWindow(hWnd);
  273. hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
  274. }
  275. }
  276. BOOL CALLBACK CXTPSkinManager::EnumWindowsProcNetBroadcast(HWND hWnd, LPARAM /*lParam*/)
  277. {
  278. DWORD dwProcessId = 0;
  279. if (GetWindowThreadProcessId(hWnd, &dwProcessId) && dwProcessId == GetCurrentProcessId())
  280. {
  281. ::PostMessage(hWnd, WM_SYSCOLORCHANGE, 0, 0);
  282. }
  283. return TRUE;
  284. }
  285. void CXTPSkinManager::OnSkinChanged(BOOL bPrevState, BOOL bNewState)
  286. {
  287. HWND hWnd;
  288. POSITION pos = m_mapObjects.GetStartPosition();
  289. CXTPSkinObject* pSink;
  290. EnumWindows(EnumWindowsProcNetBroadcast, 0);
  291. while (pos)
  292. {
  293. m_mapObjects.GetNextAssoc(pos, hWnd, pSink);
  294. if (::IsWindow(hWnd))
  295. {
  296. pSink->OnSkinChanged(bPrevState, bNewState);
  297. }
  298. else
  299. {
  300. Remove(hWnd);
  301. }
  302. }
  303. }
  304. CXTPSkinObject* CXTPSkinManager::Lookup(HWND hWnd)
  305. {
  306. CXTPLockGuard lock(m_csObjects);
  307. CXTPSkinObject* pSink;
  308. if (m_mapObjects.Lookup(hWnd, pSink))
  309. return pSink;
  310. return NULL;
  311. }
  312. #ifndef OBJID_WINDOW
  313. #define OBJID_WINDOW 0x00000000
  314. #endif
  315. #ifndef EVENT_OBJECT_REORDER
  316. #define EVENT_OBJECT_REORDER 0x8004
  317. #endif
  318. void CALLBACK CXTPSkinManager::WinEventProc(HWINEVENTHOOK /*hWinEventHook*/,
  319. DWORD event, HWND hWnd, LONG idObject, LONG /*idChild*/, DWORD /*dwEventThread*/, DWORD /*dwmsEventTime*/)
  320. {
  321. if (event == EVENT_OBJECT_REORDER && idObject == OBJID_WINDOW && (XTPSkinManager()->GetApplyOptions() & xtpSkinApplyFrame)
  322. && XTPSkinManager()->IsEnabled())
  323. {
  324. CXTPSkinObjectFrame* pFrame = (CXTPSkinObjectFrame*)XTPSkinManager()->Lookup(hWnd);
  325. if (pFrame)
  326. {
  327. DWORD dwStyle = pFrame->GetStyle();
  328. DWORD dwStyleRemove = (WS_CAPTION | WS_VSCROLL | WS_HSCROLL);
  329. if (dwStyle & dwStyleRemove)
  330. {
  331. pFrame->SetTimer(XTP_TID_REFRESHFRAME, 1000, NULL);
  332. }
  333. }
  334. }
  335. return;
  336. }
  337. BOOL CXTPSkinObject::IsSkinEnabled() const
  338. {
  339. return !m_bCustomDraw && m_hWnd && m_pManager->IsEnabled();
  340. }
  341. #define PSH_WIZARD97IE4            0x00002000
  342. #define PSH_WIZARD97IE5            0x01000000
  343. #ifndef DWLP_USER
  344. #define DWLP_USER 8
  345. #endif
  346. AFX_INLINE BOOL IsTabPage(LPCREATESTRUCT lpcs)
  347. {
  348. if (!lpcs || !lpcs->hwndParent)
  349. return FALSE;
  350. if (!((lpcs->style & DS_CONTROL) && (lpcs->style & WS_CHILD)))
  351. return FALSE;
  352. CXTPSkinObjectFrame* pParent = (CXTPSkinObjectFrame*)XTPSkinManager()->Lookup(lpcs->hwndParent);
  353. if (pParent && pParent->m_dwDialogTexture == ETDT_ENABLETAB)
  354. return TRUE;
  355. HWND hwndTabControl = (HWND)::SendMessage(lpcs->hwndParent, PSM_GETTABCONTROL, 0, 0);
  356. if (!hwndTabControl || !::IsWindow(hwndTabControl))
  357. return FALSE;
  358. HWND* ppd = (HWND*)GetWindowLongPtr(lpcs->hwndParent, DWLP_USER);
  359. if (!ppd || *ppd != lpcs->hwndParent)
  360. return FALSE;
  361. PROPSHEETHEADER* psh = (PROPSHEETHEADER*)(ppd + 1);
  362. if (!psh)
  363. return FALSE;
  364. if ((psh->dwFlags & (PSH_WIZARD | PSH_WIZARD97IE4 | PSH_WIZARD97IE5)) != 0)
  365. return FALSE;
  366. return TRUE;
  367. }
  368. CXTPSkinObject* CXTPSkinManager::SetHook(HWND hWnd, LPCTSTR lpszClassName, LPCREATESTRUCT lpcs, BOOL bAuto)
  369. {
  370. if (_tcscmp(lpszClassName, _T("tooltips_class32")) == 0)
  371. return NULL;
  372. if (_tcsicmp(lpszClassName, _T("IME")) == 0)
  373. return NULL;
  374. CXTPSkinObject* pSink = NULL;
  375. if (pSink == NULL && _tcsstr(lpszClassName, _T("WindowsForms")) != NULL)
  376. {
  377. CString strClass(lpszClassName);
  378. int nClassNameStart = strClass.Find(_T('.'));
  379. int nClassNameEnd = FIND_S(strClass, _T('.'), nClassNameStart + 1);
  380. if (nClassNameStart != -1 && nClassNameEnd != -1 && nClassNameEnd != nClassNameStart)
  381. {
  382. strClass = strClass.Mid(nClassNameStart + 1, nClassNameEnd - nClassNameStart - 1);
  383. CXTPSkinObjectClassInfo* pInfo = m_pClassMap->Lookup(strClass);
  384. if (pInfo)
  385. {
  386. pSink = pInfo->CreateObject(lpszClassName, lpcs);
  387. }
  388. }
  389. if (pSink == NULL)
  390. {
  391. pSink = new CXTPSkinObjectFrame();
  392. }
  393. pSink->m_bWindowsForms = TRUE;
  394. }
  395. if (pSink == NULL)
  396. {
  397. CXTPSkinObjectClassInfo* pInfo = m_pClassMap->Lookup(lpszClassName);
  398. if (pInfo)
  399. {
  400. pSink = pInfo->CreateObject(lpszClassName, lpcs);
  401. }
  402. else
  403. {
  404. if (_tcsstr(lpszClassName, _T("Internet Explorer")) != NULL)
  405. return NULL;
  406. if (_tcsstr(lpszClassName, _T("OleMainThread")) != NULL)
  407. return NULL;
  408. pSink = new CXTPSkinObjectFrame();
  409. }
  410. }
  411. if (pSink && _tcscmp(lpszClassName, _T("#32770")) == 0)
  412. {
  413. ((CXTPSkinObjectFrame*)pSink)->m_dwDialogTexture = IsTabPage(lpcs) ? ETDT_ENABLETAB : ETDT_ENABLE;
  414. }
  415. if (pSink)
  416. {
  417. pSink->m_pManager = this;
  418. {
  419. CXTPLockGuard lock(m_csObjects);
  420. m_mapObjects[hWnd] = pSink;
  421. }
  422. pSink->AttachHook(hWnd, lpcs, bAuto);
  423. }
  424. return pSink;
  425. }
  426. void CXTPSkinManager::Remove(HWND hWnd)
  427. {
  428. Remove(hWnd, FALSE);
  429. }
  430. void CXTPSkinManager::Remove(HWND hWnd, BOOL bAuto)
  431. {
  432. CXTPSkinObject* pSink = Lookup(hWnd);
  433. if (pSink)
  434. {
  435. {
  436. CXTPLockGuard lock(m_csObjects);
  437. m_mapObjects.RemoveKey(hWnd);
  438. }
  439. pSink->UnattachHook(bAuto);
  440. #ifdef _AFXDLL
  441. pSink->m_pModuleState = AfxGetModuleState();
  442. #endif
  443. pSink->InternalRelease();
  444. }
  445. }
  446. void CXTPSkinManager::RemoveAll(BOOL bUnattach)
  447. {
  448. CXTPLockGuard lock(m_csObjects);
  449. HWND hWnd;
  450. POSITION pos = m_mapObjects.GetStartPosition();
  451. CXTPSkinObject* pSink;
  452. while (pos)
  453. {
  454. m_mapObjects.GetNextAssoc(pos, hWnd, pSink);
  455. if (bUnattach) pSink->UnattachHook(FALSE);
  456. #ifdef _AFXDLL
  457. pSink->m_pModuleState = AfxGetModuleState();
  458. #endif
  459. pSink->InternalRelease();
  460. }
  461. m_mapObjects.RemoveAll();
  462. }
  463. void CXTPSkinObject::OnBeginHook(UINT nMessage, XTPSkinDefaultProc defProc, PROC defProcAddr, LPVOID defProcPrevWndFunc)
  464. {
  465. InternalAddRef();
  466. CXTPLockGuard lock(m_csDescriptors);
  467. DEFWINDOW_DESCRIPTIOR des;
  468. des.defProc = defProc;
  469. des.nMessage = nMessage;
  470. des.defProcAddr = defProcAddr;
  471. des.lpPrev = defProcPrevWndFunc;
  472. m_arrDescriptors.AddHead(des);
  473. }
  474. void CXTPSkinObject::OnEndHook()
  475. {
  476. {
  477. CXTPLockGuard lock(m_csDescriptors);
  478. m_arrDescriptors.RemoveHead();
  479. }
  480. InternalRelease();
  481. }
  482. UINT CXTPSkinObject::GetHeadMessage()
  483. {
  484. CXTPLockGuard lock(m_csDescriptors);
  485. if (!m_arrDescriptors.IsEmpty())
  486. {
  487. return m_arrDescriptors.GetHead().nMessage;
  488. }
  489. return WM_NULL;
  490. }
  491. LRESULT CALLBACK CXTPSkinManager::DoCallWindowProc(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  492. {
  493. return CXTPSkinManagerApiHook::CallWindowProcOrig(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
  494. }
  495. LRESULT CALLBACK CXTPSkinManager::HookWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  496. {
  497. // Get hook object for this window. Get from hook map
  498. CXTPSkinObject* pSink = XTPSkinManager()->Lookup(hWnd);
  499. if (!pSink)
  500. return 0;
  501. LRESULT lResult = 0;
  502. WNDPROC wndProc = pSink->m_pOldWndProc;
  503. if (!pSink->GetSkinManager()->m_bEnabled)
  504. {
  505. if (message == WM_NCDESTROY)
  506. {
  507. pSink->GetSkinManager()->Remove(hWnd, TRUE);
  508. }
  509. return ::CallWindowProc(wndProc, hWnd, message, wParam, lParam);
  510. }
  511. MSG& curMsg = AfxGetThreadState()->m_lastSentMsg;
  512. MSG  oldMsg = curMsg;
  513. curMsg.hwnd = hWnd;
  514. curMsg.message = message;
  515. curMsg.wParam  = wParam;
  516. curMsg.lParam  = lParam;
  517. BOOL bCallWindowProc = TRUE;
  518. // Window is being destroyed: unhook all hooks (for this window)
  519. // and pass message to orginal window proc
  520. if (message == WM_NCDESTROY)
  521. {
  522. pSink->GetSkinManager()->Remove(hWnd, TRUE);
  523. }
  524. // pass to message hook
  525. else if (!pSink->m_bCustomDraw || message == CXTPSkinObject::m_nMsgUpdateSkinState)
  526. {
  527. pSink->OnBeginHook(message, xtpSkinDefaultHookMessage, 0, 0);
  528. if (pSink->OnHookMessage(message, wParam, lParam, lResult))
  529. {
  530. bCallWindowProc = FALSE;
  531. }
  532. pSink->OnEndHook();
  533. }
  534. if (bCallWindowProc)
  535. {
  536. lResult = DoCallWindowProc(wndProc, hWnd, message, wParam, lParam);
  537. }
  538. curMsg = oldMsg;
  539. return lResult;
  540. }
  541. //////////////////////////////////////////////////////////////////////////
  542. // CXTPSkinObjectClassInfo
  543. CXTPSkinObjectClassInfo::CXTPSkinObjectClassInfo(CRuntimeClass* pClass)
  544. {
  545. m_pMap = NULL;
  546. m_pClass = pClass;
  547. }
  548. CXTPSkinObject* CXTPSkinObjectClassInfo::CreateObject(LPCTSTR /*lpszClassName*/, LPCREATESTRUCT /*lpcs*/)
  549. {
  550. if (!m_pClass)
  551. return NULL;
  552. return (CXTPSkinObject*)m_pClass->CreateObject();
  553. }
  554. void CXTPSkinObjectClassInfo::AddClass(LPCTSTR lpszClassName)
  555. {
  556. m_pMap->AddClass(lpszClassName, this);
  557. }
  558. void CXTPSkinObjectClassInfo::Remove()
  559. {
  560. m_pMap->RemoveClass(this);
  561. }
  562. //////////////////////////////////////////////////////////////////////////
  563. // CXTPSkinObjectClassMap
  564. CXTPSkinObjectClassMap::CXTPSkinObjectClassMap()
  565. {
  566. }
  567. CXTPSkinObjectClassMap::~CXTPSkinObjectClassMap()
  568. {
  569. RemoveAll();
  570. }
  571. #define RUNTIME_CLASS_INFO(x) new CXTPSkinObjectClassInfo(RUNTIME_CLASS(x))
  572. #define RUNTIME_CLASS_INFOACTIVEX(x) new CXTPSkinObjectClassInfoActiveX(RUNTIME_CLASS(x), TRUE)
  573. #define RUNTIME_CLASS_INFOACTIVEX_DEF(x) new CXTPSkinObjectClassInfoActiveX(RUNTIME_CLASS(x), FALSE)
  574. void CXTPSkinObjectClassMap::AddStandardClasses()
  575. {
  576. AddClass(_T("ComboBox"), RUNTIME_CLASS_INFO(CXTPSkinObjectComboBox));
  577. AddClass(_T("Edit"), RUNTIME_CLASS_INFO(CXTPSkinObjectEdit));
  578. AddClass(_T("SysDateTimePick32"), RUNTIME_CLASS_INFO(CXTPSkinObjectDateTime));
  579. AddClass(_T("SysMonthCal32"), RUNTIME_CLASS_INFO(CXTPSkinObjectMonthCal));
  580. AddClass(_T("ListBox"), RUNTIME_CLASS_INFO(CXTPSkinObjectListBox));
  581. AddSynonymClass(_T("ComboLBox"), _T("ListBox"));
  582. AddClass(_T("ScrollBar"), RUNTIME_CLASS_INFO(CXTPSkinObjectScrollBar));
  583. AddSynonymClass(_T("ATL:ScrollBar"), _T("ScrollBar"));
  584. AddClass(_T("SysListView32"), RUNTIME_CLASS_INFO(CXTPSkinObjectListView));
  585. AddClass(_T("SysHeader32"), RUNTIME_CLASS_INFO(CXTPSkinObjectHeader));
  586. AddClass(_T("msctls_statusbar32"), RUNTIME_CLASS_INFO(CXTPSkinObjectStatusBar));
  587. AddClass(_T("SysTreeView32"), RUNTIME_CLASS_INFO(CXTPSkinObjectTreeView));
  588. AddClass(_T("msctls_progress32"), RUNTIME_CLASS_INFO(CXTPSkinObjectProgress));
  589. AddClass(_T("msctls_trackbar32"), RUNTIME_CLASS_INFO(CXTPSkinObjectTrackBar));
  590. AddClass(_T("SysTabControl32"), RUNTIME_CLASS_INFO(CXTPSkinObjectTab));
  591. AddClass(_T("MDIClient"), RUNTIME_CLASS_INFO(CXTPSkinObjectMDIClient));
  592. AddClass(_T("msctls_updown32"), RUNTIME_CLASS_INFO(CXTPSkinObjectSpin));
  593. AddClass(_T("ToolbarWindow32"), RUNTIME_CLASS_INFO(CXTPSkinObjectToolBar));
  594. AddClass(_T("Button"), RUNTIME_CLASS_INFO(CXTPSkinObjectButton));
  595. AddSynonymClass(_T("TButton"), _T("Button"));
  596. AddSynonymClass(_T("TEdit"), _T("Edit"));
  597. AddSynonymClass(_T("TMemo"), _T("Edit"));
  598. AddSynonymClass(_T("TNewProgressBar"), _T("msctls_progress32"));
  599. AddSynonymClass(_T("TRichEditViewer"), _T("Edit"));
  600. AddSynonymClass(_T("TRadioButton"), _T("Button"));
  601. AddSynonymClass(_T("TCheckBox"), _T("Button"));
  602. AddSynonymClass(_T("TComboBox"), _T("ComboBox"));
  603. AddSynonymClass(_T("TGroupBox"), _T("Button"));
  604. AddSynonymClass(_T("TScrollBar"), _T("ScrollBar"));
  605. AddSynonymClass(_T("TProgressBar"), _T("msctls_progress32"));
  606. AddSynonymClass(_T("TTrackBar"), _T("msctls_trackbar32"));
  607. AddSynonymClass(_T("TTabControl"), _T("SysTabControl32"));
  608. AddSynonymClass(_T("TTreeView"), _T("SysTreeView32"));
  609. AddSynonymClass(_T("TListView"), _T("SysListView32"));
  610. AddSynonymClass(_T("TListBox"), _T("ListBox"));
  611. if (XTPSystemVersion()->IsWin95() || XTPSystemVersion()->IsWinNT4())
  612. AddClass(_T("#32768"), new CXTPSkinObjectClassInfo(NULL));
  613. else
  614. AddClass(_T("#32768"), RUNTIME_CLASS_INFO(CXTPSkinObjectMenu));
  615. AddClass(_T("SysPager"), new CXTPSkinObjectClassInfo(NULL));
  616. }
  617. void CXTPSkinObjectClassMap::AddSynonymClass(LPCTSTR lpszClassNameSynonym, LPCTSTR lpszClassName)
  618. {
  619. if (Lookup(lpszClassNameSynonym))
  620. return;
  621. if (lpszClassName == NULL || *lpszClassName == 0)
  622. {
  623. AddClass(lpszClassNameSynonym, new CXTPSkinObjectClassInfo(NULL));
  624. return;
  625. }
  626. CXTPSkinObjectClassInfo* pInfo = Lookup(lpszClassName);
  627. ASSERT(pInfo);
  628. if (!pInfo)
  629. return;
  630. AddClass(lpszClassNameSynonym, pInfo);
  631. }
  632. CXTPSkinObjectClassInfo* CXTPSkinObjectClassMap::AddClass(LPCTSTR lpszClassName, CXTPSkinObjectClassInfo* pInfo)
  633. {
  634. CString strClassName(lpszClassName);
  635. strClassName.MakeUpper();
  636. ASSERT(Lookup(strClassName) == NULL);
  637. m_mapInfo.SetAt(strClassName, pInfo);
  638. if (pInfo->m_pMap == 0)
  639. {
  640. pInfo->m_pMap = this;
  641. }
  642. else
  643. {
  644. ASSERT(pInfo->m_pMap == this);
  645. pInfo->InternalAddRef();
  646. }
  647. return pInfo;
  648. }
  649. void CXTPSkinObjectClassMap::RemoveClass(LPCTSTR lpszClassName)
  650. {
  651. CString strClassName(lpszClassName);
  652. strClassName.MakeUpper();
  653. CXTPSkinObjectClassInfo* pInfo = Lookup(strClassName);
  654. if (!pInfo)
  655. return;
  656. m_mapInfo.RemoveKey(strClassName);
  657. pInfo->InternalRelease();
  658. }
  659. void CXTPSkinObjectClassMap::RemoveClass(CXTPSkinObjectClassInfo* pInfo)
  660. {
  661. POSITION pos = m_mapInfo.GetStartPosition();
  662. CString strClassName;
  663. void* p;
  664. while (pos)
  665. {
  666. m_mapInfo.GetNextAssoc(pos, strClassName, p);
  667. if (p == pInfo)
  668. {
  669. m_mapInfo.RemoveKey(strClassName);
  670. pInfo->InternalRelease();
  671. }
  672. }
  673. }
  674. void CXTPSkinObjectClassMap::RemoveAll()
  675. {
  676. POSITION pos = m_mapInfo.GetStartPosition();
  677. CString strClassName;
  678. CXTPSkinObjectClassInfo* pInfo;
  679. while (pos)
  680. {
  681. m_mapInfo.GetNextAssoc(pos, strClassName, (void*&)pInfo);
  682. pInfo->InternalRelease();
  683. }
  684. m_mapInfo.RemoveAll();
  685. }
  686. CXTPSkinObjectClassInfo* CXTPSkinObjectClassMap::Lookup(LPCTSTR lpszClassName)
  687. {
  688. CString strClassName(lpszClassName);
  689. strClassName.MakeUpper();
  690. void* pInfo;
  691. if (!m_mapInfo.Lookup(strClassName, pInfo))
  692. return NULL;
  693. return (CXTPSkinObjectClassInfo*)pInfo;
  694. }