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

界面编程

开发平台:

Visual C++

  1. // MainDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ProfUIS_Controls.h"
  5. #include "MainDlg.h"
  6. #include <intshcut.h>
  7. #if (!defined __EXT_REGISTRY_H)
  8. #include <ExtRegistry.h>
  9. #endif
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. #define ID_FAVORITES_FIRSTURL  40000
  16. #define ID_FAVORITES_LASTURL   45000
  17. typedef BOOL (CALLBACK* LPFNADDFAV)(HWND, TCHAR*, UINT, TCHAR*, UINT, LPITEMIDLIST);
  18. typedef UINT (CALLBACK* LPFNORGFAV)(HWND, LPTSTR);
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CSplashWnd
  21. static bool g_bSplashWndClassRegistered = false;
  22. CSplashWnd::CSplashWnd(
  23. CWnd * pWndParent,
  24. UINT nBitmapID
  25. )
  26. : m_nMaxTextLines( -1 )
  27. , m_nLineHeight( -1 )
  28. , m_clrText( RGB(255,255,255) )
  29. , m_rcText( 0, 0, 0, 0 )
  30. {
  31. VERIFY( RegisterSplashWndClass() );
  32. VERIFY( Create( pWndParent, nBitmapID ) );
  33. }
  34. CSplashWnd::~CSplashWnd()
  35. {
  36. if( GetSafeHwnd() != NULL )
  37. DestroyWindow();
  38. }
  39. BEGIN_MESSAGE_MAP(CSplashWnd, CWnd)
  40. //{{AFX_MSG_MAP(CSplashWnd)
  41. ON_WM_ERASEBKGND()
  42. ON_WM_PAINT()
  43. ON_WM_NCCALCSIZE()
  44. __EXT_MFC_ON_WM_NCHITTEST()
  45. ON_WM_CLOSE()
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CSplashWnd message handlers
  50. void CSplashWnd::AddTextLine(
  51. LPCTSTR sText // = NULL
  52. )
  53. {
  54. ASSERT_VALID( this );
  55. m_arrTextLines.Add( (sText == NULL) ? _T("") : sText );
  56. if( GetSafeHwnd() == NULL )
  57. return;
  58. if( (GetStyle() & WS_VISIBLE) == 0 )
  59. return;
  60. Invalidate();
  61. UpdateWindow();
  62. }
  63. void CSplashWnd::ReplaceLastLine(
  64. LPCTSTR sText // = NULL
  65. )
  66. {
  67. if( m_arrTextLines.GetSize() == 0 )
  68. return;
  69. m_arrTextLines.ElementAt( m_arrTextLines.GetSize() - 1 ) = (sText == NULL) ? _T("") : sText;
  70. if( GetSafeHwnd() == NULL )
  71. return;
  72. if( (GetStyle() & WS_VISIBLE) == 0 )
  73. return;
  74. Invalidate();
  75. UpdateWindow();
  76. }
  77. void CSplashWnd::ClearLines()
  78. {
  79. ASSERT_VALID( this );
  80. if( m_arrTextLines.GetSize() == 0 )
  81. return;
  82. m_arrTextLines.RemoveAll();
  83. if( GetSafeHwnd() == NULL )
  84. return;
  85. ASSERT( ::IsWindow( GetSafeHwnd() ) );
  86. if( (GetStyle() & WS_VISIBLE) == 0 )
  87. return;
  88. Invalidate();
  89. UpdateWindow();
  90. }
  91. bool CSplashWnd::Create(
  92. CWnd * pWndParent,
  93. UINT nBitmapID
  94. )
  95. {
  96. ASSERT_VALID( this );
  97. ASSERT( GetSafeHwnd() == NULL );
  98. ASSERT( m_bitmap.GetSafeHandle() == NULL );
  99. ASSERT( m_wndInvisibleParent.GetSafeHwnd() == NULL );
  100. if( ! RegisterSplashWndClass() )
  101. {
  102. ASSERT( FALSE );
  103. return false;
  104. }
  105. if( ! m_bitmap.LoadBitmap( nBitmapID ) )
  106. {
  107. ASSERT( FALSE );
  108. return false;
  109. }
  110. BITMAP _bmpInfo;
  111. ::memset( &_bmpInfo, 0, sizeof(BITMAP) );
  112. m_bitmap.GetBitmap( &_bmpInfo );
  113. m_sizeBitmap.cx = _bmpInfo.bmWidth;
  114. m_sizeBitmap.cy = _bmpInfo.bmHeight;
  115. CExtPaintManager::monitor_parms_t _mp;
  116. CExtPaintManager::stat_GetMonitorParms( _mp, pWndParent );
  117. CRect rcWnd( 0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy );
  118. rcWnd.OffsetRect(
  119. ( _mp.m_rcWorkArea.Width() - m_sizeBitmap.cx ) / 2,
  120. ( _mp.m_rcWorkArea.Height() - m_sizeBitmap.cy ) / 2
  121. );
  122. if( ! m_wndInvisibleParent.CreateEx( 0, _T("STATIC"), _T(""), WS_POPUP, 0,0,0,0, pWndParent->GetSafeHwnd(), (HMENU)NULL ) )
  123. {
  124. ASSERT( FALSE );
  125. m_bitmap.DeleteObject();
  126. return false;
  127. }
  128. if( ! CWnd::CreateEx(
  129. 0, __SIMPLE_SPLASH_WINDOW_CLASS_NAME__, _T("Initizlizing ..."), WS_POPUP,
  130. rcWnd.left, rcWnd.top, m_sizeBitmap.cx, m_sizeBitmap.cy, m_wndInvisibleParent.GetSafeHwnd(), (HMENU)NULL
  131. )
  132. )
  133. {
  134. ASSERT( FALSE );
  135. m_bitmap.DeleteObject();
  136. m_wndInvisibleParent.DestroyWindow();
  137. return false;
  138. }
  139. VERIFY(
  140. ::SetWindowPos(
  141. m_hWnd, HWND_TOP, 0, 0, 0, 0,
  142. SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOOWNERZORDER
  143. )
  144. );
  145. CExtPopupMenuWnd::PassMsgLoop( false );
  146. return true;
  147. }
  148. BOOL CSplashWnd::OnEraseBkgnd(CDC* pDC) 
  149. {
  150. pDC;
  151. return TRUE;
  152. }
  153. void CSplashWnd::OnPaint() 
  154. {
  155. ASSERT( m_bitmap.GetSafeHandle() != NULL );
  156. CPaintDC dcPaint( this );
  157. CExtMemoryDC dc( &dcPaint );
  158. CDC dcImg;
  159. if( ! dcImg.CreateCompatibleDC( &dcPaint ) )
  160. {
  161. ASSERT( FALSE );
  162. return;
  163. }
  164. CBitmap * pOldBmp = dcImg.SelectObject( &m_bitmap );
  165. dc.BitBlt(
  166. 0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy,
  167. &dcImg,
  168. 0, 0,
  169. SRCCOPY
  170. );
  171. dcImg.SelectObject( pOldBmp );
  172. dcImg.DeleteDC();
  173. int nLen, i, nCount = int( m_arrTextLines.GetSize() );
  174. if( nCount > 0 )
  175. {
  176. if( m_rcText.IsRectEmpty() )
  177. {
  178. GetClientRect( &m_rcText );
  179. m_rcText.DeflateRect(
  180. 10,
  181. 30,
  182. 10,
  183. 10
  184. );
  185. }
  186. if( m_font.GetSafeHandle() == 0 )
  187. {
  188. LOGFONT _lf;
  189. ::memset( &_lf, 0, sizeof(LOGFONT) );
  190. g_PaintManager->m_FontNormal.GetLogFont( &_lf );
  191. __EXT_MFC_STRCPY( _lf.lfFaceName, LF_FACESIZE, _T("Arial") );
  192. _lf.lfWeight = 300;
  193. _lf.lfItalic = FALSE;
  194. _lf.lfUnderline = FALSE;
  195. _lf.lfStrikeOut = FALSE;
  196. _lf.lfWidth = 0;
  197. _lf.lfHeight = 12;
  198. VERIFY( m_font.CreateFontIndirect( &_lf ) );
  199. }
  200. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  201. COLORREF clrTextOld = dc.SetTextColor( m_clrText );
  202. CFont * pOldFont = dc.SelectObject( &m_font );
  203. if( m_nLineHeight < 0 )
  204. {
  205. TEXTMETRIC _tm;
  206. ::memset( &_tm, 0, sizeof(TEXTMETRIC) );
  207. dc.GetTextMetrics( &_tm );
  208. m_nLineHeight = _tm.tmHeight;
  209. }
  210. if( m_nMaxTextLines < 0 )
  211. {
  212. m_nMaxTextLines = m_rcText.Height() / m_nLineHeight;
  213. if( m_nMaxTextLines < 0 )
  214. m_nMaxTextLines = 0;
  215. }
  216. if( nCount > m_nMaxTextLines )
  217. {
  218. m_arrTextLines.RemoveAt( 0, nCount - m_nMaxTextLines );
  219. nCount = m_nMaxTextLines;
  220. }
  221. int nY = m_rcText.top;
  222. for( i = 0; i < nCount; i++ )
  223. {
  224. LPCTSTR sText = m_arrTextLines[i];
  225. if( sText != NULL && ( nLen = int( _tcslen(sText) ) ) > 0 )
  226. {
  227. CRect rcText = m_rcText;
  228. rcText.OffsetRect(
  229. 0,
  230. nY - rcText.top
  231. );
  232. dc.DrawText(
  233. sText,
  234. nLen,
  235. &rcText,
  236. DT_SINGLELINE|DT_TOP|DT_RIGHT|DT_END_ELLIPSIS  
  237. );
  238. } // if( sText != NULL && ( nLen = int( _tcslen(sText) ) ) > 0 )
  239. nY += m_nLineHeight;
  240. } // for( i = 0; i < nCount; i++ )
  241. dc.SelectObject( pOldFont );
  242. dc.SetTextColor( clrTextOld );
  243. dc.SetBkMode( nOldBkMode );
  244. } // if( nCount > 0 )
  245. }
  246. void CSplashWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  247. {
  248. bCalcValidRects;
  249. lpncsp;
  250. }
  251. UINT CSplashWnd::OnNcHitTest(CPoint point) 
  252. {
  253. point;
  254. return HTCLIENT;
  255. }
  256. void CSplashWnd::OnClose() 
  257. {
  258. }
  259. BOOL CSplashWnd::PreCreateWindow(CREATESTRUCT& cs) 
  260. {
  261. if( ( ! RegisterSplashWndClass() ) || ( ! CWnd::PreCreateWindow( cs ) ) )
  262. {
  263. ASSERT( FALSE );
  264. return FALSE;
  265. }
  266. cs.lpszClass = __SIMPLE_SPLASH_WINDOW_CLASS_NAME__;
  267. return TRUE;
  268. }
  269. bool CSplashWnd::RegisterSplashWndClass()
  270. {
  271. if( g_bSplashWndClassRegistered )
  272. return true;
  273. WNDCLASS _wndClassInfo;
  274. HINSTANCE hInst = AfxGetInstanceHandle();
  275. if( ! ::GetClassInfo( hInst, __SIMPLE_SPLASH_WINDOW_CLASS_NAME__, &_wndClassInfo ) )
  276. {
  277. // otherwise we need to register a new class
  278. _wndClassInfo.style =
  279. CS_GLOBALCLASS
  280. //|CS_DBLCLKS
  281. |CS_HREDRAW|CS_VREDRAW
  282. |CS_NOCLOSE
  283. |CS_SAVEBITS
  284. ;
  285. _wndClassInfo.lpfnWndProc = ::DefWindowProc;
  286. _wndClassInfo.cbClsExtra = _wndClassInfo.cbWndExtra = 0;
  287. _wndClassInfo.hInstance = hInst;
  288. _wndClassInfo.hIcon = NULL;
  289. _wndClassInfo.hCursor =
  290. ::LoadCursor(
  291. NULL, //hInst,
  292. IDC_WAIT
  293. )
  294. ;
  295. ASSERT( _wndClassInfo.hCursor != NULL );
  296. _wndClassInfo.hbrBackground = NULL; 
  297. _wndClassInfo.lpszMenuName = NULL;
  298. _wndClassInfo.lpszClassName = __SIMPLE_SPLASH_WINDOW_CLASS_NAME__;
  299. if( !::AfxRegisterClass( &_wndClassInfo ) )
  300. {
  301. ASSERT( FALSE );
  302. //AfxThrowResourceException();
  303. return false;
  304. }
  305. }
  306. g_bSplashWndClassRegistered = true;
  307. return true;
  308. }
  309. BOOL CSplashWnd::DestroyWindow() 
  310. {
  311. ShowWindow( SW_HIDE );
  312. CExtPopupMenuWnd::PassMsgLoop( false );
  313. CWnd::DestroyWindow();
  314. if( m_wndInvisibleParent.GetSafeHwnd() != NULL )
  315. m_wndInvisibleParent.DestroyWindow();
  316. return TRUE;
  317. }
  318. /////////////////////////////////////////////////////////////////////////////
  319. // CMainDlg dialog
  320. IMPLEMENT_DYNAMIC( CMainDlg, CExtResizableDialog );
  321. CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/)
  322. : CExtNCW < CExtResizableDialog > ( CMainDlg::IDD, pParent )
  323. , m_pPageNotAvailable( NULL )
  324. #if (!defined __EXT_MFC_NO_TAB_CTRL)
  325. , m_pPageTabWindows( NULL )
  326. #endif
  327. , m_pPageButtons( NULL )
  328. , m_pPageHyperLinks( NULL )
  329. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL && !defined __EXT_MFC_NO_TAB_PAGECONTAINER_FLAT_CTRL )
  330. , m_pPageTabContainers( NULL )
  331. #endif
  332. , m_pPagePopupMenus( NULL )
  333. , m_pPageStatusBar( NULL )
  334. , m_pPageToolbars( NULL )
  335. #if (!defined __EXT_MFC_NO_DATE_PICKER)
  336. , m_pPageCalendar( NULL )
  337. #endif
  338. #if (!defined __EXT_MFC_NO_DURATIONWND && !defined __EXT_MFC_NO_DATETIMEWND )
  339. , m_pPageDateTimeDuration( NULL )
  340. #endif
  341. #if (!defined __EXT_MFC_NO_DATE_BROWSER )
  342. , m_pPageDateBrowser( NULL )
  343. #endif
  344. #if (!defined __EXT_MFC_NO_GRIDWND)
  345. , m_pPageGrid( NULL )
  346. , m_pPageMaskedEdit( NULL )
  347. #endif
  348. , m_pPageSystemNumberCurrencyEdit( NULL )
  349. #if ( ! defined __EXT_MFC_NO_LIST_VIEW_CTRL )
  350. , m_pPageListCtrl( NULL )
  351. #endif
  352. #if ( ! defined __EXT_MFC_NO_TREE_VIEW_CTRL )
  353. , m_pPageTreeCtrl( NULL )
  354. #endif
  355. #if ( ! defined __EXT_MFC_NO_SHELL_LIST_VIEW_CTRL )
  356. , m_pPageShellListCtrl( NULL )
  357. #endif
  358. #if ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )
  359. , m_pPageShellTreeCtrl( NULL )
  360. #endif
  361. #if ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL ) && ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )&& ( ! defined __EXT_MFC_NO_SHELL_COMBO_BOX )
  362. , m_pPageShellBrowser( NULL )
  363. #endif
  364. #if ( ! defined __EXT_MFC_NO_SHELL_DIALOG_FILE )
  365. , m_pPageShellDialogFile( NULL )
  366. #endif
  367. #if ( ! defined __EXT_MFC_NO_SHELL_DIALOG_BFF )
  368. , m_pPageShellDialogBrowseFor( NULL )
  369. #endif
  370. , m_pMalloc( NULL )
  371. {
  372. //{{AFX_DATA_INIT(CMainDlg)
  373. //}}AFX_DATA_INIT
  374. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  375. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  376. m_bDialogInitComplete = false;
  377. SetAutoSubclassChildControls();
  378. }
  379. CMainDlg::~CMainDlg()
  380. {
  381. if( m_pMalloc != NULL )
  382. m_pMalloc->Release();
  383. }
  384. void CMainDlg::DoDataExchange(CDataExchange* pDX)
  385. {
  386. CExtNCW < CExtResizableDialog > :: DoDataExchange( pDX );
  387. //{{AFX_DATA_MAP(CMainDlg)
  388. //}}AFX_DATA_MAP
  389. DDX_Control(pDX, IDC_LIST, m_wndList);
  390. DDX_Control( pDX, IDC_MAIN_MENUBAR, m_wndMenuBar );
  391. DDX_Control( pDX, IDC_MAIN_TOOLBAR, m_wndToolBarUiLook );
  392. }
  393. BEGIN_MESSAGE_MAP( CMainDlg, CExtResizableDialog )
  394. //{{AFX_MSG_MAP(CMainDlg)
  395. ON_WM_PAINT()
  396. ON_WM_QUERYDRAGICON()
  397. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  398. ON_WM_SIZE()
  399. ON_LBN_SELCHANGE(IDC_LIST, OnSelchangeList)
  400. ON_BN_CLICKED(IDC_BACK, OnBack)
  401. ON_BN_CLICKED(IDC_NEXT, OnNext)
  402. ON_COMMAND(ID_FAVORITES_ADD, OnFavoritesAdd)
  403. ON_COMMAND(ID_FAVORITES_ORGANIZE, OnFavoritesOrganize)
  404. //}}AFX_MSG_MAP
  405. ON_REGISTERED_MESSAGE( CExtPopupMenuWnd::g_nMsgPrepareOneMenuLevel, OnExtMenuPrepareLevel )
  406. ON_COMMAND_RANGE( ID_FAVORITES_FIRSTURL, ID_FAVORITES_LASTURL, OnFavoritesURL )
  407. END_MESSAGE_MAP()
  408. /////////////////////////////////////////////////////////////////////////////
  409. // CMainDlg message handlers
  410. /////////////////////////////////////////////////////////////////////////////
  411. BOOL CMainDlg::OnInitDialog()
  412. {
  413. if( ! CExtNCW < CExtResizableDialog > :: OnInitDialog() )
  414. {
  415. ASSERT( FALSE );
  416. return FALSE;
  417. }
  418. CWinApp * pApp = ::AfxGetApp();
  419. ASSERT( pApp != NULL );
  420. ASSERT( pApp->m_pszRegistryKey != NULL );
  421. ASSERT( pApp->m_pszRegistryKey[0] != _T('') );
  422. ASSERT( pApp->m_pszProfileName != NULL );
  423. ASSERT( pApp->m_pszProfileName[0] != _T('') );
  424. CSplashWnd _splash( this );
  425. _splash.AddTextLine( _T("Initializing command manager ...") );
  426. VERIFY( g_CmdManager->ProfileWndAdd( pApp->m_pszProfileName, GetSafeHwnd() ) );
  427. VERIFY( g_CmdManager->UpdateFromMenu( pApp->m_pszProfileName, IDR_MAIN_MENU ) );
  428. VERIFY( g_CmdManager->UpdateFromMenu( pApp->m_pszProfileName, IDR_POPUP_MENU ) );
  429. VERIFY( g_CmdManager->UpdateFromToolBar( pApp->m_pszProfileName, IDR_EDIT ) );
  430. _splash.AddTextLine( _T("Creating bars ...") );
  431. ASSERT( m_wndMenuBar.GetSafeHwnd() != NULL );
  432. if( ! m_wndMenuBar.LoadMenuBar( IDR_MAIN_MENU ) )
  433. {
  434. ASSERT( FALSE );
  435. return FALSE;
  436. }
  437. m_wndMenuBar.SetBarStyle( m_wndMenuBar.GetBarStyle() & (~CBRS_GRIPPER) );
  438. ASSERT( m_wndToolBarUiLook.GetSafeHwnd() != NULL );
  439. if( ! m_wndToolBarUiLook.ThemeSwitcherInit() )
  440. {
  441. ASSERT( FALSE );
  442. return FALSE;
  443. }
  444. m_wndToolBarUiLook.SetBarStyle( m_wndToolBarUiLook.GetBarStyle() & (~CBRS_GRIPPER) );
  445. _splash.AddTextLine( _T("Configuring main dialog window ...") );
  446. static UINT g_statBasicCommands[] =
  447. {
  448. ID_APP_ABOUT,
  449. ID_APP_EXIT,
  450. ID_OWNERDRAW_ITEM,
  451. ID_COLOR_CTRL_8X5,
  452. ID_COLOR_CTRL_8X2,
  453. ID_COLOR_CTRL_GRAYSCALE,
  454. ID_COLOR_CTRL_HLS,
  455. ID_DATE_PICKER_CTRL,
  456. ID_PALETTE_MENU,
  457. ID_FAVORITES_ADD,
  458. ID_FAVORITES_ORGANIZE,
  459. 0, // end of list
  460. };
  461. VERIFY( g_CmdManager->SetBasicCommands( pApp->m_pszProfileName, g_statBasicCommands ) );
  462. SetIcon( m_hIcon, TRUE );
  463. SetIcon( m_hIcon, FALSE );
  464. AddAnchor( IDC_LIST, __RDA_LT, __RDA_LB );
  465. AddAnchor( IDOK, __RDA_RB );
  466. AddAnchor( IDC_NEXT, __RDA_RB );
  467. AddAnchor( IDC_BACK, __RDA_RB );
  468. AddAnchor( IDC_STATIC_DELIVER_FRAME, __RDA_LB, __RDA_RB );
  469. AddAnchor( IDC_STATIC_PAGES_RECT, __RDA_LT, __RDA_RB );
  470. //////////////////////////////////////////////////////////////////////////
  471. CWnd * pWndPageAlignment = GetDlgItem( IDC_STATIC_PAGES_RECT );
  472. ASSERT( pWndPageAlignment->GetSafeHwnd() != NULL );
  473. CRect rcPages;
  474. pWndPageAlignment->GetWindowRect( &rcPages );
  475. ScreenToClient( &rcPages );
  476. HINSTANCE hInstResource =
  477. ::AfxFindResourceHandle(
  478. MAKEINTRESOURCE( IDR_MAINFRAME ),
  479. RT_ICON
  480. );
  481. ASSERT( hInstResource != NULL );
  482. _splash.AddTextLine( _T("Creating dialog pages ...") );
  483. //////////////////////////////////////////////////////////////////////////
  484. //_splash.AddTextLine( _T("... ") );
  485. m_pPageNotAvailable = new CPageNotAvailable;
  486. m_pPageNotAvailable->Create(
  487. CPageNotAvailable::IDD,
  488. this
  489. );
  490. //////////////////////////////////////////////////////////////////////////
  491. _splash.AddTextLine( _T("    ... buttons page") );
  492. m_pPageButtons = new CPageButtons;
  493. m_pPageButtons->Create(
  494. CPageButtons::IDD,
  495. this
  496. );
  497. //////////////////////////////////////////////////////////////////////////
  498. _splash.AddTextLine( _T("    ... hyper links page") );
  499. m_pPageHyperLinks = new CPageHyperLinks;
  500. m_pPageHyperLinks->Create(
  501. CPageHyperLinks::IDD,
  502. this
  503. );
  504. //////////////////////////////////////////////////////////////////////////
  505. #if (!defined __EXT_MFC_NO_TAB_CTRL)
  506. _splash.AddTextLine( _T("    ... tab controls page") );
  507. m_pPageTabWindows = new CPageTabWindow;
  508. m_pPageTabWindows->Create(
  509. CPageTabWindow::IDD,
  510. this
  511. );
  512. #endif // (!defined __EXT_MFC_NO_TAB_CTRL)
  513. //////////////////////////////////////////////////////////////////////////
  514. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL && !defined __EXT_MFC_NO_TAB_PAGECONTAINER_FLAT_CTRL )
  515. _splash.AddTextLine( _T("    ... tab page containers page") );
  516. m_pPageTabContainers = new CPageTabContainers;
  517. m_pPageTabContainers->Create(
  518. CPageTabContainers::IDD,
  519. this
  520. );
  521. #endif // #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL && !defined __EXT_MFC_NO_TAB_PAGECONTAINER_FLAT_CTRL )
  522. //////////////////////////////////////////////////////////////////////////
  523. _splash.AddTextLine( _T("    ... popup menus page") );
  524. m_pPagePopupMenus = new CPagePopupMenus;
  525. m_pPagePopupMenus->Create(
  526. CPagePopupMenus::IDD,
  527. this
  528. );
  529. //////////////////////////////////////////////////////////////////////////
  530. _splash.AddTextLine( _T("    ... status bar page") );
  531. m_pPageStatusBar = new CPageStatusBar;
  532. m_pPageStatusBar->Create(
  533. CPageStatusBar::IDD,
  534. this
  535. );
  536. //////////////////////////////////////////////////////////////////////////
  537. _splash.AddTextLine( _T("    ... toolbars page") );
  538. m_pPageToolbars = new CPageToolbars;
  539. m_pPageToolbars->Create(
  540. CPageToolbars::IDD,
  541. this
  542. );
  543. //////////////////////////////////////////////////////////////////////////
  544. #if (!defined __EXT_MFC_NO_GRIDWND)
  545. _splash.AddTextLine( _T("    ... masked edit page") );
  546. m_pPageMaskedEdit = new CPageMaskedEdit;
  547. m_pPageMaskedEdit->Create(
  548. CPageMaskedEdit::IDD,
  549. this
  550. );
  551. #endif // #if (!defined __EXT_MFC_NO_GRIDWND)
  552. //////////////////////////////////////////////////////////////////////////
  553. _splash.AddTextLine( _T("    ... system number and currency editors page") );
  554. m_pPageSystemNumberCurrencyEdit = new CPageSystemNumberCurrencyEditors;
  555. m_pPageSystemNumberCurrencyEdit->Create(
  556. CPageSystemNumberCurrencyEditors::IDD,
  557. this
  558. );
  559. //////////////////////////////////////////////////////////////////////////
  560. #if (!defined __EXT_MFC_NO_DATE_PICKER)
  561. _splash.AddTextLine( _T("    ... calendar page") );
  562. m_pPageCalendar = new CPageCalendar;
  563. m_pPageCalendar->Create(
  564. CPageCalendar::IDD,
  565. this
  566. );
  567. #endif // #if (!defined __EXT_MFC_NO_DATE_PICKER)
  568. //////////////////////////////////////////////////////////////////////////
  569. #if (!defined __EXT_MFC_NO_DURATIONWND && !defined __EXT_MFC_NO_DATETIMEWND )
  570. _splash.AddTextLine( _T("    ... date/time/duration page") );
  571. m_pPageDateTimeDuration = new CPageDateTimeDuration;
  572. m_pPageDateTimeDuration->Create(
  573. CPageDateTimeDuration::IDD,
  574. this
  575. );
  576. #endif
  577. //////////////////////////////////////////////////////////////////////////
  578. #if (!defined __EXT_MFC_NO_DATE_BROWSER )
  579. _splash.AddTextLine( _T("    ... date browser page") );
  580. m_pPageDateBrowser = new CPageDateBrowser;
  581. m_pPageDateBrowser->Create(
  582. CPageDateBrowser::IDD,
  583. this
  584. );
  585. #endif
  586. //////////////////////////////////////////////////////////////////////////
  587. #if (!defined __EXT_MFC_NO_GRIDWND)
  588. _splash.AddTextLine( _T("    ... grid page") );
  589. m_pPageGrid = new CPageGrid;
  590. m_pPageGrid->Create(
  591. CPageGrid::IDD,
  592. this
  593. );
  594. #endif // #if (!defined __EXT_MFC_NO_GRIDWND)
  595. //////////////////////////////////////////////////////////////////////////
  596. #if ( ! defined __EXT_MFC_NO_LIST_VIEW_CTRL )
  597. _splash.AddTextLine( _T("    ... list view control page") );
  598. m_pPageListCtrl = new CPageListCtrl;
  599. m_pPageListCtrl->Create(
  600. CPageListCtrl::IDD,
  601. this
  602. );
  603. #endif // ( ! defined __EXT_MFC_NO_LIST_VIEW_CTRL )
  604. //////////////////////////////////////////////////////////////////////////
  605. #if ( ! defined __EXT_MFC_NO_TREE_VIEW_CTRL )
  606. _splash.AddTextLine( _T("    ... tree view control page") );
  607. m_pPageTreeCtrl = new CPageTreeCtrl;
  608. m_pPageTreeCtrl->Create(
  609. CPageTreeCtrl::IDD,
  610. this
  611. );
  612. #endif // ( ! defined __EXT_MFC_NO_TREE_VIEW_CTRL )
  613. //////////////////////////////////////////////////////////////////////////
  614. #if ( ! defined __EXT_MFC_NO_SHELL_LIST_VIEW_CTRL )
  615. _splash.AddTextLine( _T("    ... shell list view control page") );
  616. m_pPageShellListCtrl = new CPageShellListCtrl;
  617. m_pPageShellListCtrl->Create(
  618. CPageShellListCtrl::IDD,
  619. this
  620. );
  621. #endif // ( ! defined __EXT_MFC_NO_SHELL_LIST_VIEW_CTRL )
  622. //////////////////////////////////////////////////////////////////////////
  623. #if ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )
  624. _splash.AddTextLine( _T("    ... shell tree view control page") );
  625. m_pPageShellTreeCtrl = new CPageShellTreeCtrl;
  626. m_pPageShellTreeCtrl->Create(
  627. CPageShellTreeCtrl::IDD,
  628. this
  629. );
  630. #endif // ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )
  631. //////////////////////////////////////////////////////////////////////////
  632. #if ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL ) && ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )&& ( ! defined __EXT_MFC_NO_SHELL_COMBO_BOX )
  633. _splash.AddTextLine( _T("    ... shell browser page") );
  634. m_pPageShellBrowser = new CPageShellBrowser;
  635. m_pPageShellBrowser->Create(
  636. CPageShellBrowser::IDD,
  637. this
  638. );
  639. #endif ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL ) && ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )&& ( ! defined __EXT_MFC_NO_SHELL_COMBO_BOX )
  640. //////////////////////////////////////////////////////////////////////////
  641. #if ( ! defined __EXT_MFC_NO_SHELL_DIALOG_FILE )
  642. _splash.AddTextLine( _T("    ... shell file dialog") );
  643. m_pPageShellDialogFile = new CPageShellDialogFile;
  644. m_pPageShellDialogFile->Create(
  645. CPageShellDialogFile::IDD,
  646. this
  647. );
  648. #endif // ( ! defined __EXT_MFC_NO_SHELL_DIALOG_FILE )
  649. //////////////////////////////////////////////////////////////////////////
  650. #if ( ! defined __EXT_MFC_NO_SHELL_DIALOG_BFF )
  651. _splash.AddTextLine( _T("    ... shell browse for folder dialog") );
  652. m_pPageShellDialogBrowseFor = new CPageShellDialogBrowseFor;
  653. m_pPageShellDialogBrowseFor->Create(
  654. CPageShellDialogBrowseFor::IDD,
  655. this
  656. );
  657. #endif // ( ! defined __EXT_MFC_NO_SHELL_DIALOG_BFF )
  658. //////////////////////////////////////////////////////////////////////////
  659. // TODO:
  660. // Color controls
  661. // Toolbox
  662. // Shortcut List
  663. // Misc Control (Font combobox, Browse Edit)
  664. //////////////////////////////////////////////////////////////////////////
  665. _splash.AddTextLine( _T("Registering page windows ...") );
  666. struct
  667. {
  668. LPCTSTR m_strResource;
  669. INT m_nWidth, m_nHeight;
  670. UINT m_nLoadImageFlags;
  671. CPageBase * m_pWndPage;
  672. LPCTSTR m_strText;
  673. bool m_bCreateInsideScrollContainer:1;
  674. } _iconInit[] =
  675. {
  676. { MAKEINTRESOURCE( IDI_BUTTONS ),
  677. 32, 32,
  678. 0,
  679. m_pPageButtons,
  680. _T("Buttons"),
  681. false
  682. },
  683. { MAKEINTRESOURCE( IDI_HYPER_LINKS ),
  684. 32, 32,
  685. 0,
  686. m_pPageHyperLinks,
  687. _T("Hyperlinks"),
  688. false
  689. },
  690. { MAKEINTRESOURCE( IDI_LIST_VIEW_CTRL ),
  691. 32, 32,
  692. 0,
  693. #if ( ! defined __EXT_MFC_NO_LIST_VIEW_CTRL )
  694. m_pPageListCtrl,
  695. #else
  696. m_pPageNotAvailable,
  697. #endif // ( ! defined __EXT_MFC_NO_LIST_VIEW_CTRL )
  698. _T("List View"),
  699. false
  700. },
  701. { MAKEINTRESOURCE( IDI_TREE_VIEW_CTRL ),
  702. 32, 32,
  703. 0,
  704. #if ( ! defined __EXT_MFC_NO_TREE_VIEW_CTRL )
  705. m_pPageTreeCtrl,
  706. #else
  707. m_pPageNotAvailable,
  708. #endif // ( ! defined __EXT_MFC_NO_TREE_VIEW_CTRL )
  709. _T("Tree View"),
  710. false
  711. },
  712. { MAKEINTRESOURCE( IDI_TAB_WINDOW ),
  713. 32, 32,
  714. 0,
  715. #if (!defined __EXT_MFC_NO_TAB_CTRL)
  716. m_pPageTabWindows,
  717. #else
  718. m_pPageNotAvailable,
  719. #endif // (!defined __EXT_MFC_NO_TAB_CTRL)
  720. _T("Tab Window"),
  721. false
  722. },
  723. { MAKEINTRESOURCE( IDI_TAB_CONTAINER ),
  724. 32, 32,
  725. 0,
  726. #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL && !defined __EXT_MFC_NO_TAB_PAGECONTAINER_FLAT_CTRL )
  727. m_pPageTabContainers,
  728. #else
  729. m_pPageNotAvailable,
  730. #endif // #if (!defined __EXT_MFC_NO_TAB_PAGECONTAINER_CTRL && !defined __EXT_MFC_NO_TAB_PAGECONTAINER_FLAT_CTRL )
  731. _T("Tab Containers"),
  732. false
  733. },
  734. { MAKEINTRESOURCE( IDI_MASKED_EDIT ),
  735. 32, 32,
  736. 0,
  737. #if (!defined __EXT_MFC_NO_GRIDWND)
  738. m_pPageMaskedEdit,
  739. #else
  740. m_pPageNotAvailable,
  741. #endif // (!defined __EXT_MFC_NO_GRIDWND)
  742. _T("Masked Edit"),
  743. false
  744. },
  745. { MAKEINTRESOURCE( IDI_SYSTEM_NUMBER_CURRENCY_EDITORS ),
  746. 32, 32,
  747. 0,
  748. m_pPageSystemNumberCurrencyEdit,
  749. _T("System Number and Currency"),
  750. false
  751. },
  752. { MAKEINTRESOURCE( IDI_MENU ),
  753. 32, 32,
  754. 0,
  755. m_pPagePopupMenus,
  756. _T("Popup Menus"),
  757. false
  758. },
  759. { MAKEINTRESOURCE( IDI_STATUS_BAR ),
  760. 32, 32,
  761. 0,
  762. m_pPageStatusBar,
  763. _T("Status Bar"),
  764. false
  765. },
  766. { MAKEINTRESOURCE( IDI_MENU_TOOLBAR ),
  767. 32, 32,
  768. 0,
  769. m_pPageToolbars,
  770. _T("Menubar && Toolbars"),
  771. false
  772. },
  773. { MAKEINTRESOURCE( IDI_CALENDAR ),
  774. 32, 32,
  775. 0,
  776. #if (!defined __EXT_MFC_NO_DATE_PICKER)
  777. m_pPageCalendar,
  778. #else
  779. m_pPageNotAvailable,
  780. #endif // #if (!defined __EXT_MFC_NO_DATE_PICKER)
  781. _T("Calendar"),
  782. false
  783. },
  784. { MAKEINTRESOURCE( IDI_DATE_TIME_DURATION ),
  785. 32, 32,
  786. 0,
  787. #if (!defined __EXT_MFC_NO_DURATIONWND && !defined __EXT_MFC_NO_DATETIMEWND )
  788. m_pPageDateTimeDuration,
  789. #else
  790. m_pPageNotAvailable,
  791. #endif // (!defined __EXT_MFC_NO_DURATIONWND && !defined __EXT_MFC_NO_DATETIMEWND )
  792. _T("Date && Time"),
  793. false
  794. },
  795. { MAKEINTRESOURCE( IDI_DATE_BROWSER ),
  796. 32, 32,
  797. 0,
  798. #if (!defined __EXT_MFC_NO_DATE_BROWSER )
  799. m_pPageDateBrowser,
  800. #else
  801. m_pPageNotAvailable,
  802. #endif // (!defined __EXT_MFC_NO_DATE_BROWSER )
  803. _T("Date Browser"),
  804. false
  805. },
  806. { MAKEINTRESOURCE( IDI_GRID ),
  807. 32, 32,
  808. 0,
  809. #if (!defined __EXT_MFC_NO_GRIDWND )
  810. m_pPageGrid,
  811. #else
  812. m_pPageNotAvailable,
  813. #endif // (!defined __EXT_MFC_NO_GRIDWND )
  814. _T("Grid"),
  815. false
  816. },
  817. { MAKEINTRESOURCE( IDI_SHELL_LIST_VIEW_CTRL ),
  818. 32, 32,
  819. 0,
  820. #if ( ! defined __EXT_MFC_NO_SHELL_LIST_VIEW_CTRL )
  821. m_pPageShellListCtrl,
  822. #else
  823. m_pPageNotAvailable,
  824. #endif // ( ! defined __EXT_MFC_NO_SHELL_LIST_VIEW_CTRL )
  825. _T("Shell List View"),
  826. false
  827. },
  828. { MAKEINTRESOURCE( IDI_SHELL_TREE_VIEW_CTRL ),
  829. 32, 32,
  830. 0,
  831. #if ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )
  832. m_pPageShellTreeCtrl,
  833. #else
  834. m_pPageNotAvailable,
  835. #endif // ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )
  836. _T("Shell Tree View"),
  837. false
  838. },
  839. { MAKEINTRESOURCE( IDI_SHELL_BROWSER ),
  840. 32, 32,
  841. 0,
  842. #if ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL ) && ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )&& ( ! defined __EXT_MFC_NO_SHELL_COMBO_BOX )
  843. m_pPageShellBrowser,
  844. #else
  845. m_pPageNotAvailable,
  846. #endif // ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL ) && ( ! defined __EXT_MFC_NO_SHELL_TREE_VIEW_CTRL )&& ( ! defined __EXT_MFC_NO_SHELL_COMBO_BOX )
  847. _T("Shell Browser"),
  848. false
  849. },
  850. { MAKEINTRESOURCE( IDI_SHELL_DIALOG_FILE ),
  851. 32, 32,
  852. 0,
  853. #if ( ! defined __EXT_MFC_NO_SHELL_DIALOG_FILE )
  854. m_pPageShellDialogFile,
  855. #else
  856. m_pPageNotAvailable,
  857. #endif // ( ! defined __EXT_MFC_NO_SHELL_DIALOG_FILE )
  858. _T("File Dialog"),
  859. false
  860. },
  861. { MAKEINTRESOURCE( IDI_SHELL_DIALOG_BFF ),
  862. 32, 32,
  863. 0,
  864. #if ( ! defined __EXT_MFC_NO_SHELL_DIALOG_BFF )
  865. m_pPageShellDialogBrowseFor,
  866. #else
  867. m_pPageNotAvailable,
  868. #endif // ( ! defined __EXT_MFC_NO_SHELL_DIALOG_BFF )
  869. _T("Browse for Folder Dialog"),
  870. false
  871. },
  872. };
  873. int nInit;
  874. for( nInit = 0; nInit < (sizeof(_iconInit)/sizeof(_iconInit[0])) ; nInit++ )
  875. {
  876. _iconInit[nInit].m_pWndPage->ModifyStyle( 0, WS_TABSTOP );
  877. CExtCmdIcon icon;
  878. icon.AssignFromHICON(
  879. (HICON) ::LoadImage(
  880. hInstResource,
  881. _iconInit[nInit].m_strResource,
  882. IMAGE_ICON,
  883. _iconInit[nInit].m_nWidth,
  884. _iconInit[nInit].m_nHeight,
  885. _iconInit[nInit].m_nLoadImageFlags
  886. ),
  887. false
  888. );
  889. ASSERT( ! icon.IsEmpty() );
  890. if( _iconInit[nInit].m_bCreateInsideScrollContainer
  891. && _iconInit[nInit].m_pWndPage != m_pPageNotAvailable
  892. )
  893. {
  894. CExtScrollContainerWnd * pWndScrollContainer = new CExtScrollContainerWnd;
  895. pWndScrollContainer->m_bAutoDelete = true;
  896. pWndScrollContainer->m_bRedirectPreTranslateMessage = true;
  897. VERIFY( pWndScrollContainer->Create( this, rcPages ) );
  898. pWndScrollContainer->ModifyStyle( 0, WS_TABSTOP );
  899. _iconInit[nInit].m_pWndPage->SetParent( pWndScrollContainer );
  900. CRect rcAlign;
  901. _iconInit[nInit].m_pWndPage->GetWindowRect( &rcAlign );
  902. rcAlign.OffsetRect( -rcAlign.TopLeft() );
  903. _iconInit[nInit].m_pWndPage->MoveWindow( &rcAlign );
  904. _iconInit[nInit].m_pWndPage->ShowWindow( SW_SHOW );
  905. pWndScrollContainer->OnSwRecalcLayout( true );
  906. AddAnchor( pWndScrollContainer->GetSafeHwnd(), __RDA_LT, __RDA_RB );
  907. m_wndList.AddIcon( icon, _iconInit[nInit].m_strText, pWndScrollContainer->GetSafeHwnd() );
  908. }
  909. else
  910. {
  911. _iconInit[nInit].m_pWndPage->MoveWindow( &rcPages );
  912. AddAnchor( _iconInit[nInit].m_pWndPage->GetSafeHwnd(), __RDA_LT, __RDA_RB );
  913. m_wndList.AddIcon( icon, _iconInit[nInit].m_strText, _iconInit[nInit].m_pWndPage->GetSafeHwnd() );
  914. }
  915. } // for( nInit = 0; nInit < (sizeof(_iconInit)/sizeof(_iconInit[0])) ; nInit++ )
  916. for( nInit = 0; nInit < (sizeof(_iconInit)/sizeof(_iconInit[0])) ; nInit++ )
  917. _iconInit[nInit].m_pWndPage->PageBase_PostInit();
  918. _iconInit[0].m_pWndPage->ShowWindow( SW_SHOW );
  919. m_wndList.SetCurSel( 0 );
  920. // Get a pointer to the IMalloc interface
  921. HRESULT hr = ::SHGetMalloc( &m_pMalloc );
  922. if( FAILED(hr) )
  923. return FALSE;
  924. m_bDialogInitComplete = true;
  925. _splash.AddTextLine( _T("Initialization complete.") );
  926. ::Sleep( 500 );
  927. _splash.DestroyWindow();
  928. //////////////////////////////////////////////////////////////////////////
  929. EnableSaveRestore( _T("Dialog Positions"), _T("MainDlg") );
  930. CWnd::RepositionBars( 0, 0xFFFF, 0 );
  931. //  SetRedraw( FALSE );
  932. //  CExtPopupMenuWnd::PassMsgLoop( true );
  933. //  ::SetActiveWindow( NULL );
  934. //  SetRedraw( TRUE );
  935. //  SetActiveWindow();
  936. //  SetFocus();
  937. //  RedrawWindow( NULL, NULL, RDW_INVALIDATE|RDW_ERASE|RDW_ALLCHILDREN|RDW_FRAME );
  938. return TRUE;
  939. }
  940. //////////////////////////////////////////////////////////////////////////
  941. // If you add a minimize button to your dialog, you will need the code below
  942. //  to draw the icon.  For MFC applications using the document/view model,
  943. //  this is automatically done for you by the framework.
  944. void CMainDlg::OnPaint() 
  945. {
  946. if (IsIconic())
  947. {
  948. CPaintDC dc(this); // device context for painting
  949. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  950. // Center icon in client rectangle
  951. int cxIcon = GetSystemMetrics(SM_CXICON);
  952. int cyIcon = GetSystemMetrics(SM_CYICON);
  953. CRect rect;
  954. GetClientRect(&rect);
  955. int x = (rect.Width() - cxIcon + 1) / 2;
  956. int y = (rect.Height() - cyIcon + 1) / 2;
  957. // Draw the icon
  958. dc.DrawIcon(x, y, m_hIcon);
  959. }
  960. else
  961. {
  962. CExtNCW < CExtResizableDialog > :: OnPaint();
  963. }
  964. }
  965. // The system calls this to obtain the cursor to display while the user drags
  966. //  the minimized window.
  967. HCURSOR CMainDlg::OnQueryDragIcon()
  968. {
  969. return (HCURSOR) m_hIcon;
  970. }
  971. //////////////////////////////////////////////////////////////////////////
  972. void CMainDlg::OnAppAbout() 
  973. {
  974. #ifndef __EXT_MFC_NO_PROF_UIS_ABOUT_DIALOG
  975. VERIFY( ProfUISAbout() );
  976. #endif // #ifndef __EXT_MFC_NO_PROF_UIS_ABOUT_DIALOG
  977. }
  978. //////////////////////////////////////////////////////////////////////////
  979. void CMainDlg::OnSize(UINT nType, int cx, int cy) 
  980. {
  981. CExtNCW < CExtResizableDialog > :: OnSize( nType, cx, cy );
  982. if( nType != SIZE_MINIMIZED )
  983. CWnd::RepositionBars(0,0xFFFF,0);
  984. }
  985. //////////////////////////////////////////////////////////////////////////
  986. void CMainDlg::OnSelchangeList() 
  987. {
  988. int nIndex = m_wndList.GetCurSel();
  989. CListBoxMenuLike::ITEM_DATA * pItemData = m_wndList.m_arrItems[nIndex];
  990. for( int i = 0; i < m_wndList.m_arrItems.GetSize(); i++ )
  991. {
  992. if( nIndex != i )
  993. ::ShowWindow( m_wndList.m_arrItems[i]->m_hWndPage, SW_HIDE );
  994. }
  995. CWnd * pWndPageAlignment = GetDlgItem( IDC_STATIC_PAGES_RECT );
  996. ASSERT( pWndPageAlignment->GetSafeHwnd() != NULL );
  997. CRect rcPages;
  998. pWndPageAlignment->GetWindowRect( &rcPages );
  999. ScreenToClient( &rcPages );
  1000. ::MoveWindow( pItemData->m_hWndPage, rcPages.left, rcPages.top, rcPages.Width(), rcPages.Height(), TRUE );
  1001. ::ShowWindow( pItemData->m_hWndPage, SW_SHOW );
  1002. }
  1003. //////////////////////////////////////////////////////////////////////////
  1004. void CMainDlg::OnBack() 
  1005. {
  1006. int nIndex = m_wndList.GetCurSel();
  1007. nIndex > 0
  1008. ? nIndex--
  1009. : nIndex = m_wndList.GetCount()-1;
  1010. m_wndList.SetCurSel( nIndex );
  1011. OnSelchangeList();
  1012. }
  1013. //////////////////////////////////////////////////////////////////////////
  1014. void CMainDlg::OnNext() 
  1015. {
  1016. int nIndex = m_wndList.GetCurSel();
  1017. nIndex < m_wndList.GetCount()-1
  1018. ? nIndex++
  1019. : nIndex = 0;
  1020. m_wndList.SetCurSel( nIndex );
  1021. OnSelchangeList();
  1022. //////////////////////////////////////////////////////////////////////////
  1023. LRESULT CMainDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  1024. {
  1025. LRESULT lResult = CExtNCW < CExtResizableDialog > :: WindowProc( message, wParam, lParam );
  1026. if( message == WM_SETMESSAGESTRING )
  1027. {
  1028. if( m_pPageStatusBar )
  1029. {
  1030. m_pPageStatusBar->SendMessage( message,wParam,lParam );
  1031. }
  1032. return 0L;
  1033. }
  1034. return lResult;
  1035. }
  1036. //////////////////////////////////////////////////////////////////////////
  1037. #ifdef UNICODE
  1038. STDMETHODIMP CMainDlg::StrRetToStr( STRRET StrRet, LPTSTR * str, LPITEMIDLIST pidl )
  1039. {
  1040. ASSERT( m_pMalloc != NULL );
  1041. HRESULT hr = S_OK;
  1042. int cch;
  1043. LPSTR strOffset;
  1044. (*str) = NULL;
  1045. switch( StrRet.uType )
  1046. {
  1047. case STRRET_WSTR: 
  1048. cch = (int) ::wcslen( StrRet.pOleStr ) + 1;
  1049. (*str) = (LPTSTR)m_pMalloc->Alloc( cch * sizeof(TCHAR) );
  1050. if( (*str) != NULL )
  1051. ::lstrcpyn( *str, StrRet.pOleStr, cch );
  1052. else
  1053. hr = E_FAIL;
  1054. break;
  1055. case STRRET_OFFSET: 
  1056. strOffset = ( ( (char *) pidl ) + StrRet.uOffset );
  1057. cch = ::MultiByteToWideChar( CP_OEMCP, 0, strOffset, -1, NULL, 0 );
  1058. (*str) = (LPTSTR)m_pMalloc->Alloc(cch * sizeof(TCHAR));
  1059. if( (*str) != NULL )
  1060. ::MultiByteToWideChar( CP_OEMCP, 0, strOffset, -1, *str, cch );
  1061. else
  1062. hr = E_FAIL;
  1063. break;
  1064. case STRRET_CSTR: 
  1065. cch = ::MultiByteToWideChar( CP_OEMCP, 0, StrRet.cStr, -1, NULL, 0 );
  1066. (*str) = (LPTSTR)m_pMalloc->Alloc(cch * sizeof(TCHAR)); 
  1067. if( (*str) != NULL )
  1068. ::MultiByteToWideChar( CP_OEMCP, 0, StrRet.cStr, -1, *str, cch );
  1069. else
  1070. hr = E_FAIL;
  1071. break;
  1072. return hr;
  1073. }
  1074. #else
  1075. STDMETHODIMP CMainDlg::StrRetToStr( STRRET StrRet, LPTSTR * str, LPITEMIDLIST pidl )
  1076. {
  1077. ASSERT( m_pMalloc != NULL );
  1078. HRESULT hr = S_OK;
  1079. int cch;
  1080. LPSTR strOffset;
  1081. (*str) = NULL;
  1082. switch( StrRet.uType )
  1083. {
  1084. case STRRET_WSTR: 
  1085. cch = ::WideCharToMultiByte( CP_ACP, 0, StrRet.pOleStr, -1, NULL, 0, NULL, NULL );
  1086. (*str) = (LPTSTR) m_pMalloc->Alloc( cch * sizeof(TCHAR) ); 
  1087. if( (*str) != NULL )
  1088. ::WideCharToMultiByte( CP_ACP, 0, StrRet.pOleStr, -1, *str, cch, NULL, NULL );
  1089. else
  1090. hr = E_FAIL;
  1091. break;
  1092. case STRRET_OFFSET: 
  1093. strOffset = ( ( (char *) pidl ) + StrRet.uOffset );
  1094. cch = (int) ::strlen( strOffset ) + 1;
  1095. *str = (LPTSTR)m_pMalloc->Alloc( cch * sizeof(TCHAR) );
  1096. if( (*str) != NULL )
  1097. __EXT_MFC_STRCPY( *str, cch, strOffset );
  1098. else
  1099. hr = E_FAIL;
  1100. break;
  1101. case STRRET_CSTR: 
  1102. cch = (int) ::strlen( StrRet.cStr ) + 1;
  1103. *str = (LPTSTR)m_pMalloc->Alloc( cch * sizeof(TCHAR) );
  1104. if (*str != NULL)
  1105. __EXT_MFC_STRCPY( *str, cch, StrRet.cStr );
  1106. else
  1107. hr = E_FAIL;
  1108. break;
  1109. return hr;
  1110. }
  1111. #endif
  1112. STDMETHODIMP CMainDlg::ResolveChannel( IShellFolder * pFolder, LPCITEMIDLIST pidl, LPTSTR * lpszURL )
  1113. {
  1114. (*lpszURL) = NULL;
  1115. IShellLink * pShellLink = NULL;
  1116. HRESULT hr = pFolder->GetUIObjectOf( NULL, 1, &pidl, IID_IShellLink, NULL, (LPVOID*)&pShellLink );
  1117. if( SUCCEEDED( hr ) )
  1118. {
  1119. LPITEMIDLIST pidlChannel = NULL;
  1120. hr = pShellLink->GetIDList( &pidlChannel );
  1121. if( SUCCEEDED( hr ) )
  1122. {
  1123. IShellFolder * psfDesktop = NULL;
  1124. hr = ::SHGetDesktopFolder( &psfDesktop );
  1125. if( SUCCEEDED( hr ) )
  1126. {
  1127. STRRET strret;
  1128. hr = psfDesktop->GetDisplayNameOf( pidlChannel, 0, &strret );
  1129. if( SUCCEEDED( hr ) )
  1130. StrRetToStr( strret, lpszURL, pidlChannel );
  1131. psfDesktop->Release();
  1132. }
  1133. }
  1134. pShellLink->Release();
  1135. }
  1136. return hr;
  1137. }
  1138. STDMETHODIMP CMainDlg::ResolveInternetShortcut( LPCTSTR lpszLinkFile, LPTSTR * lpszURL )
  1139. {
  1140.     (*lpszURL) = NULL;
  1141. IUniformResourceLocator * pUrlLink = NULL;
  1142. HRESULT hr = ::CoCreateInstance( CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER, IID_IUniformResourceLocator, (LPVOID*)&pUrlLink );
  1143.     if( SUCCEEDED( hr ) )
  1144.     {
  1145.         IPersistFile * pPersistFile = NULL;
  1146.         hr = pUrlLink->QueryInterface( IID_IPersistFile, (LPVOID*)&pPersistFile );
  1147.         if( SUCCEEDED( hr ) )
  1148.         {
  1149.             OLECHAR szOleCharLinkFile[ MAX_PATH ];
  1150. #ifndef _UNICODE
  1151.             ::MultiByteToWideChar( CP_ACP, 0, lpszLinkFile, -1, szOleCharLinkFile, sizeof(szOleCharLinkFile) );
  1152. #else
  1153. __EXT_MFC_STRCPY( szOleCharLinkFile, MAX_PATH, lpszLinkFile );
  1154. #endif
  1155.             hr = pPersistFile->Load( szOleCharLinkFile, STGM_READ );
  1156.             if( SUCCEEDED( hr ) )
  1157.                 hr = pUrlLink->GetURL( lpszURL );
  1158.             pPersistFile->Release();
  1159.         }
  1160.         pUrlLink->Release();
  1161.     }
  1162.     return hr;
  1163. STDMETHODIMP CMainDlg::ResolveLink( LPCTSTR lpszLinkFile, LPTSTR * lpszURL )
  1164. {
  1165.     (*lpszURL) = NULL;
  1166. IShellLink * pShellLink = NULL;
  1167. HRESULT hr = ::CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&pShellLink ); 
  1168.     if( SUCCEEDED( hr ) )
  1169.     {
  1170.         IPersistFile * pPersistFile = NULL;
  1171.         hr = pShellLink->QueryInterface( IID_IPersistFile, (LPVOID*)&pPersistFile );
  1172.         if( SUCCEEDED( hr ) )
  1173.         {
  1174.             OLECHAR szOleCharLinkFile[ MAX_PATH ];
  1175. #ifndef _UNICODE
  1176.             ::MultiByteToWideChar( CP_ACP, 0, lpszLinkFile, -1, szOleCharLinkFile, sizeof(szOleCharLinkFile) );
  1177. #else
  1178. __EXT_MFC_STRCPY( szOleCharLinkFile, MAX_PATH, lpszLinkFile );
  1179. #endif
  1180.             hr = pPersistFile->Load( szOleCharLinkFile, STGM_READ );
  1181.             if( SUCCEEDED( hr ) )
  1182.             {
  1183.                 WIN32_FIND_DATA wfd;      
  1184.                 hr = pShellLink->Resolve( m_hWnd, SLR_NO_UI ); 
  1185.                 if( NOERROR == hr )
  1186.                 {
  1187.                     *lpszURL = (LPTSTR)m_pMalloc->Alloc( MAX_PATH );
  1188.                     hr = pShellLink->GetPath( *lpszURL, MAX_PATH - 1,  (WIN32_FIND_DATA*)&wfd, SLGP_UNCPRIORITY );
  1189.                 }
  1190.             }
  1191.             pPersistFile->Release();
  1192.         }
  1193.         pShellLink->Release();
  1194.     }
  1195.     return hr;
  1196. }
  1197. void CMainDlg::_PrepareFavoritesList( IShellFolder * pFolder, UINT * pnMenuID, CExtPopupMenuWnd * pPopup, INT * pnPos )
  1198. {
  1199. if( pFolder == NULL 
  1200. || pnMenuID == NULL 
  1201. || pPopup == NULL 
  1202. || pnPos == NULL 
  1203. )
  1204. return;
  1205. IEnumIDList * pItems = NULL;
  1206. LPITEMIDLIST pidlNext = NULL;
  1207. STRRET strRetName;
  1208. STRRET strRetFile;
  1209. LPTSTR lpszName = NULL;
  1210. LPTSTR lpszFileName = NULL;
  1211. LPTSTR lpszURL = NULL;
  1212. HRESULT hr = pFolder->EnumObjects( GetSafeHwnd(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &pItems );
  1213. while( NOERROR == hr )
  1214. {
  1215. hr = pItems->Next( 1, &pidlNext, NULL );
  1216. if( NOERROR == hr )
  1217. {
  1218. bool bFolder = false;
  1219. ULONG rgfInOut = 0; 
  1220. pFolder->GetAttributesOf( 1, const_cast < LPCITEMIDLIST * > ( &pidlNext ), &rgfInOut );
  1221. if( ( rgfInOut & SFGAO_FOLDER ) != 0 )
  1222. bFolder = ( ( rgfInOut & SFGAO_FOLDER ) != 0 ) ? true : false;
  1223. pFolder->GetDisplayNameOf( pidlNext, SHGDN_NORMAL, &strRetName );
  1224. pFolder->GetDisplayNameOf( pidlNext, SHGDN_FORPARSING, &strRetFile );
  1225. StrRetToStr( strRetName, &lpszName, pidlNext );
  1226. StrRetToStr( strRetFile, &lpszFileName, pidlNext );
  1227. CExtSafeString sName( lpszName );
  1228. if( sName.GetLength() > 40 )
  1229. {
  1230. sName = sName.Left( 40 );
  1231. sName += __EXT_MFC_SAFE_LPCTSTR( _T("...") );
  1232. }
  1233. HICON hIcon = NULL;
  1234. HICON hIconLarge = NULL;
  1235. IExtractIcon * pExtractIcon = NULL;
  1236. if( pFolder->GetUIObjectOf( NULL, 1, const_cast<LPCITEMIDLIST *>(&pidlNext), IID_IExtractIcon, NULL, (void**)&pExtractIcon ) == S_OK ) 
  1237. {
  1238. TCHAR szBuf[MAX_PATH] = _T("");
  1239. INT index = 0;
  1240. UINT flags = 0;
  1241. HRESULT hr = pExtractIcon->GetIconLocation( GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags );
  1242. if( hr == S_OK )
  1243. {
  1244. if( pExtractIcon->Extract( szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32 ) != S_OK ) 
  1245. {
  1246. hIcon = NULL;
  1247. hIconLarge = NULL;
  1248. }
  1249. }
  1250. pExtractIcon->Release();
  1251. }
  1252. SHFILEINFO fileInfo = {0};
  1253. ::SHGetFileInfo( lpszFileName, NULL, &fileInfo, sizeof(fileInfo), SHGFI_TYPENAME );
  1254. if( bFolder && _tcscmp( fileInfo.szTypeName, _T("Channel Shortcut") ) != 0 )
  1255. {
  1256. CExtPopupMenuWnd * pNewPopup = new CExtPopupMenuWnd();
  1257. ASSERT( pNewPopup != NULL );
  1258. VERIFY( pNewPopup->CreatePopupMenu( GetSafeHwnd() ) );
  1259. pPopup->ItemInsertSpecPopup( pNewPopup, (*pnPos)++, sName, hIcon );
  1260. IShellFolder * pSubFolder = NULL;
  1261. HRESULT hrSub = pFolder->BindToObject( pidlNext, NULL, IID_IShellFolder, (LPVOID*)&pSubFolder );
  1262. if( SUCCEEDED( hrSub ) )
  1263. {
  1264. pFolder->GetDisplayNameOf( pidlNext, SHGDN_FORPARSING, &strRetName );
  1265. LPTSTR lpszFolderName = NULL;
  1266. StrRetToStr( strRetName, &lpszFolderName, pidlNext );
  1267. pNewPopup->ItemInsertCommand( ID_FAVORITES_SHORTCUT_LIST, -1, lpszFolderName );
  1268. if( lpszFolderName  != NULL )
  1269. m_pMalloc->Free( lpszFolderName );
  1270. pSubFolder->Release();
  1271. }
  1272. }
  1273. else
  1274. {
  1275. UINT nMenuID = (*pnMenuID)++;
  1276. pPopup->ItemInsertCommand( nMenuID, -1, sName, NULL, hIcon, false, 0, GetSafeHwnd() );
  1277. CString sChannelShortcut, sInternetShortcut;
  1278. CExtRegistry reg;
  1279. if( reg.Open( HKEY_CLASSES_ROOT, _T("ChannelShortcut"), KEY_READ ) )
  1280. reg.LoadString( _T(""), sChannelShortcut.GetBuffer( 100 ), 100 );
  1281. if( reg.Open( HKEY_CLASSES_ROOT, _T("InternetShortcut"), KEY_READ ) )
  1282. reg.LoadString( _T(""), sInternetShortcut.GetBuffer(100), 100 );
  1283. if( 0 == sChannelShortcut.CompareNoCase( fileInfo.szTypeName ) ) // HKEY_CLASSES_ROOTChannelShortcut {f3aa0dc0-9cc8-11d0-a599-00c04fd64434}
  1284. ResolveChannel( pFolder, pidlNext, &lpszURL );
  1285. else if( 0 == sInternetShortcut.CompareNoCase( fileInfo.szTypeName ) ) // HKEY_CLASSES_ROOTInternetShortcut {FBF23B40-E3F0-101B-8488-00AA003E56F8}
  1286. ResolveInternetShortcut(lpszFileName, &lpszURL);
  1287. else
  1288. ResolveLink( lpszFileName, &lpszURL );
  1289. LPTSTR lpszURL_Final = lpszURL != NULL ? lpszURL : lpszFileName;
  1290. if( lpszURL_Final != NULL )
  1291. {
  1292. CString sURL;
  1293. if( m_mapURLs.Lookup( nMenuID, sURL ) )
  1294. ASSERT( 0 == sURL.CompareNoCase(lpszURL_Final) );
  1295. else
  1296. m_mapURLs.SetAt( nMenuID, lpszURL_Final );
  1297. if( lpszURL != NULL )
  1298. m_pMalloc->Free( lpszURL );
  1299. }
  1300. }
  1301. if( hIcon != NULL )
  1302. {
  1303. ::DestroyIcon( hIcon );
  1304. hIcon = NULL;
  1305. }
  1306. if( hIconLarge != NULL )
  1307. {
  1308. ::DestroyIcon( hIconLarge );
  1309. hIconLarge = NULL;
  1310. }
  1311. if( lpszName != NULL )
  1312. m_pMalloc->Free( lpszName );
  1313. if( lpszFileName  != NULL )
  1314. m_pMalloc->Free( lpszFileName );
  1315. if( pidlNext != NULL )
  1316. m_pMalloc->Free( pidlNext );
  1317. }
  1318. }
  1319. if( pItems != NULL )
  1320. pItems->Release();
  1321. }
  1322. STDMETHODIMP CMainDlg::IDLFromPath( CExtSafeString strPath, LPITEMIDLIST * ppidl )
  1323. {
  1324. LPMALLOC pMalloc = NULL;
  1325. IShellFolder * psfDeskTop  = NULL;
  1326.     if( FAILED( ::SHGetMalloc( &pMalloc ) ) )
  1327.         return S_FALSE;
  1328.     if( FAILED( ::SHGetDesktopFolder( &psfDeskTop ) ) )
  1329.     {
  1330.         if( pMalloc != NULL )
  1331.             pMalloc->Release();
  1332.         return S_FALSE;
  1333.     }
  1334. OLECHAR szOleCharPath[ MAX_PATH ];
  1335. #ifndef _UNICODE
  1336.     ::MultiByteToWideChar( CP_ACP, 0, strPath, -1, szOleCharPath, sizeof(szOleCharPath) );
  1337. #else
  1338. __EXT_MFC_STRCPY( szOleCharPath, MAX_PATH, strPath );
  1339. #endif
  1340. HRESULT hRes = psfDeskTop->ParseDisplayName( NULL, NULL, szOleCharPath, NULL, ppidl, NULL );
  1341.     if( pMalloc != NULL )
  1342.         pMalloc->Release();
  1343.     if( psfDeskTop != NULL ) 
  1344.         psfDeskTop->Release();
  1345.     return hRes;
  1346. }
  1347. LRESULT CMainDlg::OnExtMenuPrepareLevel(WPARAM wParam, LPARAM lParam)
  1348. {
  1349. lParam;
  1350. CExtPopupMenuWnd::MsgPrepareMenuData_t * pData =
  1351. reinterpret_cast
  1352. < CExtPopupMenuWnd::MsgPrepareMenuData_t * >
  1353. ( wParam );
  1354. ASSERT( pData != NULL );
  1355. CExtPopupMenuWnd * pPopup = pData->m_pPopup;
  1356. ASSERT( pPopup != NULL );
  1357. CExtPopupMenuWnd * pPopupParent = pPopup->GetParentMenuWnd();
  1358. INT nItemPos = pPopup->ItemFindPosForCmdID( ID_FAVORITES_SHORTCUT_LIST );
  1359. if( nItemPos >= 0 )
  1360. {
  1361. CExtPopupMenuWnd::MENUITEMDATA & mi = pPopup->ItemGetInfo( nItemPos );
  1362. LPITEMIDLIST pidlRootFolder = NULL;
  1363. HRESULT hRes = S_OK;
  1364. if( pPopupParent == NULL )
  1365. hRes = ::SHGetSpecialFolderLocation( NULL, CSIDL_FAVORITES, &pidlRootFolder );
  1366. else
  1367. hRes = IDLFromPath( mi.GetText(), &pidlRootFolder );
  1368. pPopup->ItemRemove( nItemPos );
  1369. if( pPopupParent == NULL )
  1370. m_mapURLs.RemoveAll();
  1371. if( SUCCEEDED( hRes ) )
  1372. {
  1373. IShellFolder * psfDesktop = NULL;
  1374. IShellFolder * psfRootFolder = NULL;
  1375. hRes = ::SHGetDesktopFolder( &psfDesktop );
  1376. if( SUCCEEDED( hRes ) )
  1377. {
  1378. hRes = psfDesktop->BindToObject( pidlRootFolder, NULL, IID_IShellFolder, (LPVOID*)&psfRootFolder );
  1379. psfDesktop->Release();
  1380. if( SUCCEEDED( hRes ) )
  1381. {
  1382. UINT uMenuID = UINT( ID_FAVORITES_FIRSTURL + m_mapURLs.GetCount() );
  1383. _PrepareFavoritesList( psfRootFolder, &uMenuID, pPopup, &nItemPos );
  1384. if( pPopup->ItemGetCount() == 0 )
  1385. {
  1386. pPopup->ItemInsertCommand( ID_FAVORITES_LASTURL + 1, 0, _T("(Empty)") );
  1387. CExtPopupMenuWnd::MENUITEMDATA & mi = pPopup->ItemGetInfo( 0 );
  1388. mi.Enable( false );
  1389. }
  1390. }
  1391. }
  1392. ASSERT( m_pMalloc );
  1393. m_pMalloc->Free( pidlRootFolder );
  1394. psfRootFolder->Release();
  1395. }
  1396. }
  1397. return 1;
  1398. }
  1399. void CMainDlg::OnFavoritesAdd() 
  1400. {
  1401. HMODULE hModule = (HMODULE)::LoadLibrary(_T("shdocvw.dll"));
  1402.     if( hModule )
  1403.     {
  1404. LPFNADDFAV lpfnDoAddToFavDlg = (LPFNADDFAV)GetProcAddress( hModule, "DoAddToFavDlg" );
  1405. if( lpfnDoAddToFavDlg )
  1406. {
  1407. TCHAR szPath[MAX_PATH] = _T("");
  1408. LPITEMIDLIST pidlFavorites = NULL;
  1409. LPMALLOC pMalloc = NULL;
  1410. ::SHGetMalloc( &pMalloc );
  1411. if( ::SHGetSpecialFolderPath( NULL, szPath, CSIDL_FAVORITES, TRUE ) 
  1412. && SUCCEEDED( ::SHGetSpecialFolderLocation( NULL, CSIDL_FAVORITES, &pidlFavorites ) )
  1413. )
  1414. {
  1415. CString sTitle = _T("Professional GUI tools and solutions for MFC & .NET desktop applications");
  1416. CString sURL = _T("http://www.prof-uis.com/");
  1417. BOOL bOK = 
  1418. lpfnDoAddToFavDlg(
  1419. GetSafeHwnd(), 
  1420. sURL.GetBuffer( sURL.GetLength() ),
  1421. sURL.GetLength(),
  1422. sTitle.GetBuffer( sTitle.GetLength() ),
  1423. sTitle.GetLength(),
  1424. pidlFavorites
  1425. );
  1426. if( bOK )
  1427. {
  1428. // shortcut is added
  1429. }
  1430. }
  1431. if( pidlFavorites )
  1432. pMalloc->Free( pidlFavorites );
  1433. pMalloc->Release();
  1434. }
  1435. ::FreeLibrary( hModule );
  1436.     }
  1437. }
  1438. void CMainDlg::OnFavoritesOrganize() 
  1439. {
  1440. HMODULE hModule = ::LoadLibrary(_T("shdocvw.dll"));
  1441.     if( hModule )
  1442.     {
  1443. LPFNORGFAV lpfnOrgFav = (LPFNORGFAV)::GetProcAddress( hModule, "DoOrganizeFavDlg" );
  1444. if( lpfnOrgFav )
  1445. {
  1446. TCHAR wszPathName[_MAX_PATH] = _T("");
  1447. HRESULT hResult = ::SHGetSpecialFolderPath( GetSafeHwnd(), wszPathName, CSIDL_FAVORITES, TRUE );
  1448. if( SUCCEEDED( hResult ) )
  1449. {
  1450. if( lpfnOrgFav != NULL)
  1451. lpfnOrgFav( GetSafeHwnd(), wszPathName );
  1452. }
  1453. }
  1454. ::FreeLibrary( hModule );
  1455. }
  1456. }
  1457. void CMainDlg::OnFavoritesURL( UINT nID )
  1458. {
  1459. if( m_mapURLs.GetCount() > 0 )
  1460. {
  1461. COleVariant vtEmpty;
  1462. CString sURL;
  1463. if( m_mapURLs.Lookup( nID, sURL ) )
  1464. {
  1465. // AfxMessageBox( sURL );
  1466. // m_wndBrowser.NavigateURL( sURL );
  1467. }
  1468. else
  1469. ASSERT( FALSE );
  1470. }
  1471. }