ExtPopupMenuWnd.cpp
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:735k
源码类别:

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "stdafx.h"
  22. #define _AFX_NO_OLE_SUPPORT
  23. #ifndef __AFXPRIV_H__
  24. #include <AfxPriv.h>
  25. #endif
  26. #if _MFC_VER < 0x700
  27. #include <../src/AfxImpl.h>
  28. #else
  29. #include <../src/mfc/AfxImpl.h>
  30. #endif
  31. #include <math.h>
  32. #if (!defined __EXT_POPUP_MENU_WND_H)
  33. #include <ExtPopupMenuWnd.h>
  34. #endif
  35. #if (!defined __EXT_MFC_NO_CUSTOMIZE) || (!defined __EXT_MFC_NO_DATE_PICKER_POPUP) || (!defined __EXT_MFC_NO_UNDO_REDO_POPUP) || (!defined __EXT_MFC_NO_GRIDBASEWND)
  36. #if (!defined __EXT_POPUP_CTRL_MENU_H)
  37. #include <ExtPopupCtrlMenu.h>
  38. #endif
  39. #endif
  40. #if (!defined __EXT_MENUCONTROLBAR_H)
  41. #include <ExtMenuControlBar.h>
  42. #endif
  43. #if (!defined __EXT_PAINT_MANAGER_H)
  44. #include <ExtPaintManager.h>
  45. #endif
  46. #if (!defined __ExtCmdManager_H)
  47. #include <ExtCmdManager.h>
  48. #endif
  49. #if (!defined __EXT_MEMORY_DC_H)
  50. #include <../Src/ExtMemoryDC.h>
  51. #endif
  52. #if (!defined __EXT_LOCALIZATION_H)
  53. #include <../Src/ExtLocalization.h>
  54. #endif
  55. #if (!defined __EXT_BUTTON_H)
  56. #include <ExtButton.h>
  57. #endif
  58. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  59. #if (!defined __EXT_RIBBON_BAR_H)
  60. #include <ExtRibbonBar.h>
  61. #endif // (!defined __EXT_RIBBON_BAR_H)
  62. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  63. #if (!defined __EXT_SCROLLWND_H)
  64. #include <ExtScrollWnd.h>
  65. #endif 
  66. #include <Resources/Resource.h>
  67. //#define _DEBUG_TEAROFF_TRANSPARENCY
  68. #define __WM_START_RESIZING (WM_USER+98)
  69. #ifdef _DEBUG
  70. #define new DEBUG_NEW
  71. #undef THIS_FILE
  72. static char THIS_FILE[] = __FILE__;
  73. #endif
  74. #if (!defined __EXT_MFC_WINMMDLL_ALREADY_DYN_LIKNED)
  75. #define __EXT_MFC_WINMMDLL_ALREADY_DYN_LIKNED
  76. #pragma message("   Prof-UIS is automatically linking with winmm.lib")
  77. #pragma message("      (Windows Multimedia System)")
  78. #pragma comment( lib, "winmm.lib" ) 
  79. #endif
  80. #ifdef _DEBUG
  81. static int g_nPopupCount = 0;
  82. //#define __VPC_VERIFY_0 ASSERT( g_nPopupCount == 0 )
  83. #define __VPC_VERIFY_0 { }
  84. #define __VPC_INC g_nPopupCount++
  85. #define __VPC_DEC g_nPopupCount--
  86. #else // _DEBUG
  87. #define __VPC_VERIFY_0 { }
  88. #define __VPC_INC { }
  89. #define __VPC_DEC { }
  90. #endif // _DEBUG
  91. #define ID_TIMER_ITEM_HIDE_DELAY 664
  92. #define ID_TIMER_ANIMATION 666
  93. #define ID_PERIOD_ANIMATION 30 // 20
  94. #define ID_TIMER_ITEM_FOCUS_DELAY 667
  95. #define ID_TIMER_SCROLLING 668
  96. #define ID_PERIOD_SCROLLING 50 // 15
  97. #define ID_TIMER_DELAY_SHOW 669
  98. #define ID_PERIOD_DELAY_SHOW_QUICK 20
  99. #define ID_PERIOD_DELAY_SHOW_NORMAL 500
  100. #define ID_PERIOD_DELAY_SHOW_RIBBON 900
  101. #define ID_TIMER_DELAY_EXPAND 670
  102. #define ID_FREQ_DELAY_EXPAND 50
  103. #define ID_TOTAL_DELAY_EXPAND 1500
  104. #define ID_TIMER_DELAY_KILL 671
  105. #define ID_PERIOD_DELAY_KILL 200
  106. #define ID_TIMER_DELAY_PAINT 672
  107. #define ID_TIMER_LIFE_STEP 673
  108. #define ID_PERIOD_LIFE_STEP 200
  109. #define ID_TIMER_FADE_OUT_ANIMATION 674
  110. #define ID_TIMER_AUTO_EXPAND 675
  111. #define __SCROLLING_PIXEL_STEP 5
  112. static const int g_nAnimStepMetric = 20;
  113. static clock_t g_nLastAnimTime = 0;
  114. #define __ANIM_CY 15
  115. #define __EXCLUDE_AREA_GAP_DX 3
  116. #define __EXCLUDE_AREA_GAP_DY __EXCLUDE_AREA_GAP_DX
  117. #define __BOX_ANIM_METRIC 32 // for __AT_BOXES,__AT_CIRCLES animation
  118. CExtPopupMenuSite CExtPopupMenuSite::g_DefPopupMenuSite;
  119. bool CExtPopupMenuWnd::g_bFullScreenMode = false; 
  120. bool CExtPopupMenuWnd::g_bMenuWithShadows = true; // allow shadows
  121. bool CExtPopupMenuWnd::g_bMenuExpanding = true; // allow hide rarely used
  122. bool CExtPopupMenuWnd::g_bMenuDelayExpanding = true;  // show full menu after short delay
  123. bool CExtPopupMenuWnd::g_bMenuHighlightRarely = true; // display rarely used in different style
  124. bool CExtPopupMenuWnd::g_bMenuShowCoolTips = true; // allow display cool tooltips
  125. bool CExtPopupMenuWnd::g_bMenuExpandAnimation = true; // allow animation when show rarely used
  126. bool CExtPopupMenuWnd::g_bUseStretchOnExpandAnimation = false; // use StretchBlt() instead of BitBlt() for painting menu expand amimation
  127. bool CExtPopupMenuWnd::g_bMenuLargeIcons = false; // use large icons
  128. bool CExtPopupMenuWnd::g_bEatNcAreaClicks = true;
  129. bool CExtPopupMenuWnd::g_bMRU_UseFullPathsInMenu = false;
  130. bool CExtPopupMenuWnd::g_bMRU_UseFullPathsInTipTool = false;
  131. bool CExtPopupMenuWnd::g_bShowStatusTipsOverDisabledItems = false;
  132. bool CExtPopupMenuWnd::g_bShowCoolTipsOverDisabledItems = false;
  133. CExtPopupMenuTipWnd::e_tip_style_t CExtPopupMenuWnd::g_eTtsClassicMenu = CExtPopupMenuTipWnd::__ETS_NONE; //__ETS_BALLOON;
  134. CExtPopupMenuTipWnd::e_tip_style_t CExtPopupMenuWnd::g_eTtsPaletteMenu = CExtPopupMenuTipWnd::__ETS_RECTANGLE_NO_ICON;
  135. CExtPopupMenuTipWnd::e_tip_style_t CExtPopupMenuWnd::g_eTtsColorMenu = CExtPopupMenuTipWnd::__ETS_RECTANGLE_NO_ICON;
  136. CExtPopupMenuTipWnd::e_tip_style_t CExtPopupMenuWnd::g_eTtsTearOffCaption = CExtPopupMenuTipWnd::__ETS_INV_RECTANGLE_NO_ICON;
  137. bool CExtPopupBaseWnd::g_bUseDesktopWorkArea = true; // align to desktop work area (false - to screen area)
  138. bool CExtPopupBaseWnd::g_bEnableOnIdleCalls = false;
  139. CObject * CExtPopupBaseWnd::g_pCombinedHelper = NULL;
  140. CExtPopupBaseWnd::e_animation_type_t
  141. CExtPopupBaseWnd::g_DefAnimationType =
  142. CExtPopupBaseWnd::__AT_NONE; // __AT_FADE; // __AT_RANDOM
  143. const UINT CExtPopupBaseWnd::g_nMsgPrepareMenu =
  144. ::RegisterWindowMessage(
  145. _T("CExtPopupMenuWnd::g_nMsgPrepareMenu")
  146. );
  147. const UINT CExtPopupBaseWnd::g_nMsgPrepareOneMenuLevel =
  148. ::RegisterWindowMessage(
  149. _T("CExtPopupMenuWnd::g_nMsgPrepareOneMenuLevel")
  150. );
  151. const UINT CExtPopupBaseWnd::g_nMsgPrepareDesktopBk =
  152. ::RegisterWindowMessage(
  153. _T("CExtPopupMenuWnd::g_nMsgPrepareDesktopBk")
  154. );
  155. const UINT CExtPopupBaseWnd::g_nMsgPopupNext =
  156. ::RegisterWindowMessage(
  157. _T("CExtPopupMenuWnd::g_nMsgPopupNext")
  158. );
  159. const UINT CExtPopupBaseWnd::g_nMsgPopupPrev =
  160. ::RegisterWindowMessage(
  161. _T("CExtPopupMenuWnd::g_nMsgPopupPrev")
  162. );
  163. const UINT CExtPopupBaseWnd::g_nMsgNotifyMenuExpanded =
  164. ::RegisterWindowMessage(
  165. _T("CExtPopupMenuWnd::g_nMsgNotifyMenuExpanded")
  166. );
  167. const UINT CExtPopupBaseWnd::g_nMsgNotifyMenuClosed =
  168. ::RegisterWindowMessage(
  169. _T("CExtPopupMenuWnd::g_nMsgNotifyMenuClosed")
  170. );
  171. const UINT CExtPopupBaseWnd::g_nMsgPopupDrawItem =
  172. ::RegisterWindowMessage(
  173. _T("CExtPopupMenuWnd::g_nMsgPopupDrawItem")
  174. );
  175. const UINT CExtPopupBaseWnd::g_nMsgPopupDrawLeftArea =
  176. ::RegisterWindowMessage(
  177. _T("CExtPopupMenuWnd::g_nMsgPopupDrawLeftArea")
  178. );
  179. const UINT CExtPopupBaseWnd::g_nMsgPopupDrawBackground =
  180. ::RegisterWindowMessage(
  181. _T("CExtPopupMenuWnd::g_nMsgPopupDrawBackground")
  182. );
  183. const UINT CExtPopupBaseWnd::g_nMsgCreateInplaceEdit =
  184. ::RegisterWindowMessage(
  185. _T("CExtPopupMenuWnd::g_nMsgCreateInplaceEdit")
  186. );
  187. const UINT CExtPopupBaseWnd::g_nMsgTranslateKeyboardEvent =
  188. ::RegisterWindowMessage(
  189. _T("CExtPopupBaseWnd::g_nMsgTranslateKeyboardEvent")
  190. );
  191. const UINT CExtPopupBaseWnd::g_nMsgTranslateMouseClickEvent =
  192. ::RegisterWindowMessage(
  193. _T("CExtPopupBaseWnd::g_nMsgTranslateMouseClickEvent")
  194. );
  195. const UINT CExtPopupBaseWnd::g_nMsgTranslateMouseMoveEvent =
  196. ::RegisterWindowMessage(
  197. _T("CExtPopupBaseWnd::g_nMsgTranslateMouseMoveEvent")
  198. );
  199. const UINT CExtPopupBaseWnd::g_nMsgTranslateMouseWheelEvent =
  200. ::RegisterWindowMessage(
  201. _T("CExtPopupBaseWnd::g_nMsgTranslateMouseWheelEvent")
  202. );
  203. #define __POPUP_WNDCLASS_STYLES__ 
  204. ( /*CS_OWNDC|*/ CS_GLOBALCLASS|CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS )
  205. #define __TIP_WNDCLASS_STYLES__ 
  206. ( CS_OWNDC|CS_GLOBALCLASS|CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS )
  207. #define __SHADOW_WNDCLASS_STYLES__ 
  208. ( CS_OWNDC|CS_GLOBALCLASS|CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS )
  209. CExtPopupBaseWnd::TranslateKeyboardEventData_t::TranslateKeyboardEventData_t(
  210. CExtPopupBaseWnd * pEventSourcePopup,
  211. UINT nChar,
  212. UINT nRepCnt,
  213. UINT nFlags,
  214. bool bNoEat
  215. )
  216. : m_pEventSourcePopup( pEventSourcePopup )
  217. , m_bMessageHandled( false )
  218. , m_bNoEat( bNoEat )
  219. , m_nChar( nChar )
  220. , m_nRepCnt( nRepCnt )
  221. , m_nFlags( nFlags )
  222. {
  223. ASSERT_VALID( m_pEventSourcePopup );
  224. ASSERT( m_pEventSourcePopup->GetSafeHwnd() != NULL );
  225. }
  226. CExtPopupBaseWnd::TranslateKeyboardEventData_t::operator WPARAM ()
  227. {
  228. ASSERT( this != NULL );
  229. WPARAM wParam =
  230. reinterpret_cast
  231. < WPARAM >
  232. ( this );
  233. return wParam;
  234. }
  235. CExtPopupBaseWnd::TranslateKeyboardEventData_t & CExtPopupBaseWnd::TranslateKeyboardEventData_t::FromWPARAM( WPARAM wParam )
  236. {
  237. CExtPopupBaseWnd::TranslateKeyboardEventData_t * pData =
  238. reinterpret_cast
  239. < CExtPopupBaseWnd::TranslateKeyboardEventData_t * >
  240. ( wParam );
  241. ASSERT( pData != NULL );
  242. return (*pData);
  243. }
  244. bool CExtPopupBaseWnd::TranslateKeyboardEventData_t::Notify( HWND hWnd )
  245. {
  246. ASSERT( this != NULL );
  247. if( hWnd == NULL || (! ::IsWindow(hWnd) ) )
  248. return false;
  249. m_bMessageHandled = false;
  250. WPARAM wParam = (*this);
  251. ::SendMessage( hWnd, CExtPopupBaseWnd::g_nMsgTranslateKeyboardEvent, wParam, 0L );
  252. return m_bMessageHandled;
  253. }
  254. bool CExtPopupBaseWnd::TranslateKeyboardEventData_t::Notify()
  255. {
  256. ASSERT( this != NULL );
  257. ASSERT_VALID( m_pEventSourcePopup );
  258. ASSERT( m_pEventSourcePopup->GetSafeHwnd() != NULL );
  259. CExtPopupMenuWnd * pPopup =
  260. DYNAMIC_DOWNCAST(
  261. CExtPopupMenuWnd,
  262. m_pEventSourcePopup
  263. );
  264. if( pPopup == NULL )
  265. return false;
  266. HWND hWnd = pPopup->GetCmdReceiverHWND();
  267. bool bRetVal = Notify( hWnd );
  268. return bRetVal;
  269. }
  270. CExtPopupBaseWnd::TranslateMouseClickEventData_t::TranslateMouseClickEventData_t(
  271. CExtPopupBaseWnd * pEventSourcePopup,
  272. UINT nFlags,
  273. CPoint point,
  274. bool bNoEat
  275. )
  276. : m_pEventSourcePopup( pEventSourcePopup )
  277. , m_bMessageHandled( false )
  278. , m_bNoEat( bNoEat )
  279. , m_nFlags( nFlags )
  280. , m_point( point )
  281. {
  282. ASSERT_VALID( m_pEventSourcePopup );
  283. ASSERT( m_pEventSourcePopup->GetSafeHwnd() != NULL );
  284. }
  285. CExtPopupBaseWnd::TranslateMouseClickEventData_t::operator WPARAM ()
  286. {
  287. ASSERT( this != NULL );
  288. WPARAM wParam =
  289. reinterpret_cast
  290. < WPARAM >
  291. ( this );
  292. return wParam;
  293. }
  294. CExtPopupBaseWnd::TranslateMouseClickEventData_t & CExtPopupBaseWnd::TranslateMouseClickEventData_t::FromWPARAM( WPARAM wParam )
  295. {
  296. CExtPopupBaseWnd::TranslateMouseClickEventData_t * pData =
  297. reinterpret_cast
  298. < CExtPopupBaseWnd::TranslateMouseClickEventData_t * >
  299. ( wParam );
  300. ASSERT( pData != NULL );
  301. return (*pData);
  302. }
  303. bool CExtPopupBaseWnd::TranslateMouseClickEventData_t::Notify( HWND hWnd )
  304. {
  305. ASSERT( this != NULL );
  306. if( hWnd == NULL || (! ::IsWindow(hWnd) ) )
  307. return false;
  308. m_bMessageHandled = false;
  309. WPARAM wParam = (*this);
  310. ::SendMessage( hWnd, CExtPopupBaseWnd::g_nMsgTranslateMouseClickEvent, wParam, 0L );
  311. return m_bMessageHandled;
  312. }
  313. bool CExtPopupBaseWnd::TranslateMouseClickEventData_t::Notify()
  314. {
  315. ASSERT( this != NULL );
  316. ASSERT_VALID( m_pEventSourcePopup );
  317. ASSERT( m_pEventSourcePopup->GetSafeHwnd() != NULL );
  318. CExtPopupMenuWnd * pPopup =
  319. DYNAMIC_DOWNCAST(
  320. CExtPopupMenuWnd,
  321. m_pEventSourcePopup
  322. );
  323. if( pPopup == NULL )
  324. return false;
  325. HWND hWnd = pPopup->GetCmdReceiverHWND();
  326. bool bRetVal = Notify( hWnd );
  327. return bRetVal;
  328. }
  329. CExtPopupBaseWnd::TranslateMouseMoveEventData_t::TranslateMouseMoveEventData_t(
  330. CExtPopupBaseWnd * pEventSourcePopup,
  331. UINT nFlags,
  332. CPoint point,
  333. bool bNoEat
  334. )
  335. : m_pEventSourcePopup( pEventSourcePopup )
  336. , m_bMessageHandled( false )
  337. , m_bNoEat( bNoEat )
  338. , m_nFlags( nFlags )
  339. , m_point( point )
  340. {
  341. ASSERT_VALID( m_pEventSourcePopup );
  342. ASSERT( m_pEventSourcePopup->GetSafeHwnd() != NULL );
  343. }
  344. CExtPopupBaseWnd::TranslateMouseMoveEventData_t::operator WPARAM ()
  345. {
  346. ASSERT( this != NULL );
  347. WPARAM wParam =
  348. reinterpret_cast
  349. < WPARAM >
  350. ( this );
  351. return wParam;
  352. }
  353. CExtPopupBaseWnd::TranslateMouseMoveEventData_t & CExtPopupBaseWnd::TranslateMouseMoveEventData_t::FromWPARAM( WPARAM wParam )
  354. {
  355. CExtPopupBaseWnd::TranslateMouseMoveEventData_t * pData =
  356. reinterpret_cast
  357. < CExtPopupBaseWnd::TranslateMouseMoveEventData_t * >
  358. ( wParam );
  359. ASSERT( pData != NULL );
  360. return (*pData);
  361. }
  362. bool CExtPopupBaseWnd::TranslateMouseMoveEventData_t::Notify( HWND hWnd )
  363. {
  364. ASSERT( this != NULL );
  365. if( hWnd == NULL || (! ::IsWindow(hWnd) ) )
  366. return false;
  367. m_bMessageHandled = false;
  368. WPARAM wParam = (*this);
  369. ::SendMessage( hWnd, CExtPopupBaseWnd::g_nMsgTranslateMouseMoveEvent, wParam, 0L );
  370. return m_bMessageHandled;
  371. }
  372. bool CExtPopupBaseWnd::TranslateMouseMoveEventData_t::Notify()
  373. {
  374. ASSERT( this != NULL );
  375. ASSERT_VALID( m_pEventSourcePopup );
  376. ASSERT( m_pEventSourcePopup->GetSafeHwnd() != NULL );
  377. CExtPopupMenuWnd * pPopup =
  378. DYNAMIC_DOWNCAST(
  379. CExtPopupMenuWnd,
  380. m_pEventSourcePopup
  381. );
  382. if( pPopup == NULL )
  383. return false;
  384. HWND hWnd = pPopup->GetCmdReceiverHWND();
  385. bool bRetVal = Notify( hWnd );
  386. return bRetVal;
  387. }
  388. CExtPopupBaseWnd::TranslateMouseWheelEventData_t::TranslateMouseWheelEventData_t(
  389. CExtPopupBaseWnd * pEventSourcePopup,
  390. WPARAM wParam,
  391. LPARAM lParam,
  392. bool bNoEat
  393. )
  394. : m_pEventSourcePopup( pEventSourcePopup )
  395. , m_bMessageHandled( false )
  396. , m_bNoEat( bNoEat )
  397. , m_wParam( wParam )
  398. , m_lParam( lParam )
  399. {
  400. ASSERT_VALID( m_pEventSourcePopup );
  401. ASSERT( m_pEventSourcePopup->GetSafeHwnd() != NULL );
  402. }
  403. CExtPopupBaseWnd::TranslateMouseWheelEventData_t::operator WPARAM ()
  404. {
  405. ASSERT( this != NULL );
  406. WPARAM wParam =
  407. reinterpret_cast
  408. < WPARAM >
  409. ( this );
  410. return wParam;
  411. }
  412. CExtPopupBaseWnd::TranslateMouseWheelEventData_t & CExtPopupBaseWnd::TranslateMouseWheelEventData_t::FromWPARAM( WPARAM wParam )
  413. {
  414. CExtPopupBaseWnd::TranslateMouseWheelEventData_t * pData =
  415. reinterpret_cast
  416. < CExtPopupBaseWnd::TranslateMouseWheelEventData_t * >
  417. ( wParam );
  418. ASSERT( pData != NULL );
  419. return (*pData);
  420. }
  421. bool CExtPopupBaseWnd::TranslateMouseWheelEventData_t::Notify( HWND hWnd )
  422. {
  423. ASSERT( this != NULL );
  424. if( hWnd == NULL || (! ::IsWindow(hWnd) ) )
  425. return false;
  426. m_bMessageHandled = false;
  427. WPARAM wParam = (*this);
  428. ::SendMessage( hWnd, CExtPopupBaseWnd::g_nMsgTranslateMouseWheelEvent, wParam, 0L );
  429. return m_bMessageHandled;
  430. }
  431. bool CExtPopupBaseWnd::TranslateMouseWheelEventData_t::Notify()
  432. {
  433. ASSERT( this != NULL );
  434. ASSERT_VALID( m_pEventSourcePopup );
  435. ASSERT( m_pEventSourcePopup->GetSafeHwnd() != NULL );
  436. CExtPopupMenuWnd * pPopup =
  437. DYNAMIC_DOWNCAST(
  438. CExtPopupMenuWnd,
  439. m_pEventSourcePopup
  440. );
  441. if( pPopup == NULL )
  442. return false;
  443. HWND hWnd = pPopup->GetCmdReceiverHWND();
  444. bool bRetVal = Notify( hWnd );
  445. return bRetVal;
  446. }
  447. /////////////////////////////////////////////////////////////////////////////
  448. // CExtSoundPlayer
  449. CExtSoundPlayer::CExtSoundPlayerAutoPtr g_SoundPlayer;
  450. IMPLEMENT_DYNCREATE( CExtSoundPlayer, CObject );
  451. CExtSoundPlayer::InternalSoundEventInitDone_t::InternalSoundEventInitDone_t()
  452. : CEvent( FALSE, TRUE )
  453. {
  454. }
  455. void CExtSoundPlayer::InternalSoundEventInitDone_t::SetInitDone()
  456. {
  457. SetEvent();
  458. }
  459. void CExtSoundPlayer::InternalSoundEventInitDone_t::WaitInitDone()
  460. {
  461. HANDLE hEvent = *this;
  462. ASSERT( hEvent != NULL );
  463. ::WaitForSingleObject( hEvent, INFINITE );
  464. }
  465. CExtSoundPlayer::InternalSoundThredadParms_t::InternalSoundThredadParms_t(
  466. __EXT_MFC_SAFE_LPCTSTR sSoundSpecBuffer,
  467. HANDLE hModule,
  468. DWORD dwPlayerFlags
  469. )
  470. : m_hModule( hModule )
  471. , m_dwPlayerFlags( dwPlayerFlags )
  472. , m_hThread( NULL )
  473. , m_dwThreadID( 0 )
  474. , m_pEventInitDone( NULL )
  475. {
  476. ::memset( m_sSoundSpecBuffer, 0, sizeof(m_sSoundSpecBuffer) );
  477. ASSERT( sSoundSpecBuffer != NULL );
  478. ASSERT( _tclen(sSoundSpecBuffer) > 0 );
  479. __EXT_MFC_STRNCPY(
  480. m_sSoundSpecBuffer,
  481. sizeof(m_sSoundSpecBuffer) / sizeof(m_sSoundSpecBuffer[0]),
  482. sSoundSpecBuffer,
  483. sizeof(m_sSoundSpecBuffer) / sizeof(m_sSoundSpecBuffer[0])
  484. );
  485. }
  486. CEvent CExtSoundPlayer::InternalSoundThredadParms_t::g_EventPlaySnd(
  487. TRUE,
  488. FALSE
  489. );
  490. CCriticalSection CExtSoundPlayer::InternalSoundThredadParms_t::g_CsPlaySnd;
  491. DWORD WINAPI CExtSoundPlayer::InternalSoundThredadParms_t::stat_ParallelPlayerProc(
  492. CExtSoundPlayer::InternalSoundThredadParms_t * pParms
  493. )
  494. {
  495. ASSERT( pParms != NULL );
  496. pParms->PlaySound();
  497. g_EventPlaySnd.SetEvent();
  498. return 0;
  499. }
  500. //#define __TRACE_SOUND_PLAYER_THREAD
  501. void CExtSoundPlayer::InternalSoundThredadParms_t::PlaySound()
  502. {
  503. TCHAR sSoundSpecBuffer[ sizeof(m_sSoundSpecBuffer) / sizeof(m_sSoundSpecBuffer[0]) ];
  504. __EXT_MFC_STRCPY(
  505. sSoundSpecBuffer,
  506. sizeof(m_sSoundSpecBuffer) / sizeof(m_sSoundSpecBuffer[0]),
  507. m_sSoundSpecBuffer
  508. );
  509. HANDLE hModule = m_hModule;
  510. DWORD dwPlayerFlags = m_dwPlayerFlags;
  511. if( m_pEventInitDone != NULL )
  512. m_pEventInitDone->SetInitDone();
  513. #ifdef __TRACE_SOUND_PLAYER_THREAD
  514. TRACE1("CExtSoundPlayer::InternalSoundThredadParms_t::PlaySound("%s") - STARTn",sSoundSpecBuffer);
  515. #endif // __TRACE_SOUND_PLAYER_THREAD
  516. if( (m_dwPlayerFlags & SND_ASYNC) != 0 )
  517. ::PlaySound( NULL, NULL, SND_PURGE );
  518. ::PlaySound(
  519. sSoundSpecBuffer,
  520. (HMODULE)hModule,
  521. dwPlayerFlags
  522. );
  523. if( (m_dwPlayerFlags & SND_SYNC) != 0 )
  524. ::PlaySound( NULL, NULL, SND_PURGE );
  525. #ifdef __TRACE_SOUND_PLAYER_THREAD
  526. TRACE1("CExtSoundPlayer::InternalSoundThredadParms_t::PlaySound("%s") - STOPn",sSoundSpecBuffer);
  527. #endif // __TRACE_SOUND_PLAYER_THREAD
  528. }
  529. void CExtSoundPlayer::InternalSoundThredadParms_t::PlaySoundParallel()
  530. {
  531. ASSERT( m_hThread == NULL );
  532. CSingleLock slCs( &g_CsPlaySnd );
  533. slCs.Lock();
  534. HANDLE hEvent = (HANDLE)g_EventPlaySnd;
  535. ASSERT( hEvent != NULL );
  536. if( ::WaitForSingleObject(hEvent,0) == WAIT_OBJECT_0 )
  537. {
  538. ASSERT( m_pEventInitDone == NULL );
  539. InternalSoundEventInitDone_t EventInitDone;
  540. m_pEventInitDone = &EventInitDone;
  541. m_hThread =
  542. ::CreateThread(
  543. NULL,
  544. 0,
  545. *this,
  546. this,
  547. CREATE_SUSPENDED,
  548. &m_dwThreadID
  549. );
  550. ASSERT( m_hThread != NULL );
  551. if( m_hThread != NULL )
  552. {
  553. VERIFY(
  554. ::SetThreadPriority(
  555. m_hThread,
  556. THREAD_PRIORITY_BELOW_NORMAL
  557. )
  558. );
  559. ::ResumeThread( m_hThread );
  560. EventInitDone.WaitInitDone();
  561. } // if( m_hThread != NULL )
  562. else
  563. g_EventPlaySnd.SetEvent();
  564. } // if( ::WaitForSingleObject(hEvent,0) == WAIT_OBJECT_0 )
  565. if( m_hThread != NULL )
  566. ::CloseHandle( m_hThread );
  567. slCs.Unlock();
  568. }
  569. CExtSoundPlayer::CExtSoundPlayerAutoPtr::CExtSoundPlayerAutoPtr()
  570. {
  571. m_pPlayer = new CExtSoundPlayer;
  572. }
  573. CExtSoundPlayer::CExtSoundPlayerAutoPtr::~CExtSoundPlayerAutoPtr()
  574. {
  575. if( m_pPlayer != NULL )
  576. delete m_pPlayer;
  577. }
  578. void CExtSoundPlayer::CExtSoundPlayerAutoPtr::InstallSoundPlayer(
  579. CExtSoundPlayer * pPlayer
  580. )
  581. {
  582. ASSERT( pPlayer != NULL );
  583. ASSERT_VALID( pPlayer );
  584. ASSERT_KINDOF( CExtSoundPlayer, m_pPlayer );
  585. if( m_pPlayer != NULL )
  586. delete m_pPlayer;
  587. m_pPlayer = pPlayer;
  588. }
  589. CExtSoundPlayer::CExtSoundPlayer()
  590. {
  591. }
  592. CExtSoundPlayer::~CExtSoundPlayer()
  593. {
  594. }
  595. void CExtSoundPlayer::PlaySound(
  596. CExtSoundPlayer::e_ui_sounds_t eSoundID
  597. )
  598. {
  599. ASSERT_VALID( this );
  600. switch( eSoundID )
  601. {
  602. case __NO_SOUND:
  603. return;
  604. case __ON_MENU_EXPAND_CLICKED:
  605. case __ON_MENU_POPUP_DISPLAYED:
  606. {
  607. InternalSoundThredadParms_t _istp(
  608. _T("MenuPopup"),
  609. NULL,
  610. SND_ALIAS|SND_NODEFAULT|SND_NOWAIT|SND_ASYNC
  611. );
  612. _istp.PlaySoundParallel();
  613. return;
  614. }
  615. case __ON_MENU_CMD_CLICKED:
  616. {
  617. InternalSoundThredadParms_t _istp(
  618. _T("MenuCommand"),
  619. NULL,
  620. SND_ALIAS|SND_NODEFAULT|SND_NOWAIT|SND_SYNC
  621. );
  622. _istp.PlaySoundParallel();
  623. return;
  624. }
  625. } // switch( eSoundID )
  626. }
  627. /////////////////////////////////////////////////////////////////////////////
  628. // CExtPopupMenuSite
  629. CExtPopupMenuSite::CExtPopupMenuSite()
  630. : m_pTopMenu( NULL )
  631. , m_pWndCapture( NULL )
  632. , m_pWndAnimation( NULL )
  633. , m_bShutdownMode( false )
  634. , m_hMouseHook( NULL )
  635. , m_hKeyboardHook( NULL )
  636. , m_lpnResultCmdID( NULL )
  637. , m_pWndToolTip( NULL )
  638. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  639. , m_pWndScreenTip( NULL )
  640. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  641. {
  642. }
  643. CExtPopupMenuSite::~CExtPopupMenuSite()
  644. {
  645. __PROF_UIS_MANAGE_STATE;
  646. _Done();
  647. for( ; true; )
  648. {
  649. POSITION pos = m_mapFadeOutInsances.GetStartPosition();
  650. if( pos == NULL )
  651. break;
  652. CExtPopupMenuWnd * pPopup = NULL;
  653. bool bFlag = false;
  654. m_mapFadeOutInsances.GetNextAssoc( pos, pPopup, bFlag );
  655. ASSERT_VALID( pPopup );
  656. pPopup->m_nFadeOutAnimationStepIndex = pPopup->m_nFadeOutAnimationStepCount;
  657. if( pPopup->GetSafeHwnd() == NULL )
  658. {
  659. //pPopup->m_bTopLevel = true;
  660. pPopup->_BuildItems( NULL, true );
  661. delete pPopup;
  662. }
  663. else
  664. {
  665. pPopup->TrackFlagsSet( pPopup->TrackFlagsGet() | TPMX_NO_FADE_OUT_ANIMATION );
  666. pPopup->DestroyWindow();
  667. }
  668. } // for( ; true; )
  669. if( m_pWndToolTip != NULL )
  670. {
  671. if( m_pWndToolTip->GetSafeHwnd() != NULL )
  672. m_pWndToolTip->DestroyWindow();
  673. delete m_pWndToolTip;
  674. m_pWndToolTip = NULL;
  675. } // if( m_pWndToolTip != NULL )
  676. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  677. if( m_pWndScreenTip != NULL )
  678. {
  679. if( m_pWndScreenTip->GetSafeHwnd() != NULL )
  680. m_pWndScreenTip->DestroyWindow();
  681. delete m_pWndScreenTip;
  682. m_pWndScreenTip = NULL;
  683. } // if( m_pWndScreenTip != NULL )
  684. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  685. }
  686. void CExtPopupMenuSite::FadeOutInstanceAdd( CExtPopupMenuWnd * pPopup )
  687. {
  688. ASSERT( pPopup != NULL );
  689. m_mapFadeOutInsances.SetAt( pPopup, false );
  690. }
  691. void CExtPopupMenuSite::FadeOutInstanceRemove( CExtPopupMenuWnd * pPopup )
  692. {
  693. ASSERT( pPopup != NULL );
  694. m_mapFadeOutInsances.RemoveKey( pPopup );
  695. }
  696. bool CExtPopupMenuSite::IsEmpty() const
  697. {
  698. return (m_pTopMenu == NULL) ? true : false;
  699. }
  700. bool CExtPopupMenuSite::IsShutdownMode() const
  701. {
  702. return m_bShutdownMode;
  703. }
  704. CExtPopupMenuTipWnd & CExtPopupMenuSite::GetTip()
  705. {
  706. if( m_pWndToolTip == NULL )
  707. m_pWndToolTip = new CExtPopupMenuTipWnd;
  708. return (*m_pWndToolTip);
  709. }
  710. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  711. CExtPopupScreenTipWnd & CExtPopupMenuSite::GetScreenTip()
  712. {
  713. if( m_pWndScreenTip == NULL )
  714. m_pWndScreenTip = new CExtPopupScreenTipWnd;
  715. return (*m_pWndScreenTip);
  716. }
  717. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  718. CExtPopupMenuWnd * CExtPopupMenuSite::GetCapture()
  719. {
  720. if( IsEmpty() )
  721. return NULL;
  722. ASSERT( ! IsShutdownMode() );
  723. return m_pWndCapture;
  724. }
  725. void CExtPopupMenuSite::SetCapture(
  726. CExtPopupMenuWnd * pNewPopup // = NULL
  727. )
  728. {
  729. if( IsEmpty() )
  730. return;
  731. ASSERT( ! IsShutdownMode() );
  732. #ifdef _DEBUG
  733. if( pNewPopup != NULL )
  734. {
  735. ASSERT_VALID( pNewPopup );
  736. } // if( pNewPopup != NULL )
  737. #endif // _DEBUG
  738. m_pWndCapture = pNewPopup;
  739. }
  740. void CExtPopupMenuSite::SetInstance(
  741. CExtPopupMenuWnd * pTopMenu // = NULL
  742. )
  743. {
  744. ASSERT( ! IsShutdownMode() );
  745. if( ! IsEmpty() )
  746. {
  747. ASSERT( m_pTopMenu != NULL );
  748. ASSERT_VALID( m_pTopMenu );
  749. ASSERT( m_pTopMenu->m_bTopLevel );
  750. if( m_pTopMenu == pTopMenu )
  751. return;
  752. if( m_pTopMenu != pTopMenu )
  753. _Done();
  754. } // if( ! IsEmpty() )
  755. ASSERT( m_pTopMenu == NULL );
  756. if( pTopMenu != NULL )
  757. {
  758. ASSERT_VALID( pTopMenu );
  759. ASSERT( pTopMenu->m_bTopLevel );
  760. m_pTopMenu = pTopMenu;
  761. _Hook( true );
  762. } // if( pTopMenu != NULL )
  763. }
  764. CExtPopupMenuWnd * CExtPopupMenuSite::GetAnimated()
  765. {
  766. if( IsEmpty() )
  767. return NULL;
  768. ASSERT( ! IsShutdownMode() );
  769. return m_pWndAnimation;
  770. }
  771. void CExtPopupMenuSite::SetAnimated(
  772. CExtPopupMenuWnd * pNewPopup // = NULL
  773. )
  774. {
  775. if( IsEmpty() )
  776. return;
  777. ASSERT( ! IsShutdownMode() );
  778. m_pWndAnimation = pNewPopup;
  779. }
  780. CExtPopupMenuWnd * CExtPopupMenuSite::GetInstance()
  781. {
  782. return m_pTopMenu;
  783. }
  784. void CExtPopupMenuSite::SetTargetCmdIdPtr(
  785. UINT * lpnResultCmdID // = NULL
  786. )
  787. {
  788. m_lpnResultCmdID = lpnResultCmdID;
  789. }
  790. UINT * CExtPopupMenuSite::GetTargetCmdIdPtr()
  791. {
  792. return m_lpnResultCmdID;
  793. }
  794. void CExtPopupMenuSite::DoneInstance()
  795. {
  796. _Done();
  797. }
  798. void CExtPopupMenuSite :: operator = ( CExtPopupMenuWnd * pTopMenu )
  799. {
  800. SetInstance(pTopMenu);
  801. }
  802. CExtPopupMenuWnd * CExtPopupMenuSite :: operator -> ()
  803. {
  804. ASSERT( ! IsEmpty() );
  805. ASSERT( ! IsShutdownMode() );
  806. ASSERT( m_pTopMenu != NULL );
  807. return m_pTopMenu;
  808. }
  809. bool CExtPopupMenuSite::IsTopPopup(
  810. CExtPopupMenuWnd * pTopMenu
  811. ) const
  812. {
  813. if( pTopMenu->GetSafeHwnd() == NULL )
  814. return false;
  815. ASSERT_VALID( pTopMenu );
  816. if( IsEmpty() )
  817. {
  818. if( (pTopMenu->TrackFlagsGet()&TPMX_NO_SITE) != 0 )
  819. return true;
  820. }
  821. ASSERT( ! IsShutdownMode() );
  822. return (pTopMenu==m_pTopMenu) ? true : false;
  823. }
  824. void CExtPopupMenuSite::_Done()
  825. {
  826. if( CExtBarButton::g_pTrackingMenuTBB != NULL )
  827. {
  828. bool bResetCurrentToolbarButton = true;
  829. CExtPopupMenuWnd * pPopup = GetInstance();
  830. if( pPopup != NULL
  831. && pPopup->m_eCombineAlign == CExtPopupMenuWnd::__CMBA_NONE
  832. )
  833. {
  834. POINT pt;
  835. if( ::GetCursorPos( &pt ) )
  836. {
  837. HWND hWnd = ::WindowFromPoint( pt );
  838. if( hWnd != NULL )
  839. {
  840. CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  841. if( pWnd != NULL )
  842. {
  843. CExtToolControlBar * pToolBar = DYNAMIC_DOWNCAST( CExtToolControlBar, pWnd );
  844. if( pToolBar != NULL )
  845. {
  846. pToolBar->ScreenToClient( &pt );
  847. int nIdx = pToolBar->HitTest( pt );
  848. if( nIdx >= 0 && pToolBar->GetButton( nIdx ) == CExtBarButton::g_pTrackingMenuTBB )
  849. bResetCurrentToolbarButton = false;
  850. }
  851. }
  852. }
  853. }
  854. }
  855. if( bResetCurrentToolbarButton )
  856. CExtBarButton::g_pTrackingMenuTBB = NULL;
  857. }
  858. if( m_pWndToolTip != NULL )
  859. {
  860. if( m_pWndToolTip->GetSafeHwnd() != NULL )
  861. m_pWndToolTip->DestroyWindow();
  862. delete m_pWndToolTip;
  863. m_pWndToolTip = NULL;
  864. } // if( m_pWndToolTip != NULL )
  865. if( m_bShutdownMode )
  866. return;
  867. // if( m_pWndToolTip != NULL )
  868. // m_pWndToolTip->Hide();
  869. m_bShutdownMode = true;
  870. m_pWndCapture = NULL;
  871. m_pWndAnimation = NULL;
  872. m_lpnResultCmdID = NULL;
  873. _Hook( false );
  874. if( m_pTopMenu != NULL )
  875. {
  876. ASSERT( m_pTopMenu->m_bTopLevel );
  877. bool bFadeOutMode = m_pTopMenu->_IsFadeOutAnimation();
  878. if( ! bFadeOutMode )
  879. {
  880. VERIFY( m_pTopMenu->_BuildItems( NULL, true ) );
  881. if( m_pTopMenu->GetSafeHwnd() != NULL
  882. && ::IsWindow( m_pTopMenu->GetSafeHwnd() )
  883. )
  884. {
  885. CExtControlBar::stat_SetMessageString( m_pTopMenu->GetOwner() );
  886. m_pTopMenu->DestroyWindow();
  887. }
  888. ASSERT( m_pTopMenu->GetSafeHwnd() == NULL );
  889. delete m_pTopMenu;
  890. } // if( ! bFadeOutMode )
  891. m_pTopMenu = NULL;
  892. } // if( m_pTopMenu != NULL )
  893. __VPC_VERIFY_0;
  894. m_bShutdownMode = false;
  895. }
  896. LRESULT CALLBACK CExtPopupMenuSite::_HookMouseProc(
  897. int nCode,      // hook code
  898. WPARAM wParam,  // message identifier
  899. LPARAM lParam   // mouse coordinates
  900. )
  901. {
  902. __PROF_UIS_MANAGE_STATE;
  903. if( nCode != HC_ACTION )
  904. return
  905. ::CallNextHookEx(
  906. g_DefPopupMenuSite.m_hMouseHook,
  907. nCode,
  908. wParam,
  909. lParam
  910. );
  911. MOUSEHOOKSTRUCT* lpMS = (MOUSEHOOKSTRUCT*)lParam;
  912. ASSERT( lpMS != NULL );
  913. if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON != NULL )
  914. {
  915. switch( wParam )
  916. {
  917. case WM_MOUSEMOVE:
  918. {
  919. CPoint pt( lpMS->pt );
  920. if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->
  921. _OnMouseMove(
  922. (UINT)wParam,
  923. pt
  924. )
  925. )
  926. return 1; // eat!
  927. }
  928. break;
  929. case WM_MOUSEWHEEL:
  930. {
  931. if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->
  932. _OnMouseWheel(
  933. wParam,
  934. lParam
  935. )
  936. )
  937. return 1; // eat!
  938. }
  939. break;
  940. case WM_NCLBUTTONDOWN:
  941. case WM_NCRBUTTONDOWN:
  942. case WM_NCMBUTTONDOWN:
  943. case WM_LBUTTONDOWN:
  944. case WM_RBUTTONDOWN:
  945. case WM_MBUTTONDOWN:
  946. case WM_NCLBUTTONUP:
  947. case WM_NCRBUTTONUP:
  948. case WM_NCMBUTTONUP:
  949. case WM_LBUTTONUP:
  950. case WM_RBUTTONUP:
  951. case WM_MBUTTONUP:
  952. {
  953. CPoint ptSrc( lpMS->pt );
  954. if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->_OnMouseClick(
  955. (UINT)wParam,
  956. ptSrc
  957. )
  958. )
  959. return 1; // eat!
  960. }
  961. break;
  962. } // switch( wParam )
  963. }
  964. if( nCode == HC_ACTION // +2.55 - fix by Ulrich Berger-Kubik
  965. && (! g_DefPopupMenuSite.IsEmpty() )
  966. && (! g_DefPopupMenuSite.IsShutdownMode() )
  967. )
  968. {
  969. CExtPopupMenuWnd * pWndCapture =
  970. g_DefPopupMenuSite.GetCapture();
  971. if( pWndCapture != NULL
  972. && ::IsWindow( pWndCapture->GetSafeHwnd() )
  973. )
  974. {
  975. ASSERT_VALID( pWndCapture );
  976. CExtBarButton * pSavedTrackingMenuTBB = CExtBarButton::g_pTrackingMenuTBB;
  977. switch( wParam )
  978. {
  979. //case WM_MOUSEACTIVATE:
  980. // if( lpMS->hwnd != pWndCapture->GetSafeHwnd() )
  981. // return 1;
  982. //break;
  983. case WM_MOUSEMOVE:
  984. {
  985. CPoint pt( lpMS->pt );
  986. pWndCapture->ScreenToClient( &pt );
  987. bool bNoEat = false;
  988. if( pWndCapture->
  989. _OnMouseMove(
  990. (UINT)wParam,
  991. pt,
  992. bNoEat
  993. )
  994. )
  995. {
  996. HWND hWnd = ::WindowFromPoint( lpMS->pt );
  997. if( hWnd != NULL
  998. && ::GetWindowThreadProcessId( hWnd, NULL ) == ::GetCurrentThreadId()
  999. )
  1000. {
  1001. INT nHT = (INT)::SendMessage( hWnd, WM_NCHITTEST, 0L, MAKELPARAM(lpMS->pt.x,lpMS->pt.y) );
  1002. INT nMM = WM_MOUSEMOVE;
  1003. if( nHT != HTCLIENT
  1004. && nHT != HTMINBUTTON
  1005. && nHT != HTMAXBUTTON
  1006. && nHT != HTHELP
  1007. && nHT != HTCLOSE
  1008. && nHT != HTNOWHERE
  1009. )
  1010. nMM = WM_NCMOUSEMOVE;
  1011. else
  1012. nHT = HTCLIENT;
  1013. ::SendMessage( hWnd, WM_SETCURSOR, (WPARAM)hWnd, MAKELPARAM(nHT,nMM) );
  1014. }
  1015. return 1; // eat!
  1016. }
  1017. if( bNoEat )
  1018. return
  1019. ::CallNextHookEx(
  1020. g_DefPopupMenuSite.m_hMouseHook,
  1021. nCode,
  1022. wParam,
  1023. lParam
  1024. );
  1025. }
  1026. break;
  1027. case WM_MOUSEWHEEL:
  1028. {
  1029. bool bNoEat = false;
  1030. if( pWndCapture->
  1031. _OnMouseWheel(
  1032. wParam,
  1033. lParam,
  1034. bNoEat
  1035. )
  1036. )
  1037. return 1; // eat!
  1038. if( bNoEat )
  1039. return
  1040. ::CallNextHookEx(
  1041. g_DefPopupMenuSite.m_hMouseHook,
  1042. nCode,
  1043. wParam,
  1044. lParam
  1045. );
  1046. return 1; // eat!
  1047. }
  1048. break;
  1049. case WM_NCLBUTTONDBLCLK:
  1050. case WM_NCRBUTTONDBLCLK:
  1051. case WM_NCMBUTTONDBLCLK:
  1052. case WM_LBUTTONDBLCLK:
  1053. case WM_RBUTTONDBLCLK:
  1054. case WM_MBUTTONDBLCLK:
  1055. CExtBarButton::g_pTrackingMenuTBB = NULL;
  1056. // continue ...
  1057. case WM_NCLBUTTONDOWN:
  1058. case WM_NCRBUTTONDOWN:
  1059. case WM_NCMBUTTONDOWN:
  1060. case WM_LBUTTONDOWN:
  1061. case WM_RBUTTONDOWN:
  1062. case WM_MBUTTONDOWN:
  1063. case WM_NCLBUTTONUP:
  1064. case WM_NCRBUTTONUP:
  1065. case WM_NCMBUTTONUP:
  1066. case WM_LBUTTONUP:
  1067. case WM_RBUTTONUP:
  1068. case WM_MBUTTONUP:
  1069. {
  1070. HWND hWndFromPoint = WindowFromPoint( lpMS->pt );
  1071. LRESULT nHT =
  1072. ::SendMessage(
  1073. hWndFromPoint,
  1074. WM_NCHITTEST,
  1075. 0L,
  1076. MAKELPARAM( lpMS->pt.x, lpMS->pt.y )
  1077. );
  1078. if( hWndFromPoint != NULL )
  1079. {
  1080. if( ( nHT == HTSYSMENU || nHT == HTCAPTION )
  1081. && wParam != WM_NCLBUTTONUP
  1082. && ( ! g_PaintManager.m_DWM.IsCompositionEnabled() )
  1083. )
  1084. {
  1085. CWnd * pWndFromPointPermanent = CWnd::FromHandlePermanent( hWndFromPoint );
  1086. if( pWndFromPointPermanent == NULL
  1087. || (! pWndFromPointPermanent->IsKindOf( RUNTIME_CLASS(CMiniFrameWnd) ) )
  1088. )
  1089. {
  1090. pWndCapture->TrackFlagsSet( pWndCapture->TrackFlagsGet() | TPMX_NO_FADE_OUT_ANIMATION );
  1091. CExtToolControlBar::_CloseTrackingMenus();
  1092. CExtPopupMenuWnd::CancelMenuTracking();
  1093. return
  1094. ::CallNextHookEx(
  1095. g_DefPopupMenuSite.m_hMouseHook,
  1096. nCode,
  1097. wParam,
  1098. lParam
  1099. );
  1100. }
  1101. }
  1102. } // if( hWndFromPoint != NULL )
  1103. //CRect rcWndCapture;
  1104. //_pWndCapture->GetWindowRect( &rcWndCapture );
  1105. //if( !rcWndCapture.PtInRect(lpMS->pt) )
  1106. // break;
  1107. CPoint ptSrc( lpMS->pt );
  1108. pWndCapture->ScreenToClient( &ptSrc );
  1109. bool bSameToolBarButtonIsClicked = false;
  1110. CExtPopupMenuWnd * pDefInstancePopup = CExtPopupMenuSite::g_DefPopupMenuSite.GetInstance();
  1111. CPoint pt( lpMS->pt );
  1112. HWND hWndPT = ::WindowFromPoint( pt );
  1113. CWnd * pWndPermanentPT = NULL;
  1114. if( hWndPT != NULL )
  1115. pWndPermanentPT = CWnd::FromHandlePermanent( hWndPT );
  1116. if( pDefInstancePopup != NULL
  1117. && pWndPermanentPT != NULL
  1118. && pSavedTrackingMenuTBB != NULL
  1119. && ( wParam == WM_LBUTTONDOWN || wParam == WM_LBUTTONDBLCLK )
  1120. )
  1121. {
  1122. ASSERT_VALID( pDefInstancePopup );
  1123. ASSERT( ::IsWindow(pDefInstancePopup->GetSafeHwnd()) );
  1124. if( ( ! pDefInstancePopup->m_rcExcludeArea.IsRectEmpty() )
  1125. && pDefInstancePopup->m_rcExcludeArea.PtInRect( pt )
  1126. && pWndPermanentPT != NULL
  1127. && pWndPermanentPT->IsKindOf( RUNTIME_CLASS( CExtToolControlBar ) )
  1128. )
  1129. {
  1130. CPoint ptBarClient = pt;
  1131. pWndPermanentPT->ScreenToClient( &ptBarClient );
  1132. INT nHtTbb = ((CExtToolControlBar*)pWndPermanentPT)->HitTest( ptBarClient );
  1133. if( nHtTbb >= 0 && LPVOID(((CExtToolControlBar*)pWndPermanentPT)->GetButton(nHtTbb)) == LPVOID(pSavedTrackingMenuTBB) )
  1134. bSameToolBarButtonIsClicked = true;
  1135. }
  1136. }
  1137. DWORD dwCTF = pWndCapture->TrackFlagsGet();
  1138. bool bNoEat = false;
  1139. HWND hWndCapture = pWndCapture->GetSafeHwnd();
  1140. ASSERT( hWndCapture != NULL && ::IsWindow(hWndCapture) );
  1141. if( pWndCapture->_OnMouseClick(
  1142. (UINT)wParam,
  1143. ptSrc,
  1144. bNoEat
  1145. )
  1146. )
  1147. {
  1148. if( ( ! bNoEat )
  1149. && ( dwCTF & TPMX_SYSMENU ) != 0
  1150. && ( wParam == WM_NCLBUTTONDOWN || wParam == WM_NCLBUTTONDBLCLK )
  1151. && nHT == HTSYSMENU
  1152. )
  1153. return
  1154. ::CallNextHookEx(
  1155. g_DefPopupMenuSite.m_hMouseHook,
  1156. nCode,
  1157. wParam,
  1158. lParam
  1159. );
  1160. if( ! bSameToolBarButtonIsClicked )
  1161. return 1; // eat!
  1162. }
  1163. if( ( ! bNoEat )
  1164. && ( dwCTF & TPMX_SYSMENU ) != 0
  1165. && ( wParam == WM_NCLBUTTONDOWN || wParam == WM_NCLBUTTONDBLCLK )
  1166. && nHT == HTSYSMENU
  1167. )
  1168. bNoEat = true;
  1169. if( bNoEat )
  1170. return
  1171. ::CallNextHookEx(
  1172. g_DefPopupMenuSite.m_hMouseHook,
  1173. nCode,
  1174. wParam,
  1175. lParam
  1176. );
  1177. if( ! (::IsWindow(hWndCapture)) )
  1178. return 1; // eat!
  1179. // post processing
  1180. if( hWndPT != NULL )
  1181. {
  1182. CExtPopupMenuWnd * pPopup = pWndCapture;
  1183. for( ; pPopup != NULL; pPopup = pPopup->m_pWndParentMenu )
  1184. {
  1185. CPoint ptClient( pt );
  1186. pPopup->ScreenToClient( &ptClient );
  1187. if( pPopup->_PtInWndArea(ptClient) )
  1188. return 1; // eat!
  1189. CExtPopupMenuTipWnd & _tipWnd = pPopup->GetTip();
  1190. HWND hWndTest = _tipWnd.GetSafeHwnd();
  1191. if( hWndTest != NULL )
  1192. {
  1193. if( hWndTest == hWndPT
  1194. || ::IsChild( hWndTest, hWndPT )
  1195. )
  1196. return 1; // eat!
  1197. } // if( hWndTest != NULL )
  1198. if( pWndPermanentPT != NULL
  1199. && ::IsChild( pPopup->m_hWnd, hWndPT )
  1200. && pWndPermanentPT->IsKindOf( RUNTIME_CLASS(CScrollBar) )
  1201. )
  1202. return 1; // eat!
  1203. } // for( ; pPopup != NULL; pPopup = pPopup->m_pWndParentMenu )
  1204. } // if( hWndPT != NULL )
  1205. if( pDefInstancePopup != NULL )
  1206. {
  1207. bool bEatEvent = false;
  1208. ASSERT_VALID( pDefInstancePopup );
  1209. ASSERT( ::IsWindow(pDefInstancePopup->GetSafeHwnd()) );
  1210. if( bSameToolBarButtonIsClicked )
  1211. bEatEvent = true;
  1212. pDefInstancePopup->_CancelingSet();
  1213. pDefInstancePopup->_OnCancelMode();
  1214. if( ! bEatEvent )
  1215. {
  1216. if( wParam != WM_LBUTTONDOWN
  1217. && wParam != WM_RBUTTONDOWN
  1218. && wParam != WM_MBUTTONDOWN
  1219. )
  1220. bEatEvent = true;
  1221. }
  1222. if( ! bEatEvent )
  1223. {
  1224. if( ! ::IsWindow( hWndPT ) )
  1225. bEatEvent = true;
  1226. }
  1227. if( bEatEvent )
  1228. {
  1229. if( CExtPopupMenuWnd::g_bEatNcAreaClicks )
  1230. return 1; // eat!
  1231. }
  1232. } // if( pDefInstancePopup != NULL )
  1233. // else
  1234. // CExtPopupMenuSite::g_DefPopupMenuSite._Done();
  1235. }
  1236. break;
  1237. //default:
  1238. // return 1; // eat!
  1239. } // switch( wParam )
  1240. } // if( pWndCapture != NULL ....
  1241. else
  1242. return 1; // eat
  1243. } // if( (! g_DefPopupMenuSite.IsEmpty() ) ...
  1244. return
  1245. ::CallNextHookEx(
  1246. g_DefPopupMenuSite.m_hMouseHook,
  1247. nCode,
  1248. wParam,
  1249. lParam
  1250. );
  1251. }
  1252. LRESULT CALLBACK CExtPopupMenuSite::_HookKeyboardProc(
  1253. int nCode,      // hook code
  1254. WPARAM wParam,  // virtual-key code
  1255. LPARAM lParam   // keystroke-message information
  1256. )
  1257. {
  1258. __PROF_UIS_MANAGE_STATE;
  1259. if( nCode != HC_ACTION )
  1260. return
  1261. ::CallNextHookEx(
  1262. g_DefPopupMenuSite.m_hKeyboardHook,
  1263. nCode,
  1264. wParam,
  1265. lParam
  1266. );
  1267. if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON != NULL )
  1268. {
  1269. if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->
  1270. _OnKeyDown(
  1271. (UINT)wParam,
  1272. LOWORD(lParam),
  1273. HIWORD(lParam)
  1274. )
  1275. )
  1276. return 1; // eat!
  1277. }
  1278. if( (! g_DefPopupMenuSite.IsEmpty() )
  1279. && (! g_DefPopupMenuSite.IsShutdownMode() )
  1280. )
  1281. {
  1282. CExtPopupMenuWnd * pWndCapture =
  1283. g_DefPopupMenuSite.GetCapture();
  1284. if( pWndCapture->GetSafeHwnd() != NULL
  1285. && ::IsWindow( pWndCapture->GetSafeHwnd() )
  1286. )
  1287. {
  1288. ASSERT_VALID( pWndCapture );
  1289. if( (lParam & (1<<31)) == 0 )
  1290. {
  1291. // clocks allows to fix problem with
  1292. // duplicated fast key hook calls
  1293. static clock_t _clock_step =
  1294. CLOCKS_PER_SEC / 50; // 1/50 of second
  1295. static clock_t _clock_last =
  1296. 0; //clock();
  1297. clock_t _clock_curr =
  1298. clock();
  1299. //ASSERT( _clock_curr >= _clock_last );
  1300. clock_t _clock_diff =
  1301. abs(_clock_curr - _clock_last);
  1302. bool bForceChildProcessing = false;
  1303. HWND hWndFocus = ::GetFocus();
  1304. if( hWndFocus != NULL
  1305. && ( ( ::__EXT_MFC_GetWindowLong( hWndFocus, GWL_STYLE ) & WS_CHILD ) != 0 )
  1306. )
  1307. {
  1308. HWND hWndTest = ::GetParent( hWndFocus );
  1309. if( hWndTest != NULL )
  1310. {
  1311. CWnd * pWndPermantent =
  1312. CWnd::FromHandlePermanent( hWndTest );
  1313. if( pWndPermantent != NULL
  1314. && pWndPermantent->IsKindOf(
  1315. RUNTIME_CLASS( CExtPopupMenuWnd )
  1316. )
  1317. )
  1318. bForceChildProcessing = true;
  1319. } // if( hWndTest != NULL )
  1320. } // if( hWndFocus != NULL ...
  1321. if( _clock_diff >= _clock_step
  1322. || bForceChildProcessing
  1323. )
  1324. {
  1325. _clock_last = _clock_curr;
  1326. bool bNoEat = false;
  1327. if( pWndCapture->
  1328. _OnKeyDown(
  1329. (UINT)wParam,
  1330. LOWORD(lParam),
  1331. HIWORD(lParam),
  1332. bNoEat
  1333. )
  1334. )
  1335. return 1; // eat!
  1336. if( bNoEat )
  1337. return
  1338. ::CallNextHookEx(
  1339. g_DefPopupMenuSite.m_hKeyboardHook,
  1340. nCode,
  1341. wParam,
  1342. lParam
  1343. );
  1344. if( pWndCapture != NULL )
  1345. return 1; // eat!
  1346. } // if( _clock_diff >= _clock_step ...
  1347. else
  1348. return 1; // eat! 2.28 fix
  1349. } // if( (lParam & (1<<31)) == 0 )
  1350. else
  1351. {
  1352. // 2.21 fix for dialog system menu
  1353. return 1; // eat!
  1354. }
  1355. } // if( pWndCapture->GetSafeHwnd() != NULL ...
  1356. // if( ! CExtToolControlBar::g_bMenuTracking )
  1357. // return 1; // eat!
  1358. } // if( (! g_DefPopupMenuSite.IsEmpty() ) ...
  1359. if( (!CExtToolControlBar::g_bMenuTracking)
  1360. && CExtPopupMenuWnd::IsCmdKeyActivation( lParam )
  1361. && ( lParam & (1<<31) ) != 0
  1362. )
  1363. {
  1364. CExtPopupMenuWnd::CancelMenuTracking();
  1365. return
  1366. ::CallNextHookEx(
  1367. g_DefPopupMenuSite.m_hKeyboardHook,
  1368. nCode,
  1369. wParam,
  1370. lParam
  1371. );
  1372. }
  1373. // return
  1374. // ::CallNextHookEx(
  1375. // g_DefPopupMenuSite.m_hKeyboardHook,
  1376. // nCode,
  1377. // wParam,
  1378. // lParam
  1379. // );
  1380. return 1; // eat! 2.28 fix
  1381. }
  1382. void CExtPopupMenuSite::_Hook(
  1383. bool bHook // = true
  1384. )
  1385. {
  1386. if( bHook )
  1387. {
  1388. if( m_hMouseHook == NULL )
  1389. {
  1390. m_hMouseHook =
  1391. ::SetWindowsHookEx(
  1392. WH_MOUSE,
  1393. _HookMouseProc, 
  1394. 0,
  1395. ::GetCurrentThreadId()
  1396. );
  1397. ASSERT( m_hMouseHook != NULL );
  1398. }
  1399. if( m_hKeyboardHook == NULL )
  1400. {
  1401. m_hKeyboardHook =
  1402. ::SetWindowsHookEx(
  1403. WH_KEYBOARD,
  1404. _HookKeyboardProc, 
  1405. 0,
  1406. ::GetCurrentThreadId()
  1407. );
  1408. ASSERT( m_hKeyboardHook != NULL );
  1409. }
  1410. } // if( bHook )
  1411. else
  1412. {
  1413. if( m_hMouseHook != NULL )
  1414. {
  1415. ::UnhookWindowsHookEx( m_hMouseHook );
  1416. m_hMouseHook = NULL;
  1417. }
  1418. if( m_hKeyboardHook != NULL )
  1419. {
  1420. ::UnhookWindowsHookEx( m_hKeyboardHook );
  1421. m_hKeyboardHook = NULL;
  1422. }
  1423. } // else from if( bHook )
  1424. }
  1425. /////////////////////////////////////////////////////////////////////////////
  1426. // CExtWndShadow
  1427. CExtWndShadow::CExtWndShadow()
  1428. {
  1429. Destroy();
  1430. }
  1431. CExtWndShadow::CExtWndShadow( const CExtWndShadow & other )
  1432. {
  1433. Destroy();
  1434. _Assign( other );
  1435. }
  1436. CExtWndShadow::~CExtWndShadow()
  1437. {
  1438. Destroy();
  1439. }
  1440. CExtWndShadow & CExtWndShadow:: operator = ( const CExtWndShadow & other )
  1441. {
  1442. Destroy();
  1443. _Assign( other );
  1444. return (*this);
  1445. }
  1446. void CExtWndShadow::_Assign( const CExtWndShadow & other )
  1447. {
  1448. Destroy();
  1449. if( other.m_bmp0org.GetSafeHandle() != NULL )
  1450. {
  1451. COLORREF * pClrSurface = NULL;
  1452. HBITMAP hBitmap =
  1453. CExtBitmap::stat_CloneBitmap(
  1454. (HBITMAP)other.m_bmp0org.GetSafeHandle(),
  1455. NULL,
  1456. &pClrSurface
  1457. );
  1458. ASSERT( hBitmap != NULL );
  1459. if( hBitmap != NULL )
  1460. {
  1461. ASSERT( pClrSurface != NULL );
  1462. m_bmp0org.Attach( hBitmap );
  1463. }
  1464. }
  1465. if( other.m_bmp1org.GetSafeHandle() != NULL )
  1466. {
  1467. COLORREF * pClrSurface = NULL;
  1468. HBITMAP hBitmap =
  1469. CExtBitmap::stat_CloneBitmap(
  1470. (HBITMAP)other.m_bmp1org.GetSafeHandle(),
  1471. NULL,
  1472. &pClrSurface
  1473. );
  1474. ASSERT( hBitmap != NULL );
  1475. if( hBitmap != NULL )
  1476. {
  1477. ASSERT( pClrSurface != NULL );
  1478. m_bmp1org.Attach( hBitmap );
  1479. }
  1480. }
  1481. if( other.m_bmp0mak.GetSafeHandle() != NULL )
  1482. {
  1483. COLORREF * pClrSurface = NULL;
  1484. HBITMAP hBitmap =
  1485. CExtBitmap::stat_CloneBitmap(
  1486. (HBITMAP)other.m_bmp0mak.GetSafeHandle(),
  1487. NULL,
  1488. &pClrSurface
  1489. );
  1490. ASSERT( hBitmap != NULL );
  1491. if( hBitmap != NULL )
  1492. {
  1493. ASSERT( pClrSurface != NULL );
  1494. m_bmp0mak.Attach( hBitmap );
  1495. }
  1496. }
  1497. if( other.m_bmp1mak.GetSafeHandle() != NULL )
  1498. {
  1499. COLORREF * pClrSurface = NULL;
  1500. HBITMAP hBitmap =
  1501. CExtBitmap::stat_CloneBitmap(
  1502. (HBITMAP)other.m_bmp1mak.GetSafeHandle(),
  1503. NULL,
  1504. &pClrSurface
  1505. );
  1506. ASSERT( hBitmap != NULL );
  1507. if( hBitmap != NULL )
  1508. {
  1509. ASSERT( pClrSurface != NULL );
  1510. m_bmp1mak.Attach( hBitmap );
  1511. }
  1512. }
  1513. m_rcWndArea = other.m_rcWndArea;
  1514. m_rc1stArea = other.m_rc1stArea;
  1515. m_rc2ndArea = other.m_rc2ndArea;
  1516. m_nShadowSize = other.m_nShadowSize;
  1517. m_nBr0 = other.m_nBr0;
  1518. m_nBr1 = other.m_nBr1;
  1519. m_bEnablePhotos = other.m_bEnablePhotos;
  1520. m_bEnablePaintManagerColor = other.m_bEnablePaintManagerColor;
  1521. if( other.m_rgnSafe.GetSafeHandle() != NULL )
  1522. {
  1523. if( m_rgnSafe.CreateRectRgn( 0, 0, 0, 0 ) )
  1524. {
  1525. int nCombineResult =
  1526. m_rgnSafe.CombineRgn(
  1527. &m_rgnSafe,
  1528. (CRgn*)&other.m_rgnSafe,
  1529. RGN_OR
  1530. );
  1531. ASSERT( nCombineResult != ERROR );
  1532. nCombineResult;
  1533. } // if( m_rgnSafe.CreateRectRgn( 0, 0, 0, 0 ) )
  1534. #ifdef _DEBUG
  1535. else
  1536. {
  1537. ASSERT( FALSE );
  1538. } // else from if( m_rgnSafe.CreateRectRgn( 0, 0, 0, 0 ) )
  1539. #endif // _DEBUG
  1540. } // if( other.m_rgnSafe.GetSafeHandle() != NULL )
  1541. }
  1542. void CExtWndShadow::ApplyFloatingImage(
  1543. HWND hWndStatic,
  1544. HWND hWndFloat,
  1545. LPCRECT pRectCustomFloatPos // = NULL
  1546. )
  1547. {
  1548. if( m_bmp0mak.GetSafeHandle() == NULL
  1549. && m_bmp1mak.GetSafeHandle() == NULL
  1550. )
  1551. return;
  1552. if( hWndStatic == NULL
  1553. || hWndFloat == NULL
  1554. || (! ::IsWindow(hWndStatic) )
  1555. || (! ::IsWindow(hWndFloat) )
  1556. )
  1557. {
  1558. ASSERT( FALSE );
  1559. return;
  1560. }
  1561. CRect rcWndStatic = m_rcWndArea, rcWndFloat;
  1562. ::ClientToScreen( hWndStatic, ((LPPOINT)(&rcWndStatic)) );
  1563. ::ClientToScreen( hWndStatic, ((LPPOINT)(&rcWndStatic))+1 );
  1564. if( pRectCustomFloatPos != NULL )
  1565. rcWndFloat = (*pRectCustomFloatPos);
  1566. else
  1567. ::GetWindowRect( hWndFloat, rcWndFloat );
  1568. CRect rcIntersection;
  1569. if( ! rcIntersection.IntersectRect(
  1570. &rcWndStatic,
  1571. &rcWndFloat
  1572. )
  1573. )
  1574. return;
  1575. HBITMAP hBmpFloat =
  1576. CExtPaintManager::stat_PrintWnd( hWndFloat );
  1577. if( hBmpFloat == NULL )
  1578. {
  1579. ASSERT( FALSE );
  1580. return;
  1581. }
  1582. CPoint ptOffset =
  1583. rcWndFloat.TopLeft()
  1584. - rcWndStatic.TopLeft()
  1585. ;
  1586. CBitmap _bmpFloatDestructor;
  1587. _bmpFloatDestructor.Attach( hBmpFloat );
  1588. BITMAP _bmpInfo;
  1589. ::memset( &_bmpInfo, 0, sizeof(BITMAP) );
  1590. ::GetObject( hBmpFloat, sizeof(BITMAP), &_bmpInfo );
  1591. if( ! ( _bmpInfo.bmWidth > 0 && _bmpInfo.bmHeight > 0 ) )
  1592. {
  1593. ASSERT( FALSE );
  1594. return;
  1595. }
  1596. CDC dcSrc, dcDst;
  1597. if( (! dcSrc.CreateCompatibleDC( NULL ) )
  1598. || (! dcDst.CreateCompatibleDC( NULL ) )
  1599. )
  1600. {
  1601. ASSERT( FALSE );
  1602. return;
  1603. }
  1604. HGDIOBJ hBmpOldSrc = ::SelectObject( dcSrc.GetSafeHdc(), hBmpFloat );
  1605. if( m_bmp0mak.GetSafeHandle() != NULL )
  1606. {
  1607. CBitmap * pOldBmpDst = dcDst.SelectObject( &m_bmp0mak );
  1608. dcDst.BitBlt(
  1609. ptOffset.x - m_rcWndArea.Width(),
  1610. ptOffset.y,
  1611. _bmpInfo.bmWidth,
  1612. _bmpInfo.bmHeight,
  1613. &dcSrc,
  1614. 0,
  1615. 0,
  1616. SRCCOPY
  1617. );
  1618. dcDst.SelectObject( pOldBmpDst );
  1619. }
  1620. if( m_bmp1mak.GetSafeHandle() != NULL )
  1621. {
  1622. CBitmap * pOldBmpDst = dcDst.SelectObject( &m_bmp1mak );
  1623. dcDst.BitBlt(
  1624. ptOffset.x,
  1625. ptOffset.y - m_rcWndArea.Height(),
  1626. _bmpInfo.bmWidth,
  1627. _bmpInfo.bmHeight,
  1628. &dcSrc,
  1629. 0,
  1630. 0,
  1631. SRCCOPY
  1632. );
  1633. dcDst.SelectObject( pOldBmpDst );
  1634. }
  1635. ::SelectObject( dcSrc.GetSafeHdc(), hBmpOldSrc );
  1636. }
  1637. void CExtWndShadow::_DoPixelOvershadow(
  1638. int nMakeSpec,
  1639. int nPosX,
  1640. int nPosY,
  1641. COLORREF clrShadowAdjust
  1642. )
  1643. {
  1644. ASSERT( nMakeSpec >= 0 && nMakeSpec <= 100 );
  1645. ASSERT( ! m_rcWndArea.IsRectEmpty() );
  1646. //  ASSERT( nPosX < m_rcWndArea.Width() + INT(m_nShadowSize) );
  1647. //  ASSERT( nPosY < m_rcWndArea.Height() + INT(m_nShadowSize) );
  1648. if( nPosX >= m_rcWndArea.Width() + INT(m_nShadowSize) )
  1649. return;
  1650. if( nPosY >= m_rcWndArea.Height() + INT(m_nShadowSize) )
  1651. return;
  1652. ASSERT( m_pHelperDibSurface != NULL );
  1653. int nTotalWidth = m_rcWndArea.Width()+m_nShadowSize;
  1654. int nTotalHeight = m_rcWndArea.Height()+m_nShadowSize;
  1655. COLORREF * ptr =
  1656. m_pHelperDibSurface
  1657. + nPosX
  1658. + (nTotalHeight-nPosY)*nTotalWidth;
  1659. COLORREF clrAdj = *ptr;
  1660. if( clrShadowAdjust != ((COLORREF)(-1)) )
  1661. {
  1662. int nMakeSpecR = nMakeSpec + ::MulDiv( (100-nMakeSpec), GetBValue(clrShadowAdjust), 255 );
  1663. int nMakeSpecG = nMakeSpec + ::MulDiv( (100-nMakeSpec), GetGValue(clrShadowAdjust), 255 );
  1664. int nMakeSpecB = nMakeSpec + ::MulDiv( (100-nMakeSpec), GetRValue(clrShadowAdjust), 255 );
  1665. if( nMakeSpecR > 100 )
  1666. nMakeSpecR = 100;
  1667. if( nMakeSpecG > 100 )
  1668. nMakeSpecG = 100;
  1669. if( nMakeSpecB > 100 )
  1670. nMakeSpecB = 100;
  1671. clrAdj = 
  1672. RGB(
  1673. (( nMakeSpecR * int(GetRValue(clrAdj)) ) / 100),
  1674. (( nMakeSpecG * int(GetGValue(clrAdj)) ) / 100),
  1675. (( nMakeSpecB * int(GetBValue(clrAdj)) ) / 100)
  1676. );
  1677. } // if( clrShadowAdjust != ((COLORREF)(-1)) )
  1678. else
  1679. {
  1680. clrAdj = 
  1681. RGB(
  1682. (( nMakeSpec * int(GetRValue(clrAdj)) ) / 100),
  1683. (( nMakeSpec * int(GetGValue(clrAdj)) ) / 100),
  1684. (( nMakeSpec * int(GetBValue(clrAdj)) ) / 100)
  1685. );
  1686. } // else from if( clrShadowAdjust != ((COLORREF)(-1)) )
  1687. *ptr = clrAdj;
  1688. }
  1689. bool CExtWndShadow::HavePhotos() const
  1690. {
  1691. ASSERT( m_nShadowSize >= 0 );
  1692. if( m_nShadowSize == 0
  1693. || m_rcWndArea.IsRectEmpty()
  1694. )
  1695. return false;
  1696. if( m_bmp0mak.GetSafeHandle() == NULL
  1697. || m_bmp1mak.GetSafeHandle() == NULL
  1698. )
  1699. return false;
  1700. return true;
  1701. }
  1702. bool CExtWndShadow::_HaveOriginals() const
  1703. {
  1704. ASSERT( m_nShadowSize >= 0 );
  1705. if( m_nShadowSize == 0
  1706. || m_rcWndArea.IsRectEmpty()
  1707. )
  1708. return false;
  1709. if( m_bmp0org.GetSafeHandle() == NULL
  1710. || m_bmp1org.GetSafeHandle() == NULL
  1711. )
  1712. return false;
  1713. return true;
  1714. }
  1715. bool CExtWndShadow::_RestoreOriginals( CDC & dc )
  1716. {
  1717. ASSERT( m_nShadowSize >= 0 );
  1718. if( m_nShadowSize == 0
  1719. || m_rcWndArea.IsRectEmpty ()
  1720. )
  1721. return true;
  1722. if( ! _HaveOriginals() )
  1723. return false;
  1724. INT nWndAreaDX = m_rcWndArea.Width();
  1725. INT nWndAreaDY = m_rcWndArea.Height();
  1726. ASSERT( nWndAreaDX > 0 && nWndAreaDY > 0 );
  1727. CDC dcmm;
  1728. if( ! dcmm.CreateCompatibleDC(&dc) )
  1729. {
  1730. ASSERT( FALSE );
  1731. return false;
  1732. }
  1733. CBitmap * pbmpold = dcmm.SelectObject( &m_bmp0org );
  1734. ASSERT( pbmpold != NULL );
  1735. dc.BitBlt(
  1736. m_rcWndArea.Width(),
  1737. 0,
  1738. m_nShadowSize,
  1739. nWndAreaDY + m_nShadowSize,
  1740. &dcmm,
  1741. 0,
  1742. 0,
  1743. SRCCOPY
  1744. );
  1745. dcmm.SelectObject( &m_bmp1org );
  1746. dc.BitBlt(
  1747. 0,
  1748. m_rcWndArea.Height(),
  1749. nWndAreaDX + m_nShadowSize,
  1750. m_nShadowSize,
  1751. &dcmm,
  1752. 0,
  1753. 0,
  1754. SRCCOPY
  1755. );
  1756. dcmm.SelectObject( pbmpold );
  1757. return true;
  1758. }
  1759. bool CExtWndShadow::Restore( CDC & dc )
  1760. {
  1761. ASSERT( m_nShadowSize >= 0 );
  1762. if( m_nShadowSize == 0
  1763. || m_rcWndArea.IsRectEmpty ()
  1764. )
  1765. return true;
  1766. if( ! HavePhotos() )
  1767. return false;
  1768. INT nWndAreaDX = m_rcWndArea.Width();
  1769. INT nWndAreaDY = m_rcWndArea.Height();
  1770. ASSERT( nWndAreaDX > 0 && nWndAreaDY > 0 );
  1771. CDC dcmm;
  1772. if( ! dcmm.CreateCompatibleDC(&dc) )
  1773. {
  1774. ASSERT( FALSE );
  1775. return false;
  1776. }
  1777. if( m_rgnSafe.GetSafeHandle() != NULL )
  1778. dc.SelectClipRgn( &m_rgnSafe, RGN_AND );
  1779. CBitmap * pbmpold = dcmm.SelectObject( &m_bmp0mak );
  1780. ASSERT( pbmpold != NULL );
  1781. dc.BitBlt(
  1782. m_rcWndArea.right,
  1783. m_rcWndArea.top,
  1784. m_nShadowSize,
  1785. nWndAreaDY + m_nShadowSize,
  1786. &dcmm,
  1787. 0,
  1788. 0,
  1789. SRCCOPY
  1790. );
  1791. dcmm.SelectObject( &m_bmp1mak );
  1792. dc.BitBlt(
  1793. m_rcWndArea.left,
  1794. m_rcWndArea.bottom,
  1795. nWndAreaDX + m_nShadowSize,
  1796. m_nShadowSize,
  1797. &dcmm,
  1798. 0,
  1799. 0,
  1800. SRCCOPY
  1801. );
  1802. dcmm.SelectObject( pbmpold );
  1803. if( m_rgnSafe.GetSafeHandle() != NULL )
  1804. dc.SelectClipRgn( NULL );
  1805. return true;
  1806. }
  1807. bool CExtWndShadow::Paint(
  1808. CExtPaintManager * pPM,
  1809. CDC & dc,
  1810. const CRect & rcWndArea,
  1811. const CRect & rc1stArea, // = CRect(0,0,0,0)
  1812. const CRect & rc2ndArea, // = CRect(0,0,0,0)
  1813. UINT nShadowSize, // = DEF_SHADOW_SIZE
  1814. UINT nBr0, // = DEF_BRIGHTNESS_MIN
  1815. UINT nBr1, // = DEF_BRIGHTNESS_MAX
  1816. bool bEnablePhotos, // = true
  1817. bool bEnablePaintManagerColor, // = true
  1818. bool m_bMakePhotosOnly, // = false
  1819. HWND hWndStatic, // = NULL
  1820. HWND hWndFloat, // = NULL
  1821. LPCRECT pRectCustomFloatPos // = NULL
  1822. )
  1823. {
  1824. m_rcWndArea = rcWndArea;
  1825. m_rc1stArea = rc1stArea;
  1826. m_rc2ndArea = rc2ndArea;
  1827. m_nShadowSize = nShadowSize;
  1828. m_nBr0 = nBr0;
  1829. m_nBr1 = nBr1;
  1830. m_bEnablePhotos = bEnablePhotos;
  1831. m_bEnablePaintManagerColor = bEnablePaintManagerColor;
  1832. return
  1833. Paint(
  1834. pPM,
  1835. dc,
  1836. m_bMakePhotosOnly,
  1837. hWndStatic,
  1838. hWndFloat,
  1839. pRectCustomFloatPos
  1840. );
  1841. }
  1842. bool CExtWndShadow::Paint(
  1843. CExtPaintManager * pPM,
  1844. CDC & dc,
  1845. bool m_bMakePhotosOnly, // = false
  1846. HWND hWndStatic, // = NULL
  1847. HWND hWndFloat, // = NULL
  1848. LPCRECT pRectCustomFloatPos // = NULL
  1849. )
  1850. {
  1851. ASSERT( m_nShadowSize >= 0 );
  1852. ASSERT( ! m_rcWndArea.IsRectEmpty() );
  1853. if( m_nShadowSize == 0
  1854. || m_rcWndArea.IsRectEmpty()
  1855. )
  1856. return true;
  1857. if( hWndFloat != NULL )
  1858. {
  1859. ASSERT( hWndStatic != NULL );
  1860. ASSERT( ::IsWindow( hWndFloat ) );
  1861. ASSERT( ::IsWindow( hWndStatic ) );
  1862. __EXT_MFC_LONG_PTR dwStyle = ::__EXT_MFC_GetWindowLong(hWndFloat,GWL_STYLE);
  1863. if( (dwStyle&WS_VISIBLE) == 0 )
  1864. hWndFloat = hWndStatic = NULL;
  1865. } // if( hWndFloat != NULL )
  1866. else
  1867. {
  1868. hWndStatic = NULL;
  1869. } // else from if( hWndFloat != NULL )
  1870. if( ! _HaveOriginals() )
  1871. _MakeOriginals( dc );
  1872. INT nWndAreaDX = m_rcWndArea.Width();
  1873. INT nWndAreaDY = m_rcWndArea.Height();
  1874. if( m_rgnSafe.GetSafeHandle() == NULL
  1875. && (! m_rc1stArea.IsRectEmpty() )
  1876. && (! m_rc2ndArea.IsRectEmpty() )
  1877. )
  1878. {
  1879. CRect rc1(
  1880. m_rcWndArea.right,
  1881. m_rcWndArea.top,
  1882. m_rcWndArea.right + m_nShadowSize,
  1883. m_rcWndArea.top + nWndAreaDY + m_nShadowSize
  1884. );
  1885. CRect rc2(
  1886. m_rcWndArea.left,
  1887. m_rcWndArea.bottom,
  1888. m_rcWndArea.left + nWndAreaDX + m_nShadowSize,
  1889. m_rcWndArea.bottom + m_nShadowSize
  1890. );
  1891. m_rgnSafe.CreateRectRgnIndirect( &rc1 );
  1892. if( m_rgnSafe.GetSafeHandle() != NULL )
  1893. {
  1894. CRgn rgnSecond;
  1895. rgnSecond.CreateRectRgnIndirect( &rc2 );
  1896. if( rgnSecond.GetSafeHandle() != NULL
  1897. && m_rgnSafe.CombineRgn( &m_rgnSafe, &rgnSecond, RGN_OR ) != ERROR
  1898. )
  1899. {
  1900. }
  1901. else
  1902. m_rgnSafe.DeleteObject();
  1903. } // if( m_rgnSafe.GetSafeHandle() != NULL )
  1904. } // if( m_rgnSafe.GetSafeHandle() == NULL ...
  1905. if( m_bMakePhotosOnly && m_bEnablePhotos )
  1906. {
  1907. CDC dcCache;
  1908. CBitmap bmpCache;
  1909. int nDX = nWndAreaDX + m_nShadowSize;
  1910. int nDY = nWndAreaDY + m_nShadowSize;
  1911. nDX += m_rc2ndArea.Width();
  1912. nDY += m_rc2ndArea.Height();
  1913. if( dcCache.CreateCompatibleDC( &dc )
  1914. && bmpCache.CreateCompatibleBitmap( &dc, nDX, nDY )
  1915. )
  1916. {
  1917. CBitmap * pOldBmp = dcCache.SelectObject( &bmpCache );
  1918. bool bRetVal = false;
  1919. if( dcCache.BitBlt(
  1920. 0, 0, nDX, nDY,
  1921. &dc, 0, 0, SRCCOPY
  1922. )
  1923. )
  1924. {
  1925. bRetVal = Paint( pPM, dcCache, false );
  1926. ASSERT( bRetVal );
  1927. }
  1928. #ifdef _DEBUG
  1929. else
  1930. {
  1931. ASSERT( FALSE );
  1932. }
  1933. #endif // _DEBUG
  1934. dcCache.SelectObject( pOldBmp );
  1935. return bRetVal;
  1936. }
  1937. #ifdef _DEBUG
  1938. else
  1939. {
  1940. ASSERT( FALSE );
  1941. }
  1942. #endif // _DEBUG
  1943. } // if( m_bMakePhotosOnly && m_bEnablePhotos )
  1944. if( m_rgnSafe.GetSafeHandle() != NULL )
  1945. dc.SelectClipRgn( &m_rgnSafe, RGN_AND );
  1946. bool bRetVal = true, bDoPaint = false;
  1947. if( _HaveOriginals() && hWndStatic != NULL && hWndFloat != NULL )
  1948. bDoPaint = true;
  1949. if( ! bDoPaint )
  1950. {
  1951. if( ! Restore( dc ) )
  1952. bDoPaint = true;
  1953. }
  1954. if( bDoPaint )
  1955. {
  1956. if( CExtPaintManager::stat_GetBPP() > 8 )
  1957. bRetVal =
  1958. _PaintHi(
  1959. pPM,
  1960. dc,
  1961. hWndStatic,
  1962. hWndFloat,
  1963. pRectCustomFloatPos
  1964. );
  1965. else
  1966. bRetVal =
  1967. _PaintLo(
  1968. pPM,
  1969. dc,
  1970. hWndStatic,
  1971. hWndFloat,
  1972. pRectCustomFloatPos
  1973. );
  1974. }
  1975. if( m_rgnSafe.GetSafeHandle() != NULL )
  1976. dc.SelectClipRgn( NULL );
  1977. return bRetVal;
  1978. }
  1979. bool CExtWndShadow::_PaintLo(
  1980. CExtPaintManager * pPM,
  1981. CDC & dc,
  1982. HWND hWndStatic, // = NUL
  1983. HWND hWndFloat, // = NULL
  1984. LPCRECT pRectCustomFloatPos // = NULL
  1985. )
  1986. {
  1987. if( pPM == NULL )
  1988. pPM = g_PaintManager.GetPM();
  1989. ASSERT_VALID( pPM );
  1990. INT nWndAreaDX = m_rcWndArea.Width();
  1991. INT nWndAreaDY = m_rcWndArea.Height();
  1992. if( m_bmp0mak.GetSafeHandle() != NULL )
  1993. m_bmp0mak.DeleteObject();
  1994. if( m_bmp1mak.GetSafeHandle() != NULL )
  1995. m_bmp1mak.DeleteObject();
  1996. static int _Pattern[] =
  1997. {
  1998. ~0xAA,
  1999. ~0x55,
  2000. ~0xAA,
  2001. ~0x55,
  2002. ~0xAA,
  2003. ~0x55,
  2004. ~0xAA,
  2005. ~0x55
  2006. };
  2007. CBitmap _bitmapPattern;
  2008. CBrush _brushPattern;
  2009. if( (! _bitmapPattern.CreateBitmap( 8, 8, 1, 1, _Pattern ) )
  2010. || (! _brushPattern.CreatePatternBrush( &_bitmapPattern ) )
  2011. )
  2012. return false;
  2013. CRect rcMM(
  2014. m_rcWndArea.left,
  2015. m_rcWndArea.top,
  2016. m_rcWndArea.right + nWndAreaDX,
  2017. m_rcWndArea.bottom + nWndAreaDY
  2018. );
  2019. CExtMemoryDC dcmm(
  2020. &dc,
  2021. &rcMM,
  2022. /// CExtMemoryDC::MDCOPT_RTL_COMPATIBILITY |
  2023. CExtMemoryDC::MDCOPT_TO_MEMORY
  2024. );
  2025. ASSERT( dcmm.GetSafeHdc() != NULL );
  2026. if( dcmm.GetSafeHdc() == NULL )
  2027. return false;
  2028. dcmm.SetViewportOrg( 0, 0 );
  2029. dcmm.SetWindowOrg( 0, 0 );
  2030. CPalette * pOldPalette = NULL;
  2031. if( (::GetDeviceCaps(dcmm.m_hDC,RASTERCAPS) & RC_PALETTE) != 0 )
  2032. {
  2033.         pOldPalette =
  2034. dcmm.SelectPalette( & pPM->m_PaletteWide, FALSE );
  2035.         dcmm.RealizePalette();
  2036.     }
  2037. dcmm.BitBlt(
  2038. 0,
  2039. 0,
  2040. nWndAreaDX + m_nShadowSize,
  2041. nWndAreaDY + m_nShadowSize,
  2042. &dc,
  2043. m_rcWndArea.left,
  2044. m_rcWndArea.top,
  2045. SRCCOPY
  2046. );
  2047. if( _HaveOriginals() )
  2048. _RestoreOriginals( dcmm );
  2049. if( hWndStatic != NULL && hWndFloat != NULL )
  2050. {
  2051. ASSERT( ::IsWindow(hWndStatic) );
  2052. ASSERT( ::IsWindow(hWndFloat) );
  2053. CRect rcWndStatic = m_rcWndArea, rcWndFloat;
  2054. ::ClientToScreen( hWndStatic, ((LPPOINT)(&rcWndStatic)) );
  2055. ::ClientToScreen( hWndStatic, ((LPPOINT)(&rcWndStatic))+1 );
  2056. if( pRectCustomFloatPos != NULL )
  2057. rcWndFloat = (*pRectCustomFloatPos);
  2058. else
  2059. ::GetWindowRect( hWndFloat, rcWndFloat );
  2060. HBITMAP hBmpFloat =
  2061. CExtPaintManager::stat_PrintWnd( hWndFloat );
  2062. if( hBmpFloat == NULL )
  2063. {
  2064. ASSERT( FALSE );
  2065. return false;
  2066. }
  2067. CPoint ptOffset =
  2068. rcWndFloat.TopLeft()
  2069. - rcWndStatic.TopLeft()
  2070. ;
  2071. CBitmap _bmpFloatDestructor;
  2072. _bmpFloatDestructor.Attach( hBmpFloat );
  2073. BITMAP _bmpInfo;
  2074. ::memset( &_bmpInfo, 0, sizeof(BITMAP) );
  2075. ::GetObject( hBmpFloat, sizeof(BITMAP), &_bmpInfo );
  2076. if( ! ( _bmpInfo.bmWidth > 0 && _bmpInfo.bmHeight > 0 ) )
  2077. {
  2078. ASSERT( FALSE );
  2079. return false;
  2080. }
  2081. CDC dcSrc;
  2082. if(! dcSrc.CreateCompatibleDC( NULL ) )
  2083. {
  2084. ASSERT( FALSE );
  2085. return false;
  2086. }
  2087. HGDIOBJ hBmpOldSrc = ::SelectObject( dcSrc.GetSafeHdc(), hBmpFloat );
  2088. dcmm.BitBlt(
  2089. ptOffset.x,
  2090. ptOffset.y,
  2091. _bmpInfo.bmWidth,
  2092. _bmpInfo.bmHeight,
  2093. &dcSrc,
  2094. 0,
  2095. 0,
  2096. SRCCOPY
  2097. );
  2098. ::SelectObject( dcSrc.GetSafeHdc(), hBmpOldSrc );
  2099. _bmpFloatDestructor.DeleteObject();
  2100. } // if( hWndStatic != NULL && hWndFloat != NULL )
  2101. UINT nPaintShadowSize =
  2102. ( m_nShadowSize > 4 )
  2103. ? 4
  2104. : m_nShadowSize
  2105. ;
  2106. CRect rV( nWndAreaDX,
  2107. nPaintShadowSize,
  2108. nWndAreaDX + nPaintShadowSize,
  2109. nWndAreaDY
  2110. );
  2111. CRect rH( nPaintShadowSize,
  2112. nWndAreaDY,
  2113. nWndAreaDX + nPaintShadowSize,
  2114. nWndAreaDY + nPaintShadowSize
  2115. );
  2116. CBrush * pOldBrush = dcmm.SelectObject( &_brushPattern );
  2117. dcmm.PatBlt( rH.left, rH.top, rH.Width(), rH.Height(), 0xA000C9 );
  2118. dcmm.PatBlt( rV.left, rV.top, rV.Width(), rV.Height(), 0xA000C9 );
  2119. dcmm.SelectObject( pOldBrush );
  2120. dc.ExcludeClipRect( &m_rcWndArea );
  2121. if( m_rgnSafe.GetSafeHandle() != NULL )
  2122. dc.SelectClipRgn( &m_rgnSafe, RGN_AND );
  2123. dc.BitBlt(
  2124. m_rcWndArea.left,
  2125. m_rcWndArea.top,
  2126. nWndAreaDX + m_nShadowSize,
  2127. nWndAreaDY + m_nShadowSize, 
  2128. &dcmm,
  2129. 0,
  2130. 0,
  2131. SRCCOPY
  2132. );
  2133. dc.SelectClipRgn( NULL );
  2134. if( m_bEnablePhotos )
  2135. {
  2136. if( ! _MakePhotos(dc,dcmm) )
  2137. {
  2138. ASSERT( FALSE );
  2139. return false;
  2140. }
  2141. }
  2142. if( pOldPalette != NULL )
  2143. dcmm.SelectPalette( pOldPalette, FALSE );
  2144. dcmm.__Flush( FALSE );
  2145. return true;
  2146. }
  2147. bool CExtWndShadow::_PaintHi(
  2148. CExtPaintManager * pPM,
  2149. CDC & dc,
  2150. HWND hWndStatic, // = NULL
  2151. HWND hWndFloat, // = NULL
  2152. LPCRECT pRectCustomFloatPos // = NULL
  2153. )
  2154. {
  2155. if( pPM == NULL )
  2156. pPM = g_PaintManager.GetPM();
  2157. ASSERT_VALID( pPM );
  2158. INT nWndAreaDX = m_rcWndArea.Width();
  2159. INT nWndAreaDY = m_rcWndArea.Height();
  2160. CDC dcmm;
  2161. if( ! dcmm.CreateCompatibleDC( &dc ) )
  2162. {
  2163. ASSERT( FALSE );
  2164. return false;
  2165. }
  2166. COLORREF clrShadowAdjust = ((COLORREF)(-1));
  2167. if( m_bEnablePaintManagerColor )
  2168. clrShadowAdjust = pPM->GetShadowAdjustColor();
  2169. BITMAPINFOHEADER bih;
  2170. bih.biSize = sizeof(BITMAPINFOHEADER);
  2171. bih.biWidth = nWndAreaDX+m_nShadowSize;
  2172. bih.biHeight = nWndAreaDY+m_nShadowSize;
  2173. bih.biPlanes = 1;
  2174. bih.biBitCount = 32;
  2175. bih.biCompression = BI_RGB;
  2176. bih.biSizeImage = (nWndAreaDX+m_nShadowSize) * (nWndAreaDY+m_nShadowSize);
  2177. bih.biXPelsPerMeter = 0;
  2178. bih.biYPelsPerMeter = 0;
  2179. bih.biClrUsed = 0;
  2180. bih.biClrImportant = 0;
  2181. ASSERT( m_pHelperDibSurface == NULL );
  2182. HBITMAP hDIB =
  2183. ::CreateDIBSection(
  2184. dcmm.GetSafeHdc(),
  2185. (LPBITMAPINFO)&bih,
  2186. DIB_RGB_COLORS,
  2187. (void **)&m_pHelperDibSurface,
  2188. NULL,
  2189. NULL
  2190. );
  2191. if( hDIB == NULL || m_pHelperDibSurface == NULL )
  2192. {
  2193. ASSERT( FALSE );
  2194. return false;
  2195. }
  2196. HGDIOBJ hOldSurface = dcmm.SelectObject( hDIB );
  2197. dcmm.BitBlt(
  2198. 0,
  2199. 0,
  2200. nWndAreaDX + m_nShadowSize,
  2201. nWndAreaDY + m_nShadowSize,
  2202. &dc,
  2203. m_rcWndArea.left,
  2204. m_rcWndArea.top,
  2205. SRCCOPY
  2206. );
  2207. if( _HaveOriginals() )
  2208. _RestoreOriginals( dcmm );
  2209. if( hWndStatic != NULL && hWndFloat != NULL )
  2210. {
  2211. ASSERT( ::IsWindow(hWndStatic) );
  2212. ASSERT( ::IsWindow(hWndFloat) );
  2213. CRect rcWndStatic = m_rcWndArea, rcWndFloat;
  2214. ::ClientToScreen( hWndStatic, ((LPPOINT)(&rcWndStatic)) );
  2215. ::ClientToScreen( hWndStatic, ((LPPOINT)(&rcWndStatic))+1 );
  2216. if( pRectCustomFloatPos != NULL )
  2217. rcWndFloat = (*pRectCustomFloatPos);
  2218. else
  2219. ::GetWindowRect( hWndFloat, rcWndFloat );
  2220. HBITMAP hBmpFloat =
  2221. CExtPaintManager::stat_PrintWnd( hWndFloat );
  2222. if( hBmpFloat == NULL )
  2223. {
  2224. ASSERT( FALSE );
  2225. return false;
  2226. }
  2227. CPoint ptOffset =
  2228. rcWndFloat.TopLeft()
  2229. - rcWndStatic.TopLeft()
  2230. ;
  2231. CBitmap _bmpFloatDestructor;
  2232. _bmpFloatDestructor.Attach( hBmpFloat );
  2233. BITMAP _bmpInfo;
  2234. ::memset( &_bmpInfo, 0, sizeof(BITMAP) );
  2235. ::GetObject( hBmpFloat, sizeof(BITMAP), &_bmpInfo );
  2236. if( ! ( _bmpInfo.bmWidth > 0 && _bmpInfo.bmHeight > 0 ) )
  2237. {
  2238. ASSERT( FALSE );
  2239. return false;
  2240. }
  2241. CDC dcSrc;
  2242. if( ! dcSrc.CreateCompatibleDC( NULL ) )
  2243. {
  2244. ASSERT( FALSE );
  2245. return false;
  2246. }
  2247. HGDIOBJ hBmpOldSrc = ::SelectObject( dcSrc.GetSafeHdc(), hBmpFloat );
  2248. dcmm.BitBlt(
  2249. ptOffset.x,
  2250. ptOffset.y,
  2251. _bmpInfo.bmWidth,
  2252. _bmpInfo.bmHeight,
  2253. &dcSrc,
  2254. 0,
  2255. 0,
  2256. SRCCOPY
  2257. );
  2258. ::SelectObject( dcSrc.GetSafeHdc(), hBmpOldSrc );
  2259. _bmpFloatDestructor.DeleteObject();
  2260. } // if( hWndStatic != NULL && hWndFloat != NULL )
  2261. UINT nBrDiff = m_nBr1 - m_nBr0;
  2262. LONG n2nd, nStep, nDist, nDist1;
  2263. LONG nDist2 = m_nShadowSize * m_nShadowSize;
  2264. INT nMakeSpec;
  2265. bool bCmbaV = false, bCmbaH = false,
  2266. bCmbaVrt = false, bCmbaVrb = false,
  2267. bCmbaHrb = false, bCmbaHlb = false,
  2268. bCmbaLA = false;
  2269. INT nX0 = 0, nX1 = nWndAreaDX,
  2270. nY0 = 0, nY1 = nWndAreaDY,
  2271. nLa0 = 0, nLa1 = 0;
  2272. if( !( m_rc1stArea.IsRectEmpty() || m_rc2ndArea.IsRectEmpty() ) )
  2273. {
  2274. bool bCmbaDetected = false;
  2275. if( m_rc1stArea.right == m_rc2ndArea.right )
  2276. { // vertical-right combining
  2277. bCmbaDetected = true;
  2278. if( m_rc1stArea.top < m_rc2ndArea.top )
  2279. bCmbaVrb = true;
  2280. else
  2281. bCmbaVrt = true;
  2282. } // vertical-right combining
  2283. if( (! bCmbaDetected )
  2284. && m_rc1stArea.left == m_rc2ndArea.left
  2285. )
  2286. { // vertical-left combining
  2287. if( m_rc2ndArea.bottom >= m_rc1stArea.top-1
  2288. && m_rc2ndArea.top < m_rc1stArea.top
  2289. )
  2290. {
  2291. if( m_rc2ndArea.right >= m_rc1stArea.right )
  2292. {
  2293. bCmbaDetected = true;
  2294. bCmbaV = true;
  2295. }
  2296. }
  2297. if( (! bCmbaDetected )
  2298. && m_rc1stArea.bottom >= m_rc2ndArea.top-1 
  2299. && m_rc1stArea.top < m_rc2ndArea.top
  2300. )
  2301. {
  2302. if( m_rc1stArea.right >= m_rc2ndArea.right )
  2303. {
  2304. bCmbaDetected = true;
  2305. bCmbaH = true;
  2306. nX0 =
  2307. m_rcWndArea.right  -
  2308. (m_rc1stArea.right - m_rc2ndArea.right);
  2309. }
  2310. }
  2311. } // vertical-left combining
  2312. if( (! bCmbaDetected )
  2313. && m_rc1stArea.bottom == m_rc2ndArea.bottom
  2314. )
  2315. { // horizontal-bottom combining
  2316. bCmbaDetected = true;
  2317. if( m_rc1stArea.left < m_rc2ndArea.left )
  2318. bCmbaHrb = true;
  2319. else
  2320. bCmbaHlb = true;
  2321. } // horizontal-bottom combining
  2322. if( (!bCmbaDetected)
  2323. && m_rc1stArea.right == m_rc2ndArea.left+1
  2324. )
  2325. {
  2326. bCmbaDetected = true;
  2327. bCmbaLA = true;
  2328. nLa0 = m_rcWndArea.top
  2329. + m_rc2ndArea.bottom - m_rc1stArea.top;
  2330. nLa1 = nLa0 + m_nShadowSize;
  2331. }
  2332. if( (! bCmbaDetected )
  2333. && m_rc1stArea.left == m_rc2ndArea.right - 1
  2334. )
  2335. {
  2336. bCmbaDetected = true;
  2337. bCmbaH = true;
  2338. }
  2339. bCmbaDetected;
  2340. } // if( !( m_rc1stArea.IsRectEmpty() || m_rc2ndArea.IsRectEmpty() ) )
  2341. for( nStep = 0; ULONG(nStep) < m_nShadowSize; nStep++ )
  2342. {
  2343. nMakeSpec = m_nBr0 + ( nStep * nBrDiff ) / m_nShadowSize;
  2344. for( n2nd = nX0
  2345. + m_nShadowSize * 2 + 1
  2346. - ( bCmbaH ? ( m_nShadowSize * 2 - nStep ) : 0 )
  2347. - ( bCmbaHlb ? m_nShadowSize : 0 )
  2348. ;
  2349. n2nd < LONG(nX1) + ( bCmbaHrb ? LONG(m_nShadowSize) : 0 );
  2350. n2nd++
  2351. )
  2352. _DoPixelOvershadow(
  2353. nMakeSpec,
  2354. n2nd,
  2355. nY1 + nStep,
  2356. clrShadowAdjust
  2357. );
  2358. for( n2nd = nY0
  2359. + m_nShadowSize*2+1
  2360. - ( bCmbaV ? ( m_nShadowSize * 2 - nStep ) : 0 )
  2361. - ( bCmbaVrt ? m_nShadowSize : 0 )
  2362. ;
  2363. n2nd < LONG(nY1) + ( bCmbaVrb ? LONG(m_nShadowSize) : 0 );
  2364. n2nd++
  2365. )
  2366. {
  2367. if( bCmbaLA
  2368. && n2nd >= nLa0
  2369. && n2nd < LONG(nLa1) - ( LONG(m_nShadowSize) - nStep )
  2370. )
  2371. {
  2372. continue;
  2373. }
  2374. _DoPixelOvershadow(
  2375. nMakeSpec,
  2376. nX1 + nStep,
  2377. n2nd,
  2378. clrShadowAdjust
  2379. );
  2380. }
  2381. nDist1 = nStep*nStep;
  2382. for( n2nd = 0; ULONG(n2nd) < m_nShadowSize; n2nd++ )
  2383. {
  2384. nDist = nDist1 + n2nd * n2nd;
  2385. if( nDist > nDist2 )
  2386. continue;
  2387. nDist = (LONG)::sqrt( double(nDist) );
  2388. nMakeSpec = m_nBr0 + ( nDist * nBrDiff ) / m_nShadowSize;
  2389. if( ! ( bCmbaVrb || bCmbaHrb ) )
  2390. _DoPixelOvershadow(
  2391. nMakeSpec,
  2392. nX1 + nStep,
  2393. nY1 + n2nd,
  2394. clrShadowAdjust
  2395. );
  2396. if( ! ( bCmbaH || bCmbaHlb ) )
  2397. _DoPixelOvershadow(
  2398. nMakeSpec,
  2399. m_nShadowSize + ( m_nShadowSize - nStep ),
  2400. nY1 + n2nd,
  2401. clrShadowAdjust
  2402. );
  2403. if( ! ( bCmbaV || bCmbaVrt ) )
  2404. _DoPixelOvershadow(
  2405. nMakeSpec,
  2406. nX1 + nStep,
  2407. m_nShadowSize + ( m_nShadowSize - n2nd ),
  2408. clrShadowAdjust
  2409. );
  2410. } // for( n2nd = 0; ULONG(n2nd) < m_nShadowSize; n2nd++ )
  2411. } // for( nStep = 0; ULONG(nStep) < m_nShadowSize; nStep++ )
  2412. dc.ExcludeClipRect( &m_rcWndArea );
  2413. if( m_rgnSafe.GetSafeHandle() != NULL )
  2414. dc.SelectClipRgn( &m_rgnSafe, RGN_AND );
  2415. dc.BitBlt(
  2416. m_rcWndArea.left,
  2417. m_rcWndArea.top,
  2418. nWndAreaDX + m_nShadowSize,
  2419. nWndAreaDY + m_nShadowSize, 
  2420. &dcmm,
  2421. 0,
  2422. 0,
  2423. SRCCOPY
  2424. );
  2425. dc.SelectClipRgn( NULL );
  2426. bool bRetVal = true;
  2427. if( m_bEnablePhotos )
  2428. {
  2429. if( ! _MakePhotos( dc, dcmm ) )
  2430. {
  2431. ASSERT( FALSE );
  2432. bRetVal = false;
  2433. } // if( ! _MakePhotos( dc, dcmm ) )
  2434. } // if( m_bEnablePhotos )
  2435. if( hOldSurface != NULL )
  2436. dcmm.SelectObject( hOldSurface );
  2437. ::DeleteObject( hDIB );
  2438. m_pHelperDibSurface = NULL;
  2439. return bRetVal;
  2440. }
  2441. bool CExtWndShadow::_MakePhotos( CDC & dc, CDC & dcmm )
  2442. {
  2443. ASSERT( m_nShadowSize >= 0 );
  2444. ASSERT( ! m_rcWndArea.IsRectEmpty() );
  2445. INT nWndAreaDX = m_rcWndArea.Width();
  2446. INT nWndAreaDY = m_rcWndArea.Height();
  2447. if( m_bmp0mak.GetSafeHandle() != NULL )
  2448. m_bmp0mak.DeleteObject();
  2449. if( m_bmp1mak.GetSafeHandle() != NULL )
  2450. m_bmp1mak.DeleteObject();
  2451. if( ! m_bmp0mak.CreateCompatibleBitmap(
  2452. &dc,
  2453. m_nShadowSize,
  2454. nWndAreaDY + m_nShadowSize
  2455. )
  2456. )
  2457. {
  2458. ASSERT( FALSE );
  2459. return false;
  2460. }
  2461. dcmm.SelectObject( &m_bmp0mak );
  2462. if( ! dcmm.BitBlt(
  2463. 0,
  2464. 0,
  2465. m_nShadowSize,
  2466. nWndAreaDY + m_nShadowSize,
  2467. &dc,
  2468. m_rcWndArea.right,
  2469. m_rcWndArea.top,
  2470. SRCCOPY
  2471. )
  2472. )
  2473. {
  2474. ASSERT( FALSE );
  2475. return false;
  2476. }
  2477. if( ! m_bmp1mak.CreateCompatibleBitmap(
  2478. &dc,
  2479. nWndAreaDX + m_nShadowSize,
  2480. m_nShadowSize
  2481. )
  2482. )
  2483. {
  2484. ASSERT( FALSE );
  2485. return false;
  2486. }
  2487. dcmm.SelectObject( &m_bmp1mak );
  2488. if( ! dcmm.BitBlt(
  2489. 0,
  2490. 0,
  2491. nWndAreaDX + m_nShadowSize,
  2492. m_nShadowSize,
  2493. &dc,
  2494. m_rcWndArea.left,
  2495. m_rcWndArea.bottom,
  2496. SRCCOPY
  2497. )
  2498. )
  2499. {
  2500. ASSERT( FALSE );
  2501. return false;
  2502. }
  2503. return true;
  2504. }
  2505. bool CExtWndShadow::_MakeOriginals( CDC & dc )
  2506. {
  2507. ASSERT( m_nShadowSize >= 0 );
  2508. ASSERT( ! m_rcWndArea.IsRectEmpty() );
  2509. INT nWndAreaDX = m_rcWndArea.Width();
  2510. INT nWndAreaDY = m_rcWndArea.Height();
  2511. ASSERT(
  2512. m_bmp0org.GetSafeHandle() == NULL
  2513. && m_bmp1org.GetSafeHandle() == NULL
  2514. );
  2515. CDC dcmm;
  2516. if( ! dcmm.CreateCompatibleDC( NULL ) )
  2517. {
  2518. ASSERT( FALSE );
  2519. return false;
  2520. }
  2521. if( ! m_bmp0org.CreateCompatibleBitmap(
  2522. &dc,
  2523. m_nShadowSize,
  2524. nWndAreaDY + m_nShadowSize
  2525. )
  2526. )
  2527. {
  2528. ASSERT( FALSE );
  2529. return false;
  2530. }
  2531. CBitmap * pOldBmp = dcmm.SelectObject( &m_bmp0org );
  2532. if( ! dcmm.BitBlt(
  2533. 0,
  2534. 0,
  2535. m_nShadowSize,
  2536. nWndAreaDY + m_nShadowSize,
  2537. &dc,
  2538. m_rcWndArea.right,
  2539. m_rcWndArea.top,
  2540. SRCCOPY
  2541. )
  2542. )
  2543. {
  2544. ASSERT( FALSE );
  2545. return false;
  2546. }
  2547. if( ! m_bmp1org.CreateCompatibleBitmap(
  2548. &dc,
  2549. nWndAreaDX + m_nShadowSize,
  2550. m_nShadowSize
  2551. )
  2552. )
  2553. {
  2554. ASSERT( FALSE );
  2555. return false;
  2556. }
  2557. dcmm.SelectObject( &m_bmp1org );
  2558. if( ! dcmm.BitBlt(
  2559. 0,
  2560. 0,
  2561. nWndAreaDX + m_nShadowSize,
  2562. m_nShadowSize,
  2563. &dc,
  2564. m_rcWndArea.left,
  2565. m_rcWndArea.bottom,
  2566. SRCCOPY
  2567. )
  2568. )
  2569. {
  2570. ASSERT( FALSE );
  2571. return false;
  2572. }
  2573. dcmm.SelectObject( pOldBmp );
  2574. return true;
  2575. }
  2576. void CExtWndShadow::_FreeWinObjects()
  2577. {
  2578. if( m_bmp0org.GetSafeHandle() != NULL )
  2579. m_bmp0org.DeleteObject();
  2580. if( m_bmp1org.GetSafeHandle() != NULL )
  2581. m_bmp1org.DeleteObject();
  2582. if( m_bmp0mak.GetSafeHandle() != NULL )
  2583. m_bmp0mak.DeleteObject();
  2584. if( m_bmp1mak.GetSafeHandle() != NULL )
  2585. m_bmp1mak.DeleteObject();
  2586. m_pHelperDibSurface = NULL;
  2587. }
  2588. void CExtWndShadow::Destroy()
  2589. {
  2590. _FreeWinObjects();
  2591. m_rcWndArea.SetRectEmpty();
  2592. m_rgnSafe.DeleteObject();
  2593. m_bEnablePhotos = false;
  2594. m_bEnablePaintManagerColor = false;
  2595. }
  2596. void CExtWndShadow::PostReShadow()
  2597. {
  2598. if( m_bmp0org.GetSafeHandle() != NULL
  2599. && m_bmp1org.GetSafeHandle() != NULL
  2600. && m_bmp0mak.GetSafeHandle() != NULL
  2601. && m_bmp1mak.GetSafeHandle() != NULL
  2602. )
  2603. {
  2604. m_bmp0mak.DeleteObject();
  2605. m_bmp1mak.DeleteObject();
  2606. }
  2607. }
  2608. /////////////////////////////////////////////////////////////////////////////
  2609. // CExtPopupMenuWnd::MENUITEMDATA
  2610. CExtPopupMenuWnd::MENUITEMDATA::MENUITEMDATA(
  2611. CExtPopupMenuWnd * pOwner // = NULL
  2612. )
  2613. : m_cAccelChar( _T('') )
  2614. , m_pOwner( pOwner )
  2615. {
  2616. // self constant type assertion
  2617. ASSERT( TYPE_SEPARATOR==ID_SEPARATOR );
  2618. m_pWndChild = NULL;
  2619. m_nItemIndex = -100;
  2620. m_nCmdID = TYPE_SEPARATOR;
  2621. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2622. m_pCmdNode = NULL;
  2623. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2624. m_sItemText = m_sAccelText = m_sExtendedText = _T("");
  2625. m_sizeItem.cx = m_sizeItem.cy = 0;
  2626. m_nIconAreaWidth = 0;
  2627. m_bSelected
  2628. = m_bDisplayed
  2629. = m_bForceDisplayed
  2630. = m_bChildCombine
  2631. = m_bToolButton
  2632. = m_bToolWrap
  2633. = m_bBold
  2634. = m_bDefault
  2635. = m_bEnabledAppearance
  2636. = m_bBigAccent
  2637. = m_bForcePopupDisabled
  2638. = m_bForceEnabled
  2639. = m_bForceNoLeftGradient
  2640. = m_bCheck
  2641. = m_bRadio
  2642. = m_bIndeterminate
  2643. = m_bXtraChecked
  2644. = m_bNoCmdUI
  2645. = m_bIconMode
  2646. = false;
  2647. m_pCbCmdDeliver = NULL;
  2648. m_pCbXtraMarkState = NULL;
  2649. m_bEnabled = true;
  2650. m_hWndSpecCmdReceiver = NULL;
  2651. m_pHelperInplaceEditWnd = NULL;
  2652. m_pInplaceEditStr = NULL;
  2653. m_pCbVerifyTextInput = NULL;
  2654. m_pCbPutTextInputResult = NULL;
  2655. m_pInplaceEditCbWndProc = NULL;
  2656. m_pInplaceEditCbCookie = NULL;
  2657. m_nInplaceEditWidth = 0;
  2658. m_bAllowInplaceEditActivation = true;
  2659. m_nLParam = 0L;
  2660. m_bTempSelTextValid = false;
  2661. m_sTempSelText.Empty();
  2662. m_nMarginLeft
  2663. = m_nMarginTop
  2664. = m_nMarginRight
  2665. = m_nMarginBottom
  2666.  = -1;
  2667. m_rcCacheBasic.SetRect( 0, 0, 0, 0 );
  2668. m_rcCacheIndents.SetRect( 0, 0, 0, 0 );
  2669. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2670. m_pWndKeyTipBasic = m_pWndKeyTipDD = NULL;
  2671. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2672. }
  2673. CExtPopupMenuWnd::MENUITEMDATA::MENUITEMDATA(
  2674. const CExtPopupMenuWnd::MENUITEMDATA & other
  2675. )
  2676. : m_cAccelChar( _T('') )
  2677. {
  2678. m_pOwner = other.m_pOwner;
  2679. // self constant type assertion
  2680. ASSERT( TYPE_SEPARATOR==ID_SEPARATOR );
  2681. m_pWndChild = NULL;
  2682. m_nItemIndex = -100;
  2683. m_nCmdID = TYPE_SEPARATOR;
  2684. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2685. m_pCmdNode = NULL;
  2686. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2687. m_sItemText = m_sAccelText = m_sExtendedText = _T("");
  2688. m_sizeItem.cx = m_sizeItem.cy = 0;
  2689. m_nIconAreaWidth = 0;
  2690. m_bSelected
  2691. = m_bDisplayed
  2692. = m_bForceDisplayed
  2693. = m_bChildCombine
  2694. = m_bToolButton
  2695. = m_bToolWrap
  2696. = m_bBold
  2697. = m_bDefault
  2698. = m_bEnabledAppearance
  2699. = m_bBigAccent
  2700. = m_bForcePopupDisabled
  2701. = m_bForceEnabled
  2702. = m_bForceNoLeftGradient
  2703. = m_bCheck
  2704. = m_bRadio
  2705. = m_bIndeterminate
  2706. = m_bXtraChecked
  2707. = m_bNoCmdUI
  2708. = m_bIconMode
  2709. = false;
  2710. m_pCbCmdDeliver = NULL;
  2711. m_pCbXtraMarkState = NULL;
  2712. m_bEnabled = true;
  2713. m_hWndSpecCmdReceiver = NULL;
  2714. m_pHelperInplaceEditWnd = NULL;
  2715. m_pInplaceEditStr = NULL;
  2716. m_pCbVerifyTextInput = NULL;
  2717. m_pCbPutTextInputResult = NULL;
  2718. m_pInplaceEditCbWndProc = NULL;
  2719. m_pInplaceEditCbCookie = NULL;
  2720. m_nInplaceEditWidth = 0;
  2721. m_bAllowInplaceEditActivation = true;
  2722. m_nLParam = 0L;
  2723. m_bTempSelTextValid = false;
  2724. m_sTempSelText.Empty();
  2725. m_rcCacheBasic.SetRect( 0, 0, 0, 0 );
  2726. m_rcCacheIndents.SetRect( 0, 0, 0, 0 );
  2727. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2728. m_pWndKeyTipBasic = m_pWndKeyTipDD = NULL;
  2729. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2730. AssignFromOther( other );
  2731. }
  2732. CExtPopupMenuWnd::MENUITEMDATA::~MENUITEMDATA()
  2733. {
  2734. // DestroyPopup();
  2735. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2736. HDWP hPassiveModeDWP = NULL;
  2737. KeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  2738. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2739. }
  2740. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2741. CExtCustomizeCmdKeyTip * CExtPopupMenuWnd::MENUITEMDATA::KeyTipGetInfo(
  2742. bool bBasic
  2743. )
  2744. {
  2745. CExtCustomizeCmdTreeNode * pNode = GetCmdNode();
  2746. if( pNode != NULL )
  2747. {
  2748. ASSERT_VALID( pNode );
  2749. CExtCustomizeCmdKeyTip * pCmdKeyTip = pNode->CmdKeyTipGet( bBasic );
  2750. return pCmdKeyTip;
  2751. }
  2752. return NULL;
  2753. }
  2754. CExtSafeString CExtPopupMenuWnd::MENUITEMDATA::KeyTipGetText(
  2755. INT nIndent,
  2756. bool bBasic
  2757. )
  2758. {
  2759. CExtSafeString strKeyTipText( _T("") );
  2760. CExtCustomizeCmdKeyTip * pCmdKeyTip = KeyTipGetInfo( bBasic );
  2761. if( pCmdKeyTip != NULL )
  2762. strKeyTipText = pCmdKeyTip->GetTipText( nIndent );
  2763. return strKeyTipText;
  2764. }
  2765. CWnd * CExtPopupMenuWnd::MENUITEMDATA::KeyTipGetParentWnd()
  2766. {
  2767. CExtPopupMenuWnd * pOwnerPopupMenuWnd = GetOwner();
  2768. if( pOwnerPopupMenuWnd->GetSafeHwnd() == NULL )
  2769. return NULL;
  2770. ASSERT_VALID( pOwnerPopupMenuWnd );
  2771. return pOwnerPopupMenuWnd;
  2772. }
  2773. CPoint CExtPopupMenuWnd::MENUITEMDATA::KeyTipGetGuideLines(
  2774. bool bBasic
  2775. )
  2776. {
  2777. CExtPopupMenuWnd * pOwnerPopupMenuWnd = GetOwner();
  2778. ASSERT( pOwnerPopupMenuWnd->GetSafeHwnd() != NULL );
  2779. ASSERT_VALID( pOwnerPopupMenuWnd );
  2780. CRect rc = GetCachedRect( false );
  2781. pOwnerPopupMenuWnd->ClientToScreen( &rc );
  2782. if( bBasic )
  2783. {
  2784. int nIconAreaWidth = GetIconAreaWidth();
  2785. CPoint ptGuideLines(
  2786. rc.left + nIconAreaWidth,
  2787. rc.bottom 
  2788. );
  2789. return ptGuideLines;
  2790. else
  2791. {
  2792. CPoint ptGuideLines(
  2793. rc.right,
  2794. rc.bottom 
  2795. );
  2796. return ptGuideLines;
  2797. }
  2798. }
  2799. CExtPopupKeyTipWnd * CExtPopupMenuWnd::MENUITEMDATA::KeyTipGetWnd(
  2800. bool bBasic
  2801. )
  2802. {
  2803. #ifdef _DEBUG
  2804. if( m_pWndKeyTipBasic != NULL )
  2805. {
  2806. ASSERT_VALID( m_pWndKeyTipBasic );
  2807. }
  2808. if( m_pWndKeyTipDD != NULL )
  2809. {
  2810. ASSERT_VALID( m_pWndKeyTipDD );
  2811. }
  2812. #endif // _DEBUG
  2813. return bBasic ? m_pWndKeyTipBasic : m_pWndKeyTipDD;
  2814. }
  2815. void CExtPopupMenuWnd::MENUITEMDATA::KeyTipTrackingQuery(
  2816. bool bShow,
  2817. CExtCustomizeCmdKeyTip * pKeyTipChain,
  2818. HDWP & hPassiveModeDWP
  2819. )
  2820. {
  2821. if( bShow )
  2822. {
  2823. CExtPopupMenuWnd * pOwnerPopupMenuWnd = GetOwner();
  2824. ASSERT( pOwnerPopupMenuWnd->GetSafeHwnd() != NULL );
  2825. ASSERT_VALID( pOwnerPopupMenuWnd );
  2826. INT nKTI, nIndent = pKeyTipChain->KeyCodeGetCount();
  2827. for( nKTI = 0; nKTI < 2; nKTI++ )
  2828. {
  2829. bool bBasic = ( nKTI == 0 ) ? true : false;
  2830. CExtPopupKeyTipWnd *& pWndKeyTip = bBasic ? m_pWndKeyTipBasic : m_pWndKeyTipDD;
  2831. ASSERT_VALID( pKeyTipChain );
  2832. CExtSafeString strKeyTipText = KeyTipGetText( nIndent, bBasic );
  2833. if( strKeyTipText.IsEmpty() )
  2834. continue;
  2835. if( pWndKeyTip == NULL )
  2836. {
  2837. try
  2838. {
  2839. pWndKeyTip = new CExtPopupKeyTipWnd;
  2840. }
  2841. catch( CException * pException )
  2842. {
  2843. pException->Delete();
  2844. continue;
  2845. }
  2846. } // if( pWndKeyTip == NULL )
  2847. #ifdef _DEBUG
  2848. else
  2849. {
  2850. ASSERT_VALID( pWndKeyTip );
  2851. } // else from if( pWndKeyTip == NULL )
  2852. #endif // _DEBUG
  2853. CWnd * pWndKeyTipParent = KeyTipGetParentWnd();
  2854. ASSERT_VALID( pWndKeyTipParent );
  2855. ASSERT( pWndKeyTipParent->GetSafeHwnd() != NULL );
  2856. CPoint ptGuideLines = KeyTipGetGuideLines( bBasic );
  2857. if( ! pWndKeyTip->Create(
  2858. pWndKeyTipParent,
  2859. ptGuideLines,
  2860. strKeyTipText,
  2861. IsEnabled(),
  2862. hPassiveModeDWP
  2863. )
  2864. )
  2865. {
  2866. delete pWndKeyTip;
  2867. pWndKeyTip = NULL;
  2868. continue;
  2869. }
  2870. pWndKeyTip->ShowWindow( SW_SHOWNOACTIVATE );
  2871. } // for( nKTI = 0; nKTI < 2; nKTI++ )
  2872. } // if( bShow )
  2873. else
  2874. {
  2875. if( m_pWndKeyTipBasic != NULL )
  2876. {
  2877. m_pWndKeyTipBasic->Hide();
  2878. delete m_pWndKeyTipBasic;
  2879. m_pWndKeyTipBasic = NULL;
  2880. }
  2881. if( m_pWndKeyTipDD != NULL )
  2882. {
  2883. m_pWndKeyTipDD->Hide();
  2884. delete m_pWndKeyTipDD;
  2885. m_pWndKeyTipDD = NULL;
  2886. }
  2887. } // else from if( bShow )
  2888. }
  2889. bool CExtPopupMenuWnd::MENUITEMDATA::KeyTipTranslate(
  2890. DWORD dwKeyCode,
  2891. CExtCustomizeCmdKeyTip * pKeyTipChain
  2892. )
  2893. {
  2894. ASSERT_VALID( pKeyTipChain );
  2895. CExtPopupMenuWnd * pOwnerPopupMenuWnd = GetOwner();
  2896. if( pOwnerPopupMenuWnd->GetSafeHwnd() == NULL )
  2897. return false;
  2898. ASSERT_VALID( pOwnerPopupMenuWnd );
  2899. if( ! IsEnabled() )
  2900. return false;
  2901. INT nKTI;
  2902. for( nKTI = 0; nKTI < 2; nKTI++ )
  2903. {
  2904. bool bBasic = ( nKTI == 0 ) ? true : false;
  2905. CExtCustomizeCmdKeyTip * pCmdKeyTip = KeyTipGetInfo( bBasic );
  2906. if( pCmdKeyTip == NULL )
  2907. continue;
  2908. CExtPopupKeyTipWnd * pWndKeyTip = KeyTipGetWnd( bBasic );
  2909. if( pWndKeyTip->GetSafeHwnd() == NULL
  2910. || ( pWndKeyTip->GetStyle() & WS_VISIBLE ) == 0
  2911. )
  2912. continue;
  2913. if( ! pCmdKeyTip->CompareWidthChain( *pKeyTipChain ) )
  2914. continue;
  2915. INT nKeyCodeCountOwn = pCmdKeyTip->KeyCodeGetCount();
  2916. INT nKeyCodeCountChain = pKeyTipChain->KeyCodeGetCount();
  2917. ASSERT( nKeyCodeCountOwn > nKeyCodeCountChain );
  2918. DWORD dwKeyCodeOwn = pCmdKeyTip->KeyCodeGetAt( nKeyCodeCountChain );
  2919. if( dwKeyCodeOwn != dwKeyCode )
  2920. continue;
  2921. pKeyTipChain->KeyCodeAdd( dwKeyCode );
  2922. nKeyCodeCountChain++;
  2923. if( nKeyCodeCountOwn > nKeyCodeCountChain )
  2924. return true;
  2925. KeyTipInvokeAction( bBasic );
  2926. return true;
  2927. } // for( nKTI = 0; nKTI < 2; nKTI++ )
  2928. return false;
  2929. }
  2930. void CExtPopupMenuWnd::MENUITEMDATA::KeyTipDisplay(
  2931. CExtCustomizeCmdKeyTip & keyTipChain
  2932. )
  2933. {
  2934. ASSERT_VALID( (&keyTipChain) );
  2935. CExtPopupMenuWnd * pOwnerPopupMenuWnd = GetOwner();
  2936. if( pOwnerPopupMenuWnd->GetSafeHwnd() == NULL )
  2937. return;
  2938. ASSERT_VALID( pOwnerPopupMenuWnd );
  2939. // if( ! IsEnabled() )
  2940. // return;
  2941. INT nKTI;
  2942. for( nKTI = 0; nKTI < 2; nKTI++ )
  2943. {
  2944. bool bBasic = ( nKTI == 0 ) ? true : false;
  2945. CExtCustomizeCmdKeyTip * pCmdKeyTip = KeyTipGetInfo( bBasic );
  2946. if( pCmdKeyTip == NULL )
  2947. continue;
  2948. CExtPopupKeyTipWnd * pWndKeyTip = KeyTipGetWnd( bBasic );
  2949. if( pWndKeyTip->GetSafeHwnd() == NULL
  2950. || ( pWndKeyTip->GetStyle() & WS_VISIBLE ) == 0
  2951. )
  2952. continue;
  2953. if( pCmdKeyTip->CompareWidthChain( keyTipChain ) )
  2954. continue;
  2955. pWndKeyTip->ShowWindow( SW_HIDE );
  2956. } // for( nKTI = 0; nKTI < 2; nKTI++ )
  2957. }
  2958. bool CExtPopupMenuWnd::MENUITEMDATA::KeyTipInvokeAction(
  2959. bool bBasic
  2960. )
  2961. {
  2962. CExtPopupMenuWnd * pOwnerPopupMenuWnd = GetOwner();
  2963. if( pOwnerPopupMenuWnd->GetSafeHwnd() == NULL )
  2964. return false;
  2965. ASSERT_VALID( pOwnerPopupMenuWnd );
  2966. bool bSeparatedDropDown = false;
  2967. const CExtCustomizeCmdTreeNode * pNode = GetCmdNode();
  2968. if( pNode != NULL )
  2969. {
  2970. ASSERT_VALID( pNode );
  2971. bSeparatedDropDown =
  2972. (pNode->GetFlags() & __ECTN_TBB_SEPARATED_DROPDOWN)
  2973. ? true : false;
  2974. } // if( pNode != NULL )
  2975. if( ( ( ! bBasic ) || (! bSeparatedDropDown ) )
  2976. && IsPopup()
  2977. && ( ! IsInplaceEdit() )
  2978. )
  2979. {
  2980. INT nCurIndex = pOwnerPopupMenuWnd->ItemGetIndexOf( this );
  2981. pOwnerPopupMenuWnd->_ItemFocusSet( nCurIndex, TRUE, TRUE );
  2982. return true;
  2983. } // if( ( ! bBasic ) ...
  2984. if( ! bBasic )
  2985. return false;
  2986. INT nCurIndex = pOwnerPopupMenuWnd->ItemGetIndexOf( this );
  2987. pOwnerPopupMenuWnd->_ItemFocusSet( nCurIndex, FALSE, TRUE );
  2988. if( IsInplaceEdit() )
  2989. {
  2990. CWnd * pWndInplace = GetInplaceEditPtr();
  2991. if( pWndInplace != NULL )
  2992. {
  2993. ASSERT_VALID( pWndInplace );
  2994. ASSERT( pWndInplace->GetSafeHwnd() != NULL && (::IsWindow(pWndInplace->GetSafeHwnd())) );
  2995. if( IsAllowInplaceEditActivation() )
  2996. {
  2997. if( (pWndInplace->GetStyle() & WS_VISIBLE) == 0 )
  2998. {
  2999. CRect rcInplaceEdit;
  3000. pOwnerPopupMenuWnd->_GetItemRect( nCurIndex, rcInplaceEdit );
  3001. rcInplaceEdit =
  3002. AdjustInplaceEditRect(
  3003. rcInplaceEdit,
  3004. pOwnerPopupMenuWnd->OnQueryLayoutRTL()
  3005. );
  3006. pWndInplace->SetWindowPos(
  3007. NULL,
  3008. rcInplaceEdit.left, rcInplaceEdit.top,
  3009. rcInplaceEdit.Width(), rcInplaceEdit.Height(),
  3010. SWP_NOZORDER|SWP_NOOWNERZORDER
  3011. |SWP_NOACTIVATE|SWP_SHOWWINDOW
  3012. );
  3013. } // if( (pWndInplace->GetStyle() & WS_VISIBLE) == 0 )
  3014. pWndInplace->SetFocus();
  3015. return true;
  3016. } // if( IsAllowInplaceEditActivation() )
  3017. } // if( pWndInplace != NULL )
  3018. }
  3019. pOwnerPopupMenuWnd->_EndSequence( GetCmdID(), pOwnerPopupMenuWnd->GetCmdReceiverHWND() );
  3020. return true;
  3021. }
  3022. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3023. CExtPopupMenuWnd * CExtPopupMenuWnd::MENUITEMDATA::GetOwner()
  3024. {
  3025. return m_pOwner;
  3026. }
  3027. const CExtPopupMenuWnd * CExtPopupMenuWnd::MENUITEMDATA::GetOwner() const
  3028. {
  3029. return m_pOwner;
  3030. }
  3031. void CExtPopupMenuWnd::MENUITEMDATA::SetOwner( CExtPopupMenuWnd * pOwner )
  3032. {
  3033. m_pOwner = pOwner;
  3034. }
  3035. CExtPopupMenuWnd::MENUITEMDATA &
  3036. CExtPopupMenuWnd::MENUITEMDATA::operator = (
  3037. const CExtPopupMenuWnd::MENUITEMDATA & other
  3038. )
  3039. {
  3040. AssignFromOther( other );
  3041. return (*this);
  3042. }
  3043. void CExtPopupMenuWnd::MENUITEMDATA::AssignFromOther(
  3044. const CExtPopupMenuWnd::MENUITEMDATA & other
  3045. )
  3046. {
  3047. // self constant type assertion
  3048. ASSERT( TYPE_SEPARATOR==ID_SEPARATOR );
  3049. LPVOID lpvThis = (LPVOID)this;
  3050. LPVOID lpvOther = (LPVOID)(&other);
  3051. if( lpvThis == lpvOther )
  3052. return;
  3053. m_pOwner = other.m_pOwner;
  3054. m_pWndChild = other.m_pWndChild;
  3055. m_nItemIndex = other.m_nItemIndex;
  3056. m_nCmdID = other.m_nCmdID;
  3057. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3058. m_pCmdNode = other.m_pCmdNode;
  3059. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3060. m_sItemText = other.m_sItemText;
  3061. m_sExtendedText = other.m_sExtendedText;
  3062. m_sAccelText = other.m_sAccelText;
  3063. m_iconPopup = other.m_iconPopup;
  3064. m_sizeItem = other.m_sizeItem;
  3065. m_nIconAreaWidth = other.m_nIconAreaWidth;
  3066. m_bSelected = other.m_bSelected;
  3067. m_bDisplayed = other.m_bDisplayed;
  3068. m_bForceDisplayed = other.m_bForceDisplayed;
  3069. m_bChildCombine = other.m_bChildCombine;
  3070. m_bToolButton = other.m_bToolButton;
  3071. m_bToolWrap = other.m_bToolWrap;
  3072. m_bBold = other.m_bBold;
  3073. m_bDefault = other.m_bDefault;
  3074. m_bEnabledAppearance = other.m_bEnabledAppearance;
  3075. m_bBigAccent = other.m_bBigAccent;
  3076. m_bForcePopupDisabled = other.m_bForcePopupDisabled;
  3077. m_bForceEnabled = other.m_bForceEnabled;
  3078. m_bForceNoLeftGradient = other.m_bForceNoLeftGradient;
  3079. m_cAccelChar = other.m_cAccelChar;
  3080. m_hWndSpecCmdReceiver = other.m_hWndSpecCmdReceiver;
  3081. m_bCheck = other.m_bCheck;
  3082. m_bRadio = other.m_bRadio;
  3083. m_pCbCmdDeliver = other.m_pCbCmdDeliver;
  3084. m_pCbXtraMarkState = other.m_pCbXtraMarkState;
  3085. m_bXtraChecked = other.m_bXtraChecked;
  3086. m_bNoCmdUI = other.m_bNoCmdUI;
  3087. m_bIconMode = other.m_bIconMode;
  3088. m_bEnabled = other.m_bEnabled;
  3089. m_bIndeterminate = other.m_bIndeterminate;
  3090. m_pHelperInplaceEditWnd = other.m_pHelperInplaceEditWnd;
  3091. m_pInplaceEditStr = other.m_pInplaceEditStr;
  3092. m_pCbVerifyTextInput = other.m_pCbVerifyTextInput;
  3093. m_pCbPutTextInputResult = other.m_pCbPutTextInputResult;
  3094. m_pInplaceEditCbWndProc = other.m_pInplaceEditCbWndProc;
  3095. m_pInplaceEditCbCookie = other.m_pInplaceEditCbCookie;
  3096. m_nInplaceEditWidth = other.m_nInplaceEditWidth;
  3097. m_bAllowInplaceEditActivation = other.m_bAllowInplaceEditActivation;
  3098. m_nLParam = other.m_nLParam;
  3099. m_bTempSelTextValid = other.m_bTempSelTextValid;
  3100. m_sTempSelText = other.m_sTempSelText;
  3101. m_nMarginLeft = m_nMarginLeft;
  3102. m_nMarginTop = m_nMarginTop;
  3103. m_nMarginRight = m_nMarginRight;
  3104. m_nMarginBottom = m_nMarginBottom;
  3105. m_rcCacheBasic = other.m_rcCacheBasic;
  3106. m_rcCacheIndents = other.m_rcCacheIndents;
  3107. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3108. HDWP hPassiveModeDWP = NULL;
  3109. KeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  3110. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3111. }
  3112. void CExtPopupMenuWnd::MENUITEMDATA::SetOuterMargins(
  3113. INT nMarginLeft, // = -1
  3114. INT nMarginTop, // = -1
  3115. INT nMarginRight, // = -1
  3116. INT nMarginBottom // = -1
  3117. )
  3118. {
  3119. if( nMarginLeft >= 0 )
  3120. m_nMarginLeft = nMarginLeft;
  3121. if( nMarginTop >= 0 )
  3122. m_nMarginTop = nMarginTop;
  3123. if( nMarginRight >= 0 )
  3124. m_nMarginRight = nMarginRight;
  3125. if( nMarginBottom >= 0 )
  3126. m_nMarginBottom = nMarginBottom;
  3127. }
  3128. void CExtPopupMenuWnd::MENUITEMDATA::SetOuterMargins(
  3129. const RECT & rcMargins
  3130. )
  3131. {
  3132. SetOuterMargins(
  3133. rcMargins.left,
  3134. rcMargins.top,
  3135. rcMargins.right,
  3136. rcMargins.bottom
  3137. );
  3138. }
  3139. void CExtPopupMenuWnd::MENUITEMDATA::GetOuterMargins(
  3140. INT * p_nMarginLeft, // = NULL,
  3141. INT * p_nMarginTop, // = NULL,
  3142. INT * p_nMarginRight, // = NULL,
  3143. INT * p_nMarginBottom // = NULL
  3144. ) const
  3145. {
  3146. // returns default indent values, if indents are is not initialized yet
  3147. if( p_nMarginLeft != NULL )
  3148. (*p_nMarginLeft) = 
  3149. (m_nMarginLeft == -1) ? 1 : m_nMarginLeft;
  3150. if( p_nMarginTop != NULL )
  3151. (*p_nMarginTop) = 
  3152. (m_nMarginTop == -1) ? 0 : m_nMarginTop;
  3153. if( p_nMarginRight != NULL )
  3154. (*p_nMarginRight) = 
  3155. (m_nMarginRight == -1) ? 1 : m_nMarginRight;
  3156. if( p_nMarginBottom != NULL )
  3157. (*p_nMarginBottom) = 
  3158. (m_nMarginBottom == -1) ? 1 : m_nMarginBottom;
  3159. }
  3160. void CExtPopupMenuWnd::MENUITEMDATA::GetOuterMargins(
  3161. RECT & rcMargins
  3162. ) const
  3163. {
  3164. INT nMarginLeft, nMarginTop, nMarginRight, nMarginBottom;
  3165. GetOuterMargins(
  3166. &nMarginLeft,
  3167. &nMarginTop,
  3168. &nMarginRight,
  3169. &nMarginBottom
  3170. );
  3171. ::SetRect( &rcMargins, nMarginLeft, nMarginTop, nMarginRight, nMarginBottom );
  3172. }
  3173. CRect CExtPopupMenuWnd::MENUITEMDATA::GetOuterMargins() const
  3174. {
  3175. INT nMarginLeft, nMarginTop, nMarginRight, nMarginBottom;
  3176. GetOuterMargins(
  3177. &nMarginLeft,
  3178. &nMarginTop,
  3179. &nMarginRight,
  3180. &nMarginBottom
  3181. );
  3182. CRect rcMargins;
  3183. ::SetRect( &rcMargins, nMarginLeft, nMarginTop, nMarginRight, nMarginBottom );
  3184. return rcMargins;
  3185. }
  3186. int CExtPopupMenuWnd::MENUITEMDATA::GetMeasuredHeight()
  3187. {
  3188. INT nHeight = m_sizeItem.cy;
  3189. INT nMarginTop = 0, nMarginBottom = 0;
  3190. GetOuterMargins(
  3191. NULL,
  3192. &nMarginTop,
  3193. NULL,
  3194. &nMarginBottom
  3195. );
  3196. nHeight += nMarginTop;
  3197. nHeight += nMarginBottom;
  3198. return nHeight;
  3199. }
  3200. int CExtPopupMenuWnd::MENUITEMDATA::GetMeasuredWidth()
  3201. {
  3202. INT nWidth = m_sizeItem.cx;
  3203. INT nMarginLeft = 0, nMarginRight = 0;
  3204. GetOuterMargins(
  3205. &nMarginLeft,
  3206. NULL,
  3207. &nMarginRight,
  3208. NULL
  3209. );
  3210. nWidth += nMarginLeft;
  3211. nWidth += nMarginRight;
  3212. return nWidth;
  3213. }
  3214. CRect CExtPopupMenuWnd::MENUITEMDATA::AdjustInplaceEditRect(
  3215. const RECT & rcItem,
  3216. bool bRTL
  3217. ) const
  3218. {
  3219. CRect rcInplaceEdit( rcItem );
  3220. int nInplaceEditWidth = GetInplaceEditWidth();
  3221. ASSERT( nInplaceEditWidth > 0 );
  3222. INT nDD = m_pOwner->PmBridge_GetPM()->GetDropDownButtonWidth( (CObject*)GetOwner() );
  3223. if( bRTL )
  3224. {
  3225. rcInplaceEdit.DeflateRect( 1, 2, 1, 2 );
  3226. rcInplaceEdit.right = rcInplaceEdit.left + nInplaceEditWidth;
  3227. if( IsPopup() )
  3228. rcInplaceEdit.right -= nDD;
  3229. } // if( bRTL )
  3230. else
  3231. {
  3232. rcInplaceEdit.DeflateRect( 1, 2, 1, 2 );
  3233. rcInplaceEdit.left = rcInplaceEdit.right - nInplaceEditWidth;
  3234. if( IsPopup() )
  3235. rcInplaceEdit.right -= nDD;
  3236. } // else from if( bRTL )
  3237. return rcInplaceEdit;
  3238. }
  3239. UINT CExtPopupMenuWnd::MENUITEMDATA::GetCmdID() const
  3240. {
  3241. // if( IsSeparator()
  3242. // || IsInplaceEdit()
  3243. // )
  3244. // return ( (UINT) (IDC_STATIC) );
  3245. if( IsPopup() )
  3246. {
  3247. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3248. CExtCustomizeCmdTreeNode * pNode =
  3249. ( const_cast < MENUITEMDATA * > ( this ) )
  3250. -> GetCmdNode();
  3251. if( pNode == NULL )
  3252. return 0;
  3253. ASSERT_VALID( pNode );
  3254. if( ( pNode->GetFlags() & __ECTN_TBB_COLOR ) != 0 )
  3255. return 0;
  3256. // if( ( pNode->GetFlags() & __ECTN_TBB_UNDO_REDO ) != 0 )
  3257. // return pNode->GetCmdID();
  3258. // if( ( pNode->GetFlags() & __ECTN_TBB_SEPARATED_DROPDOWN ) == 0 )
  3259. // return 0;
  3260. // CExtCmdItem * pCmdItem =
  3261. // g_CmdManager->CmdGetPtr(
  3262. // g_CmdManager->ProfileNameFromWnd( GetCmdReceiver() ),
  3263. // pNode->GetCmdID()
  3264. // );
  3265. // if( pCmdItem != NULL )
  3266. // return pCmdItem->m_nCmdID;
  3267. if( ( pNode->GetFlags() & (__ECTN_TBB_UNDO_REDO|__ECTN_TBB_SEPARATED_DROPDOWN) ) != 0 )
  3268. return pNode->GetCmdID();
  3269. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3270. return ( (UINT) (IDC_STATIC) );
  3271. } // if( IsPopup() )
  3272. return m_nCmdID;
  3273. }
  3274. UINT CExtPopupMenuWnd::MENUITEMDATA::SetCmdID( UINT nCmdID )
  3275. {
  3276. // should be used only without references to command manager
  3277. ASSERT( ! IsPopup() ); // should not be applied for popups
  3278. UINT nOldCmdID = m_nCmdID;
  3279. m_nCmdID = nCmdID;
  3280. return nOldCmdID;
  3281. }
  3282. bool CExtPopupMenuWnd::MENUITEMDATA::IsExecutableCmdID() const
  3283. {
  3284. if( IsSeparator()
  3285. || IsInplaceEdit()
  3286. )
  3287. return false;
  3288. if( IsPopup() )
  3289. {
  3290. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3291. CExtCustomizeCmdTreeNode * pNode =
  3292. ( const_cast < MENUITEMDATA * > ( this ) )
  3293. -> GetCmdNode();
  3294. if( pNode == NULL )
  3295. return false;
  3296. ASSERT_VALID( pNode );
  3297. if( ( pNode->GetFlags() & __ECTN_TBB_COLOR ) != 0 )
  3298. return false;
  3299. // if( ( pNode->GetFlags() & __ECTN_TBB_UNDO_REDO ) != 0 )
  3300. // return false;
  3301. // if( ( pNode->GetFlags() & __ECTN_TBB_SEPARATED_DROPDOWN ) == 0 )
  3302. // return false;
  3303. CExtCmdItem * pCmdItem =
  3304. g_CmdManager->CmdGetPtr(
  3305. g_CmdManager->ProfileNameFromWnd( GetCmdReceiver() ),
  3306. pNode->GetCmdID()
  3307. );
  3308. if( pCmdItem != NULL
  3309. && pCmdItem->StateIsSeparatedDD()
  3310. )
  3311. return true;
  3312. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3313. return false;
  3314. } // if( IsPopup() )
  3315. return true;
  3316. }
  3317. bool CExtPopupMenuWnd::MENUITEMDATA::SetPopupText( __EXT_MFC_SAFE_LPCTSTR strText )
  3318. {
  3319. SetText( strText );
  3320. int nPos = m_sItemText.Find(_T('t'));
  3321. if( nPos >= 0 )
  3322. {
  3323. CExtSafeString sLeft = m_sItemText.Left(nPos);
  3324. CExtSafeString sRight = m_sItemText.Right(m_sItemText.GetLength()-nPos-1);
  3325. m_sItemText = sLeft;
  3326. m_sAccelText = sRight;
  3327. }
  3328. return true;
  3329. }
  3330. bool CExtPopupMenuWnd::MENUITEMDATA::SetPopupAccelText( __EXT_MFC_SAFE_LPCTSTR strText ) // NULL if empty
  3331. {
  3332. m_sAccelText = (strText == NULL) ? _T("") : strText;
  3333. return true;
  3334. }
  3335. __EXT_MFC_SAFE_LPCTSTR CExtPopupMenuWnd::MENUITEMDATA::GetText() const
  3336. {
  3337. if( IsSeparator() )
  3338. return _T("");
  3339. return m_sItemText;
  3340. }
  3341. void CExtPopupMenuWnd::MENUITEMDATA::SetText( __EXT_MFC_SAFE_LPCTSTR strText )
  3342. {
  3343. if( IsSeparator() )
  3344. return;
  3345. m_sItemText = (strText != NULL) ? strText : _T("");
  3346. }
  3347. __EXT_MFC_SAFE_LPCTSTR CExtPopupMenuWnd::MENUITEMDATA::GetAccelText() const
  3348. {
  3349. if( IsSeparator() )
  3350. return _T("");
  3351. return m_sAccelText;
  3352. }
  3353. void CExtPopupMenuWnd::MENUITEMDATA::SetAccelText( __EXT_MFC_SAFE_LPCTSTR strText )
  3354. {
  3355. if( IsSeparator() )
  3356. return;
  3357. m_sAccelText = (strText != NULL) ? strText : _T("");
  3358. }
  3359. void CExtPopupMenuWnd::MENUITEMDATA::AccelCharInit()
  3360. {
  3361. m_cAccelChar = _T('');
  3362. CExtSafeString sDisplayText( GetText() );
  3363. if( sDisplayText.IsEmpty() )
  3364. return;
  3365. int nIndex = sDisplayText.Find( _T('&') );
  3366. if( nIndex + 1 == sDisplayText.GetLength() )
  3367. {
  3368. TRACE(_T("warning : & is bad position, access key is invalid.n"));
  3369. return;
  3370. }
  3371. if( nIndex < 0 )
  3372. {
  3373. if( ! CExtPopupMenuWnd::g_bAllowNonAccelPositioning )
  3374. return;
  3375. m_cAccelChar = sDisplayText[0];
  3376. }
  3377. else
  3378. m_cAccelChar = sDisplayText[nIndex + 1]; // -1 + 1 = 0; it's ok
  3379. TCHAR szChar[2] = { TCHAR(m_cAccelChar), _T('') };
  3380. ::CharUpper( szChar );
  3381. m_cAccelChar = szChar[0];
  3382. }
  3383. __EXT_MFC_SAFE_TCHAR CExtPopupMenuWnd::MENUITEMDATA::AccelCharGet() const
  3384. {
  3385. return __EXT_MFC_SAFE_TCHAR( TCHAR(m_cAccelChar) );
  3386. }
  3387. bool CExtPopupMenuWnd::MENUITEMDATA::AccelCharIsSet() const
  3388. {
  3389. return (m_cAccelChar == _T('') ) ? false : true;
  3390. }
  3391. CExtCmdIcon * CExtPopupMenuWnd::MENUITEMDATA::GetIconPtr()
  3392. {
  3393. if( IsSeparator() )
  3394. return NULL;
  3395. // if( (! m_iconPopup.IsEmpty() ) || IsNoCmdUI() )
  3396. // return (m_iconPopup.IsEmpty()) ? NULL : (&m_iconPopup);
  3397. if( ! m_iconPopup.IsEmpty() )
  3398. return (&m_iconPopup);
  3399. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3400. CExtCustomizeCmdTreeNode * pNode = GetCmdNode();
  3401. if( pNode != NULL )
  3402. return
  3403. pNode->GetIconPtrInMenu(
  3404. g_CmdManager->CmdGetPtr(
  3405. g_CmdManager->ProfileNameFromWnd( GetCmdReceiver() ),
  3406. pNode->GetCmdID() //m_nCmdID
  3407. )
  3408. );
  3409. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3410. if( IsPopup() )
  3411. return NULL;
  3412. return
  3413. g_CmdManager->CmdGetIconPtr(
  3414. g_CmdManager->ProfileNameFromWnd( GetCmdReceiver() ),
  3415. m_nCmdID
  3416. );
  3417. }
  3418. const CExtCmdIcon * CExtPopupMenuWnd::MENUITEMDATA::GetIconPtr() const
  3419. {
  3420. return
  3421. ( const_cast < CExtPopupMenuWnd::MENUITEMDATA * > ( this ) )
  3422. -> GetIconPtr();
  3423. }
  3424. CExtCmdIcon & CExtPopupMenuWnd::MENUITEMDATA::GetIcon()
  3425. {
  3426. CExtCmdIcon * pIcon = GetIconPtr();
  3427. if( pIcon != NULL )
  3428. return (*pIcon);
  3429. static CExtCmdIcon g_EmptyIcon;
  3430. return g_EmptyIcon;
  3431. }
  3432. const CExtCmdIcon & CExtPopupMenuWnd::MENUITEMDATA::GetIcon() const
  3433. {
  3434. return
  3435. ( const_cast < CExtPopupMenuWnd::MENUITEMDATA * > ( this ) )
  3436. -> GetIcon();
  3437. }
  3438. bool CExtPopupMenuWnd::MENUITEMDATA::UpdateCmdManagerCommand(
  3439. CExtCmdItem * pCmdItem,
  3440. int nItemIndex
  3441. )
  3442. {
  3443. ASSERT( pCmdItem != NULL );
  3444. ASSERT( !IsPopup() );
  3445. ASSERT( m_pWndChild == NULL );
  3446. m_sItemText.Empty();
  3447. m_sAccelText.Empty();
  3448. m_nCmdID = pCmdItem->m_nCmdID;
  3449. if( ! CExtCmdManager::IsCommand(m_nCmdID) )
  3450. {
  3451. m_nCmdID = TYPE_SEPARATOR;
  3452. m_nItemIndex = -100;
  3453. ASSERT( FALSE );
  3454. return false;
  3455. }
  3456. if( nItemIndex >= 0 )
  3457. m_nItemIndex = nItemIndex;
  3458. SetText( pCmdItem->m_sMenuText );
  3459. SetAccelText( pCmdItem->m_sAccelText );
  3460. AccelCharInit();
  3461. MeasureItem( NULL );
  3462. return true;
  3463. }
  3464. CExtCmdItem * CExtPopupMenuWnd::MENUITEMDATA::GetCmd() const
  3465. {
  3466. if( IsSeparator() || IsNoCmdUI() )
  3467. return NULL;
  3468. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3469. CExtCustomizeCmdTreeNode * pNode =
  3470. ( const_cast < MENUITEMDATA * > ( this ) )
  3471. -> GetCmdNode();
  3472. if( pNode != NULL
  3473. && ( ( pNode->GetFlags() & (__ECTN_TBB_COLOR|__ECTN_TBB_SEPARATED_DROPDOWN) ) != 0
  3474. || ( pNode->GetFlags() & (__ECTN_TBB_UNDO_REDO|__ECTN_TBB_SEPARATED_DROPDOWN) ) != 0
  3475. || IsInplaceEdit()
  3476. )
  3477. )
  3478. {
  3479. CExtCmdItem * pCmdItem =
  3480. g_CmdManager->CmdGetPtr(
  3481. g_CmdManager->ProfileNameFromWnd( GetCmdReceiver() ),
  3482. pNode->GetCmdID(
  3483. ( ( pNode->GetFlags() & __ECTN_TBB_SEPARATED_DROPDOWN ) != 0 )
  3484. ? true : false
  3485. )
  3486. );
  3487. // ASSERT( pCmdItem != NULL );
  3488. return pCmdItem;
  3489. } // if( pNode != NULL ...
  3490. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3491. if( IsPopup() )
  3492. return NULL;
  3493. if( m_pOwner != NULL
  3494. && m_pOwner->_IsRibbonMode()
  3495. && m_pOwner->m_hWndNotifyMenuClosed != NULL
  3496. && ::IsWindow( m_pOwner->m_hWndNotifyMenuClosed )
  3497. )
  3498. {
  3499. CExtCmdItem * pCmdItem =
  3500. g_CmdManager->CmdGetPtr(
  3501. g_CmdManager->ProfileNameFromWnd( m_pOwner->m_hWndNotifyMenuClosed ),
  3502. m_nCmdID
  3503. );
  3504. //ASSERT( pCmdItem != NULL );
  3505. return pCmdItem;
  3506. }
  3507. else
  3508. {
  3509. CExtCmdItem * pCmdItem =
  3510. g_CmdManager->CmdGetPtr(
  3511. g_CmdManager->ProfileNameFromWnd( GetCmdReceiver() ),
  3512. m_nCmdID
  3513. );
  3514. //ASSERT( pCmdItem != NULL );
  3515. return pCmdItem;
  3516. }
  3517. }
  3518. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3519. CExtCustomizeCmdTreeNode * CExtPopupMenuWnd::MENUITEMDATA::GetCmdNode()
  3520. {
  3521. #ifdef _DEBUG
  3522. if( m_pCmdNode != NULL )
  3523. {
  3524. ASSERT_VALID( m_pCmdNode );
  3525. }
  3526. #endif // _DEBUG
  3527. return m_pCmdNode;
  3528. }
  3529. void CExtPopupMenuWnd::MENUITEMDATA::SetCmdNode( CExtCustomizeCmdTreeNode * pNode )
  3530. {
  3531. m_pCmdNode = pNode;
  3532. #ifdef _DEBUG
  3533. if( m_pCmdNode != NULL )
  3534. {
  3535. ASSERT_VALID( m_pCmdNode );
  3536. }
  3537. #endif // _DEBUG
  3538. }
  3539. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3540. void CExtPopupMenuWnd::MENUITEMDATA::MeasureItem(
  3541. CExtPaintManager * pPM
  3542. )
  3543. {
  3544. if( pPM == NULL )
  3545. pPM = g_PaintManager.GetPM();
  3546. ASSERT_VALID( pPM );
  3547. if( IsToolButton() )
  3548. m_nIconAreaWidth = 0;
  3549. else
  3550. {
  3551. m_nIconAreaWidth = __EXT_MENU_ICON_CX;
  3552. m_nIconAreaWidth = pPM->UiScalingDo( m_nIconAreaWidth, CExtPaintManager::__EUIST_Y );
  3553. }
  3554. if( pPM == NULL )
  3555. pPM = g_PaintManager.GetPM();
  3556. if( IsSeparator() )
  3557. {
  3558. m_sizeItem.cx = 0;
  3559. m_sizeItem.cy = pPM->GetSeparatorHeight();
  3560. return;
  3561. }
  3562. bool bBold = IsBold();
  3563. bool bForceNoText = false;
  3564. CExtCmdIcon * pIcon = GetIconPtr();
  3565. if( pIcon != NULL && pIcon->IsEmpty() )
  3566. pIcon = NULL;
  3567. if( pIcon == NULL || ( pIcon != NULL && (! IsIconMode() ) ) )
  3568. { // if non displaying text in icon mode
  3569. AccelCharInit();
  3570. CExtSafeString sMeasureText( GetText() );
  3571. if( ! ( IsInplaceEdit() || IsToolButton() ) )
  3572. {
  3573. if( m_pOwner == NULL
  3574. || ( m_pOwner->TrackFlagsGet() & TPMX_HIDE_KEYBOARD_ACCELERATORS ) == 0
  3575. )
  3576. sMeasureText += (LPCTSTR)GetAccelText();
  3577. }
  3578. sMeasureText.Replace( _T("&"), _T("") );
  3579. CWindowDC dc( NULL );
  3580. CFont * pOldFont =
  3581. dc.SelectObject(
  3582. bBold
  3583. ? (&(pPM->m_FontBold))
  3584. : (&(pPM->m_FontNormal))
  3585. );
  3586. //ASSERT( pOldFont != NULL );
  3587. CRect rect( 0, 0, 0, 0 );
  3588. ::DrawText(
  3589. dc.GetSafeHdc(),
  3590. sMeasureText,
  3591. sMeasureText.GetLength(),
  3592. &rect,
  3593. DT_CALCRECT|DT_SINGLELINE|DT_LEFT
  3594. );
  3595. m_sizeItem.cx = rect.Width();
  3596. m_sizeItem.cy = rect.Height();
  3597. if( m_sExtendedText.GetLength() > 0 )
  3598. {
  3599. CRect rcExtended( 0, 0, 0, 0 );
  3600. ::DrawText(
  3601. dc.GetSafeHdc(),
  3602. m_sExtendedText,
  3603. m_sExtendedText.GetLength(),
  3604. &rcExtended,
  3605. DT_CALCRECT|DT_TOP|DT_LEFT
  3606. );
  3607. CSize _sizeExtended = rcExtended.Size();
  3608. m_sizeItem.cx = max( m_sizeItem.cx, _sizeExtended.cx );
  3609. m_sizeItem.cy += _sizeExtended.cy + __EXT_MENU_IMG_RECT_OUT_GAP;
  3610. }
  3611. else if( IsBigAccent() )
  3612. m_sizeItem.cy += rect.Height();
  3613. m_sizeItem.cx += __EXT_MENU_IMG_RECT_OUT_GAP*2;
  3614. m_sizeItem.cy += __EXT_MENU_IMG_RECT_OUT_GAP*2;
  3615. dc.SelectObject( pOldFont );
  3616. } // if non displaying text in icon mode
  3617. else
  3618. {
  3619. bForceNoText = true;
  3620. m_sizeItem.cx = m_sizeItem.cy = 0;
  3621. }
  3622. if( bBold )
  3623. m_sizeItem.cx += 5;
  3624. CSize sizeIcon( 0, 0 );
  3625. int nIconHeightMetric = 0;
  3626. if( ! ( IsToolButton() && IsInplaceEdit() ) )
  3627. {
  3628. if( pIcon != NULL )
  3629. {
  3630. sizeIcon = pIcon->GetSize();
  3631. sizeIcon.cx = pPM->UiScalingDo( sizeIcon.cx, CExtPaintManager::__EUIST_X );
  3632. sizeIcon.cy = pPM->UiScalingDo( sizeIcon.cy, CExtPaintManager::__EUIST_Y );
  3633. if( g_bMenuLargeIcons )
  3634. {
  3635. sizeIcon.cx *= 2;
  3636. sizeIcon.cy *= 2;
  3637. } // if( g_bMenuLargeIcons )
  3638. CSize _sizeMinIconArea(
  3639. pPM->UiScalingDo( __EXT_MENU_ICON_CX, CExtPaintManager::__EUIST_X ),
  3640. pPM->UiScalingDo( __EXT_MENU_ICON_CY, CExtPaintManager::__EUIST_Y )
  3641. );
  3642. if( sizeIcon.cx < _sizeMinIconArea.cx )
  3643. sizeIcon.cx = _sizeMinIconArea.cx;
  3644. if( sizeIcon.cy < _sizeMinIconArea.cy )
  3645. sizeIcon.cy = _sizeMinIconArea.cy;
  3646. INT nAdjust = pPM->UiScalingDo( 18, CExtPaintManager::__EUIST_X );
  3647. if( sizeIcon.cx <= nAdjust && sizeIcon.cy < sizeIcon.cx )
  3648. sizeIcon.cy = sizeIcon.cx;
  3649. if( ! IsToolButton() )
  3650. {
  3651. INT _cx = pPM->UiScalingDo( sizeIcon.cx, CExtPaintManager::__EUIST_X );
  3652. m_nIconAreaWidth = max( m_nIconAreaWidth, _cx );
  3653. }
  3654. else
  3655. m_sizeItem.cx +=
  3656. sizeIcon.cx +
  3657. pPM->UiScalingDo( __EXT_MENU_IMG_RECT_OUT_GAP*2, CExtPaintManager::__EUIST_X )
  3658. ;
  3659. nIconHeightMetric =
  3660. sizeIcon.cy +
  3661. pPM->UiScalingDo( __EXT_MENU_IMG_RECT_OUT_GAP*2, CExtPaintManager::__EUIST_Y )
  3662. ;
  3663. m_sizeItem.cy = max( m_sizeItem.cy, nIconHeightMetric );
  3664. } // if( pIcon != NULL )
  3665. }
  3666. m_sizeItem.cy = max( m_sizeItem.cy, nIconHeightMetric );
  3667. INT nMenuMinHeight = pPM->UiScalingDo( __EXT_MENU_MIN_HEIGHT, CExtPaintManager::__EUIST_Y );
  3668. if( m_sizeItem.cy < nMenuMinHeight )
  3669. m_sizeItem.cy = nMenuMinHeight;
  3670. if( IsToolButton() )
  3671. {
  3672. if( sizeIcon.cy == 0 )
  3673. m_sizeItem.cy -= 2;
  3674. }
  3675. else
  3676. {
  3677. INT _cx = pPM->UiScalingDo( sizeIcon.cx, CExtPaintManager::__EUIST_X );
  3678. m_nIconAreaWidth = max( _cx, m_sizeItem.cy );
  3679. if( IsExtraMark() )
  3680. {
  3681. m_nIconAreaWidth *= 2;
  3682. m_nIconAreaWidth += pPM->UiScalingDo( 4, CExtPaintManager::__EUIST_Y );;
  3683. } // if( IsExtraMark() )
  3684. m_nIconAreaWidth += pPM->UiScalingDo( 2, CExtPaintManager::__EUIST_Y );; // + 2.28
  3685. m_sizeItem.cx += __EXT_MENU_GAP * 7;
  3686. m_sizeItem.cx += 5; // + 2.28
  3687. }
  3688. if( IsInplaceEdit() )
  3689. {
  3690. m_sizeItem.cx += m_nInplaceEditWidth;
  3691. if( ! IsToolButton() )
  3692. {
  3693. m_sizeItem.cx += + 2 + 10;
  3694. if( g_bMenuLargeIcons )
  3695. m_sizeItem.cx += m_nIconAreaWidth;
  3696. } // if( ! IsToolButton() )
  3697. if( ! g_bMenuLargeIcons )
  3698. m_sizeItem.cy -= 2; // + 2.28
  3699. } // if( IsInplaceEdit() )
  3700. else if( IsToolButton() )
  3701. {
  3702. if( IsPopup() )
  3703. {
  3704. //m_sizeItem.cx += __DROPDOWN_ARROW_GAP * 2 + __EXT_MENU_GAP * 2 + 5;