app3d.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef AFX_INIT_SEG
  12. #pragma code_seg(AFX_INIT_SEG)
  13. #endif
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. /////////////////////////////////////////////////////////////////////////////
  19. // _AFX_CTL3D_STATE
  20. #ifndef _AFX_NO_CTL3D_SUPPORT
  21. _AFX_CTL3D_STATE::~_AFX_CTL3D_STATE()
  22. {
  23. if (m_pfnUnregister != NULL)
  24. (*m_pfnUnregister)(NULL);
  25. if (m_hCtl3dLib != NULL)
  26. ::FreeLibrary(m_hCtl3dLib);
  27. }
  28. _AFX_CTL3D_THREAD::~_AFX_CTL3D_THREAD()
  29. {
  30. _AFX_CTL3D_STATE* pCtl3dState = _afxCtl3dState.GetDataNA();
  31. if (pCtl3dState != NULL && pCtl3dState->m_pfnUnAutoSubclass != NULL)
  32. (*pCtl3dState->m_pfnUnAutoSubclass)();
  33. }
  34. /////////////////////////////////////////////////////////////////////////////
  35. // Support for CTL3D32.DLL (3D controls DLL)
  36. BOOL CWinApp::Enable3dControls()
  37. {
  38. ASSERT(!afxContextIsDLL); // Should only be called by apps
  39. // 3d controls and dialogs are automatic on newer versions of Windows
  40. if (afxData.bWin4)
  41. return TRUE;
  42. // otherwise, attempt to load CTL3D32.DLL
  43. _AFX_CTL3D_STATE* pCtl3dState = _afxCtl3dState.GetData();
  44. if (!pCtl3dState->m_bCtl3dInited)
  45. {
  46. pCtl3dState->m_hCtl3dLib = ::LoadLibraryA("CTL3D32.DLL");
  47. if (pCtl3dState->m_hCtl3dLib != NULL)
  48. {
  49. // get address of Ctl3d functions
  50. (FARPROC&)pCtl3dState->m_pfnRegister =
  51. GetProcAddress(pCtl3dState->m_hCtl3dLib, (LPCSTR)12);
  52. (FARPROC&)pCtl3dState->m_pfnUnregister =
  53. GetProcAddress(pCtl3dState->m_hCtl3dLib, (LPCSTR)13);
  54. (FARPROC&)pCtl3dState->m_pfnAutoSubclass =
  55. GetProcAddress(pCtl3dState->m_hCtl3dLib, (LPCSTR)16);
  56. (FARPROC&)pCtl3dState->m_pfnUnAutoSubclass =
  57. GetProcAddress(pCtl3dState->m_hCtl3dLib, (LPCSTR)24);
  58. (FARPROC&)pCtl3dState->m_pfnColorChange =
  59. GetProcAddress(pCtl3dState->m_hCtl3dLib, (LPCSTR)6);
  60. (FARPROC&)pCtl3dState->m_pfnSubclassDlgEx =
  61. GetProcAddress(pCtl3dState->m_hCtl3dLib, (LPCSTR)21);
  62. (FARPROC&)pCtl3dState->m_pfnWinIniChange =
  63. GetProcAddress(pCtl3dState->m_hCtl3dLib, (LPCSTR)22);
  64. (FARPROC&)pCtl3dState->m_pfnSubclassCtl =
  65. GetProcAddress(pCtl3dState->m_hCtl3dLib, (LPCSTR)3);
  66. (FARPROC&)pCtl3dState->m_pfnSubclassCtlEx =
  67. GetProcAddress(pCtl3dState->m_hCtl3dLib, (LPCSTR)25);
  68. }
  69. // may be incorrect version -- check for errors
  70. if (pCtl3dState->m_pfnRegister == NULL ||
  71. pCtl3dState->m_pfnAutoSubclass == NULL ||
  72. pCtl3dState->m_pfnColorChange == NULL ||
  73. pCtl3dState->m_pfnSubclassDlgEx == NULL ||
  74. pCtl3dState->m_pfnUnregister == NULL ||
  75. !pCtl3dState->m_pfnRegister(AfxGetInstanceHandle()))
  76. {
  77. // don't want to be partially initialized
  78. pCtl3dState->m_pfnRegister = NULL;
  79. pCtl3dState->m_pfnUnregister = NULL;
  80. pCtl3dState->m_pfnAutoSubclass = NULL;
  81. pCtl3dState->m_pfnUnAutoSubclass = NULL;
  82. pCtl3dState->m_pfnColorChange = NULL;
  83. pCtl3dState->m_pfnSubclassDlgEx = NULL;
  84. pCtl3dState->m_pfnWinIniChange = NULL;
  85. pCtl3dState->m_pfnSubclassCtl = NULL;
  86. pCtl3dState->m_pfnSubclassCtlEx = NULL;
  87. // only try once -- but return FALSE
  88. if (pCtl3dState->m_hCtl3dLib != NULL)
  89. {
  90. ::FreeLibrary(pCtl3dState->m_hCtl3dLib);
  91. pCtl3dState->m_hCtl3dLib = NULL;
  92. }
  93. }
  94. pCtl3dState->m_bCtl3dInited = TRUE;
  95. }
  96. // check that library was loaded and all entry-points were found
  97. if (pCtl3dState->m_hCtl3dLib == NULL)
  98. return FALSE;
  99. // turn on auto subclassing (for primary thread)
  100. return (*pCtl3dState->m_pfnAutoSubclass)(AfxGetInstanceHandle());
  101. }
  102. _AFX_CTL3D_STATE* AFXAPI AfxGetCtl3dState()
  103. {
  104. return _afxCtl3dState.GetData();
  105. }
  106. #pragma warning(disable: 4074)
  107. #pragma init_seg(lib)
  108. THREAD_LOCAL(_AFX_CTL3D_THREAD, _afxCtl3dThread)
  109. PROCESS_LOCAL(_AFX_CTL3D_STATE, _afxCtl3dState)
  110. #endif //!_AFX_NO_CTL3D_SUPPORT
  111. /////////////////////////////////////////////////////////////////////////////