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

对话框与窗口

开发平台:

Visual C++

  1. // XTPTaskDialog.cpp: implementation of the CXTPTaskDialog class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. #include "Common/XTPSystemHelpers.h"
  23. #include "Common/XTPVc80Helpers.h"
  24. #include "Common/XTPVc50Helpers.h"
  25. #include "Common/XTPPropExchange.h"
  26. #include "Common/XTPResourceManager.h"
  27. #include "XTPTaskDialogAPI.h"
  28. #include "XTPTaskDialog.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. //===========================================================================
  35. // CXTPTaskDialog
  36. //===========================================================================
  37. CXTPTaskDialog::CXTPTaskDialog(CWnd* pWndParent)
  38. : CXTPTaskDialogFrame(&m_config)
  39. {
  40. m_pParentWnd = pWndParent;
  41. m_hwndTaskDialog = NULL;
  42. ::ZeroMemory(&m_config, sizeof(TASKDIALOGCONFIG));
  43. m_config.cbSize = sizeof(TASKDIALOGCONFIG);
  44. m_config.hInstance = AfxGetInstanceHandle();
  45. m_config.hwndParent = pWndParent->GetSafeHwnd();
  46. m_config.pfCallback = (PFTASKDIALOGCALLBACK)&TaskDialogCallbackProc;
  47. m_config.lpCallbackData = (LONG_PTR)this;
  48. m_nSelButtonID      = 0;
  49. SetWindowTitle(AfxGetApp()->m_pszAppName);
  50. ModifyTaskStyle(0, TDF_POSITION_RELATIVE_TO_WINDOW);
  51. }
  52. CXTPTaskDialog::~CXTPTaskDialog()
  53. {
  54. ResetContent();
  55. }
  56. #ifndef UNALIGNED
  57. #define UNALIGNED
  58. #endif
  59. static void XTPTaskDialogSetConfigText(UNALIGNED PCWSTR& lpszConfig, LPCTSTR strText)
  60. {
  61. if (lpszConfig)
  62. {
  63. if (!IS_INTRESOURCE(lpszConfig))
  64. delete [] (LPWSTR)lpszConfig;
  65. lpszConfig = NULL;
  66. }
  67. if (!strText)
  68. return;
  69. if (IS_INTRESOURCE(strText))
  70. {
  71. lpszConfig = (LPWSTR)strText;
  72. return;
  73. }
  74. int nLength = (int)_tcslen(strText);
  75. if (nLength == 0)
  76. return;
  77. lpszConfig = (PCWSTR) new WCHAR[nLength + 1];
  78. #ifdef _UNICODE
  79. STRCPY_S((LPWSTR)lpszConfig, nLength + 1, strText);
  80. #else
  81. MultiByteToWideChar(CP_ACP, 0, strText, -1, (LPWSTR)lpszConfig, nLength + 1);
  82. #endif
  83. }
  84. /////////////////////////////////////////////////////////////////////////////
  85. // CXTPTaskDialog message handlers
  86. HRESULT CALLBACK CXTPTaskDialog::TaskDialogCallbackProc(HWND hwnd, UINT uNotification, WPARAM wParam, LPARAM lParam, DWORD_PTR dwRefData)
  87. {   ASSERT(0 != dwRefData);
  88. CXTPTaskDialog* pThis = (CXTPTaskDialog*)dwRefData;
  89. if (!pThis)
  90. return E_FAIL;
  91. if (uNotification == TDN_DIALOG_CONSTRUCTED)
  92. {
  93. ASSERT(0 != hwnd);
  94. pThis->OnAttach(hwnd);
  95. }
  96. if (uNotification == TDN_DESTROYED)
  97. {
  98. pThis->OnDialogDestroyed();
  99. pThis->OnDetach();
  100. return S_OK;
  101. }
  102. return pThis->OnDialogNotify(uNotification, wParam, lParam);
  103. }
  104. HRESULT CXTPTaskDialog::OnDialogNotify(UINT uNotification, WPARAM wParam, LPARAM lParam)
  105. {
  106. UNREFERENCED_PARAMETER(lParam);
  107. HRESULT hResult = S_OK;
  108. switch (uNotification)
  109. {
  110. case TDN_DIALOG_CONSTRUCTED:
  111. {
  112. OnDialogConstructed();
  113. break;
  114. }
  115. case TDN_NAVIGATED:
  116. {
  117. OnNavigated();
  118. break;
  119. }
  120. case TDN_BUTTON_CLICKED:
  121. {
  122. BOOL bCloseDialog = TRUE;
  123. OnButtonClicked((int)wParam, bCloseDialog);
  124. hResult = (HRESULT)(int)(!bCloseDialog);
  125. break;
  126. }
  127. case TDN_HYPERLINK_CLICKED:
  128. {
  129. OnHyperlinkClicked(XTP_CW2CT((PCWSTR)lParam));
  130. break;
  131. }
  132. case TDN_TIMER:
  133. {
  134. ASSERT(UINT_MAX >= wParam);
  135. BOOL bReset = FALSE;
  136. OnTimer((DWORD)wParam, bReset);
  137. hResult = (HRESULT)(int)bReset;
  138. break;
  139. }
  140. case TDN_RADIO_BUTTON_CLICKED:
  141. {
  142. OnRadioButtonClicked((int)wParam);
  143. break;
  144. }
  145. case TDN_CREATED:
  146. {
  147. break;
  148. }
  149. case TDN_VERIFICATION_CLICKED:
  150. {
  151. OnVerificationClicked(wParam != 0);
  152. break;
  153. }
  154. case TDN_HELP:
  155. {
  156. OnHelp();
  157. break;
  158. }
  159. case TDN_EXPANDO_BUTTON_CLICKED:
  160. {
  161. OnExpandoButtonClicked(wParam != 0);
  162. break;
  163. }
  164. default:
  165. {
  166. TRACE0("CXTPTaskDialog::TaskDialogCallbackProc -- Unhandled notification encountered.n");
  167. return E_NOTIMPL;
  168. }
  169. }
  170. return hResult;
  171. }
  172. BOOL CXTPTaskDialog::OnAttach(HWND hWndNew)
  173. {
  174. ASSERT(m_hwndTaskDialog == NULL || m_hwndTaskDialog == hWndNew);
  175. if (hWndNew == NULL)
  176. return FALSE;
  177. m_hwndTaskDialog = hWndNew;
  178. return TRUE;
  179. }
  180. HWND CXTPTaskDialog::OnDetach()
  181. {
  182. HWND hWnd = m_hwndTaskDialog;
  183. if (hWnd != NULL)
  184. {
  185. m_hwndTaskDialog = NULL;
  186. }
  187. return hWnd;
  188. }
  189. void CXTPTaskDialog::ResetContent()
  190. {
  191. XTPTaskDialogSetConfigText(m_config.pszWindowTitle, NULL);
  192. XTPTaskDialogSetConfigText(m_config.pszMainInstruction, NULL);
  193. XTPTaskDialogSetConfigText(m_config.pszContent, NULL);
  194. XTPTaskDialogSetConfigText(m_config.pszVerificationText, NULL);
  195. XTPTaskDialogSetConfigText(m_config.pszExpandedInformation, NULL);
  196. XTPTaskDialogSetConfigText(m_config.pszExpandedControlText, NULL);
  197. XTPTaskDialogSetConfigText(m_config.pszCollapsedControlText, NULL);
  198. XTPTaskDialogSetConfigText(m_config.pszFooter, NULL);
  199. m_config.dwFlags = TDF_POSITION_RELATIVE_TO_WINDOW;
  200. m_config.hMainIcon = 0;
  201. m_config.hFooterIcon = 0;
  202. m_config.cxWidth = 0;
  203. m_config.cButtons = 0;
  204. m_config.cRadioButtons = 0;
  205. m_config.dwCommonButtons = 0;
  206. int i;
  207. for (i = 0; i < m_arrButtons.GetSize(); i++)
  208. {
  209. XTPTaskDialogSetConfigText(m_arrButtons[i].pszButtonText, NULL);
  210. }
  211. m_arrButtons.RemoveAll();
  212. for (i = 0; i < m_arrRadioButtons.GetSize(); i++)
  213. {
  214. XTPTaskDialogSetConfigText(m_arrRadioButtons[i].pszButtonText, NULL);
  215. }
  216. m_arrRadioButtons.RemoveAll();
  217. m_nSelButtonID      = 0;
  218. }
  219. void CXTPTaskDialog::SetWindowTitle(LPCTSTR pszText)
  220. {
  221. CString strText = pszText;
  222. if (pszText && IS_INTRESOURCE(pszText))
  223. {
  224. XTPLoadStringInst(m_config.hInstance, (UINT)(UINT_PTR)pszText, &strText);
  225. }
  226. XTPTaskDialogSetConfigText(m_config.pszWindowTitle, strText);
  227. if (::IsWindow(m_hwndTaskDialog))
  228. {
  229. ::SetWindowText(m_hwndTaskDialog, strText);
  230. }
  231. }
  232. BOOL CXTPTaskDialog::SetMainInstruction(LPCTSTR pszText)
  233. {
  234. XTPTaskDialogSetConfigText(m_config.pszMainInstruction, pszText);
  235. if (::IsWindow(m_hwndTaskDialog))
  236. {
  237. return (::SendMessage(m_hwndTaskDialog, TDM_SET_ELEMENT_TEXT,
  238. TDE_MAIN_INSTRUCTION, (LPARAM)(LPCWSTR)m_config.pszMainInstruction) != 0);
  239. }
  240. return TRUE;
  241. }
  242. BOOL CXTPTaskDialog::SetContent(LPCTSTR pszText)
  243. {
  244. XTPTaskDialogSetConfigText(m_config.pszContent, pszText);
  245. if (::IsWindow(m_hwndTaskDialog))
  246. {
  247. return (::SendMessage(m_hwndTaskDialog, TDM_SET_ELEMENT_TEXT,
  248. TDE_CONTENT, (LPARAM)(LPCWSTR)m_config.pszContent) != 0);
  249. }
  250. return TRUE;
  251. }
  252. BOOL CXTPTaskDialog::SetExpandedInformation(LPCTSTR pszText)
  253. {
  254. XTPTaskDialogSetConfigText(m_config.pszExpandedInformation, pszText);
  255. if (::IsWindow(m_hwndTaskDialog))
  256. {
  257. return (::SendMessage(m_hwndTaskDialog, TDM_SET_ELEMENT_TEXT,
  258. TDE_EXPANDED_INFORMATION, (LPARAM)(LPCWSTR)m_config.pszExpandedInformation) != 0);
  259. }
  260. return TRUE;
  261. }
  262. BOOL CXTPTaskDialog::SetFooter(LPCTSTR pszText)
  263. {
  264. XTPTaskDialogSetConfigText(m_config.pszFooter, pszText);
  265. if (::IsWindow(m_hwndTaskDialog))
  266. {
  267. return (::SendMessage(m_hwndTaskDialog, TDM_SET_ELEMENT_TEXT,
  268. TDE_FOOTER, (LPARAM)(LPCWSTR)m_config.pszFooter) != 0);
  269. }
  270. return TRUE;
  271. }
  272. BOOL CXTPTaskDialog::SetMainIcon(HICON hIcon)
  273. {
  274. ModifyTaskStyle(TDF_USE_HICON_MAIN, hIcon == 0 ? 0: TDF_USE_HICON_MAIN);
  275. m_config.hMainIcon = hIcon;
  276. if (::IsWindow(m_hwndTaskDialog))
  277. {
  278. return (::SendMessage(m_hwndTaskDialog, TDM_UPDATE_ICON,
  279. TDIE_ICON_MAIN, (LPARAM)hIcon) != 0);
  280. }
  281. return TRUE;
  282. }
  283. BOOL CXTPTaskDialog::SetMainIcon(LPCWSTR pszResource)
  284. {
  285. ASSERT(IS_INTRESOURCE(pszResource));
  286. ModifyTaskStyle(TDF_USE_HICON_MAIN, 0);
  287. m_config.pszMainIcon = pszResource;
  288. if (::IsWindow(m_hwndTaskDialog))
  289. {
  290. return (::SendMessage(m_hwndTaskDialog, TDM_UPDATE_ICON,
  291. TDIE_ICON_MAIN, (LPARAM)pszResource) != 0);
  292. }
  293. return TRUE;
  294. }
  295. BOOL CXTPTaskDialog::SetFooterIcon(HICON hIcon)
  296. {
  297. ModifyTaskStyle(TDF_USE_HICON_FOOTER, (hIcon == 0) ? 0 : TDF_USE_HICON_FOOTER);
  298. m_config.hFooterIcon = hIcon;
  299. if (::IsWindow(m_hwndTaskDialog))
  300. {
  301. return (::SendMessage(m_hwndTaskDialog, TDM_UPDATE_ICON,
  302. TDIE_ICON_FOOTER, (LPARAM)hIcon) != NULL);
  303. }
  304. return TRUE;
  305. }
  306. BOOL CXTPTaskDialog::SetFooterIcon(LPCWSTR pszResource)
  307. {
  308. ASSERT(IS_INTRESOURCE(pszResource));
  309. ModifyTaskStyle(TDF_USE_HICON_FOOTER, 0);
  310. m_config.pszFooterIcon = pszResource;
  311. if (::IsWindow(m_hwndTaskDialog))
  312. {
  313. return (::SendMessage(m_hwndTaskDialog, TDM_UPDATE_ICON,
  314. TDIE_ICON_FOOTER, (LPARAM)pszResource) != 0);
  315. }
  316. return TRUE;
  317. }
  318. void CXTPTaskDialog::SetWidth(int cxWidth, BOOL bPixelToDLU /*=FALSE*/)
  319. {
  320. if (bPixelToDLU)
  321. {
  322. CSize sizeBase = ::GetDialogBaseUnits();
  323. cxWidth = ::MulDiv(cxWidth, 4, sizeBase.cx);
  324. }
  325. m_config.cxWidth = cxWidth;
  326. }
  327. void CXTPTaskDialog::AddButton(LPCTSTR pszText, int nButtonID)
  328. {
  329. for (int i = 0; i < (int)m_arrButtons.GetSize(); i++)
  330. {
  331. if (m_arrButtons[i].nButtonID == nButtonID)
  332. {
  333. XTPTaskDialogSetConfigText(m_arrButtons[i].pszButtonText, pszText);
  334. return;
  335. }
  336. }
  337. TASKDIALOG_BUTTON button;
  338. ZeroMemory(&button, sizeof(TASKDIALOG_BUTTON));
  339. XTPTaskDialogSetConfigText(button.pszButtonText, pszText);
  340. button.nButtonID = nButtonID;
  341. m_arrButtons.Add(button);
  342. m_config.pButtons      = m_arrButtons.GetData();
  343. m_config.cButtons      = (UINT)m_arrButtons.GetSize();
  344. }
  345. void CXTPTaskDialog::AddRadioButton(LPCTSTR pszText, int nButtonID)
  346. {
  347. for (int i = 0; i < (int)m_arrRadioButtons.GetSize(); i++)
  348. {
  349. if (m_arrRadioButtons[i].nButtonID == nButtonID)
  350. {
  351. XTPTaskDialogSetConfigText(m_arrRadioButtons[i].pszButtonText, pszText);
  352. return;
  353. }
  354. }
  355. TASKDIALOG_BUTTON radioButton;
  356. ZeroMemory(&radioButton, sizeof(TASKDIALOG_BUTTON));
  357. XTPTaskDialogSetConfigText(radioButton.pszButtonText, pszText);
  358. radioButton.nButtonID = nButtonID;
  359. m_arrRadioButtons.Add(radioButton);
  360. m_config.pRadioButtons = m_arrRadioButtons.GetData();
  361. m_config.cRadioButtons = (UINT)m_arrRadioButtons.GetSize();
  362. }
  363. void CXTPTaskDialog::SetVerificationText(LPCTSTR pszText)
  364. {
  365. XTPTaskDialogSetConfigText(m_config.pszVerificationText, pszText);
  366. }
  367. void CXTPTaskDialog::SetExpandedControlText(LPCTSTR pszText)
  368. {
  369. XTPTaskDialogSetConfigText(m_config.pszExpandedControlText, pszText);
  370. }
  371. void CXTPTaskDialog::SetCollapsedControlText(LPCTSTR pszText)
  372. {
  373. XTPTaskDialogSetConfigText(m_config.pszCollapsedControlText, pszText);
  374. }
  375. BOOL CXTPTaskDialog::Create(CWnd* pParentWnd /*= NULL*/)
  376. {
  377. return CXTPTaskDialogFrame::Create(pParentWnd);
  378. }
  379. INT_PTR CXTPTaskDialog::DoModal(BOOL bUseComCtl32 /*=TRUE*/)
  380. {
  381. ASSERT(m_hwndTaskDialog == NULL);
  382. m_config.pButtons      = m_arrButtons.GetData();
  383. m_config.cButtons      = (UINT)m_arrButtons.GetSize();
  384. m_config.pRadioButtons = m_arrRadioButtons.GetData();
  385. m_config.cRadioButtons = (UINT)m_arrRadioButtons.GetSize();
  386. if (m_bEnableMarkup) bUseComCtl32 = FALSE;
  387. // You can only use comctl32.dll task dialog when system is vista or newer...
  388. if (bUseComCtl32 && (XTPSystemVersion()->dwMajorVersion >= 5))
  389. {
  390. HRESULT (WINAPI* pfnTaskDialogIndirect)(const TASKDIALOGCONFIG*, int*, int*, BOOL*);
  391. CXTPModuleHandle modComCtl32(_T("ComCtl32.dll"));
  392. if (modComCtl32.GetProcAddress((FARPROC*)&pfnTaskDialogIndirect, "TaskDialogIndirect", MAKELONG(0,6)))
  393. {
  394. if (FAILED(pfnTaskDialogIndirect(&m_config,
  395. &m_nSelButtonID, &m_nSelRadioButtonID, &m_bVerification)))
  396. {
  397. return 0;
  398. }
  399. return m_nSelButtonID;
  400. }
  401. }
  402. m_nSelButtonID = (int)CXTPTaskDialogFrame::DoModal();
  403. return m_nSelButtonID;
  404. }
  405. BOOL CXTPTaskDialog::ModifyTaskStyle(TASKDIALOG_FLAGS dwRemove, TASKDIALOG_FLAGS dwAdd)
  406. {
  407. TASKDIALOG_FLAGS dwStyle = m_config.dwFlags;
  408. TASKDIALOG_FLAGS dwNewStyle = (dwStyle & ~dwRemove) | dwAdd;
  409. if (dwStyle != dwNewStyle)
  410. {
  411. m_config.dwFlags = dwNewStyle;
  412. return TRUE;
  413. }
  414. return FALSE;
  415. }
  416. void CXTPTaskDialog::EnableHyperlinks(BOOL bEnable)
  417. {
  418. ModifyTaskStyle(TDF_ENABLE_HYPERLINKS, bEnable? TDF_ENABLE_HYPERLINKS: 0);
  419. }
  420. void CXTPTaskDialog::EnableMarkup(BOOL bEnable)
  421. {
  422. m_bEnableMarkup = bEnable;
  423. }
  424. void CXTPTaskDialog::EnableCancellation(BOOL bEnable)
  425. {
  426. ModifyTaskStyle(TDF_ALLOW_DIALOG_CANCELLATION, bEnable? TDF_ALLOW_DIALOG_CANCELLATION: 0);
  427. }
  428. void CXTPTaskDialog::EnableRelativePosition(BOOL bEnable)
  429. {
  430. ModifyTaskStyle(TDF_POSITION_RELATIVE_TO_WINDOW, bEnable? TDF_POSITION_RELATIVE_TO_WINDOW: 0);
  431. }
  432. void CXTPTaskDialog::ShowProgressBar(BOOL bShow, BOOL bMarquee /*=FALSE*/)
  433. {
  434. if (bMarquee)
  435. {
  436. ModifyTaskStyle(TDF_SHOW_PROGRESS_BAR | TDF_SHOW_MARQUEE_PROGRESS_BAR,
  437. bShow? TDF_SHOW_MARQUEE_PROGRESS_BAR: 0);
  438. }
  439. else
  440. {
  441. ModifyTaskStyle(TDF_SHOW_MARQUEE_PROGRESS_BAR | TDF_SHOW_PROGRESS_BAR,
  442. bShow? TDF_SHOW_PROGRESS_BAR: 0);
  443. }
  444. }
  445. void CXTPTaskDialog::EnableRtlLayout(BOOL bEnable)
  446. {
  447. ModifyTaskStyle(TDF_RTL_LAYOUT, bEnable? TDF_RTL_LAYOUT: 0);
  448. }
  449. void CXTPTaskDialog::ExpandedByDefault(BOOL bExpanded)
  450. {
  451. ModifyTaskStyle(TDF_EXPANDED_BY_DEFAULT, bExpanded? TDF_EXPANDED_BY_DEFAULT: 0);
  452. }
  453. void CXTPTaskDialog::ExpandFooterArea(BOOL bExpandFooter)
  454. {
  455. ModifyTaskStyle(TDF_EXPAND_FOOTER_AREA, bExpandFooter? TDF_EXPAND_FOOTER_AREA: 0);
  456. }
  457. void CXTPTaskDialog::SetCommonButtons(BOOL bOk, BOOL bYes, BOOL bNo, BOOL bCancel, BOOL bRetry, BOOL bClose)
  458. {
  459. m_config.dwCommonButtons = 0;
  460. if (bOk)     m_config.dwCommonButtons |= TDCBF_OK_BUTTON;
  461. if (bYes)    m_config.dwCommonButtons |= TDCBF_YES_BUTTON;
  462. if (bNo)     m_config.dwCommonButtons |= TDCBF_NO_BUTTON;
  463. if (bCancel) m_config.dwCommonButtons |= TDCBF_CANCEL_BUTTON;
  464. if (bRetry)  m_config.dwCommonButtons |= TDCBF_RETRY_BUTTON;
  465. if (bClose)  m_config.dwCommonButtons |= TDCBF_CLOSE_BUTTON;
  466. }
  467. void CXTPTaskDialog::SetCommonButtons(TASKDIALOG_COMMON_BUTTON_FLAGS dwButtons)
  468. {
  469. m_config.dwCommonButtons = dwButtons;
  470. }
  471. void CXTPTaskDialog::EnableCommandLinks(BOOL bEnable, BOOL bShowIcon)
  472. {
  473. if (bShowIcon)
  474. {
  475. ModifyTaskStyle(TDF_USE_COMMAND_LINKS | TDF_USE_COMMAND_LINKS_NO_ICON,
  476. bEnable? TDF_USE_COMMAND_LINKS: 0);
  477. }
  478. else
  479. {
  480. ModifyTaskStyle(TDF_USE_COMMAND_LINKS_NO_ICON | TDF_USE_COMMAND_LINKS,
  481. bEnable? TDF_USE_COMMAND_LINKS_NO_ICON: 0);
  482. }
  483. }
  484. void CXTPTaskDialog::SetDefaultButton(int nButtonID)
  485. {
  486. m_config.nDefaultButton = nButtonID;
  487. }
  488. void CXTPTaskDialog::SetDefaultRadioButton(int nButtonID)
  489. {
  490. m_config.nDefaultRadioButton = nButtonID;
  491. NoDefaultRadioButton(nButtonID == 0);
  492. }
  493. void CXTPTaskDialog::NoDefaultRadioButton(BOOL bNoDefault)
  494. {
  495. ModifyTaskStyle(TDF_NO_DEFAULT_RADIO_BUTTON, bNoDefault? TDF_NO_DEFAULT_RADIO_BUTTON: 0);
  496. if (bNoDefault)
  497. m_config.nDefaultRadioButton = 0;
  498. }
  499. void CXTPTaskDialog::SetVerifyCheckState(BOOL bChecked)
  500. {
  501. ModifyTaskStyle(TDF_VERIFICATION_FLAG_CHECKED, bChecked? TDF_VERIFICATION_FLAG_CHECKED: 0);
  502. }
  503. void CXTPTaskDialog::EnableCallbackTimer(BOOL bEnable)
  504. {
  505. ModifyTaskStyle(TDF_CALLBACK_TIMER, bEnable? TDF_CALLBACK_TIMER: 0);
  506. }
  507. void CXTPTaskDialog::EnableMinimize(BOOL bEnable)
  508. {
  509. ModifyTaskStyle(TDF_CAN_BE_MINIMIZED, bEnable? TDF_CAN_BE_MINIMIZED: 0);
  510. }
  511. AFX_INLINE CString GetPropExchangeString(CXTPPropExchange* pPX, LPCTSTR lpsz, LPCTSTR const* rglpsz, int nString)
  512. {
  513. CString str;
  514. if (lpsz)
  515. {
  516. CXTPPropExchangeSection px(pPX->GetSection(lpsz));
  517. PX_String(&px, NULL, str);
  518. }
  519. else
  520. {
  521. PX_String(pPX, NULL, str);
  522. }
  523. if (nString > 0 && FIND_S(str, _T('%'), 0) != -1)
  524. {
  525. CString strFormat = str;
  526. AfxFormatStrings(str, strFormat, rglpsz, nString);
  527. }
  528. return str;
  529. }
  530. AFX_INLINE int GetPropExchangeInt(CXTPPropExchange* pPX, LPCTSTR lpsz)
  531. {
  532. CString str;
  533. PX_String(pPX, lpsz, str);
  534. return _ttoi(str);
  535. }
  536. AFX_INLINE BOOL GetPropExchangeFlag(CXTPPropExchange* pPX, LPCTSTR lpsz)
  537. {
  538. CString str;
  539. PX_String(pPX, lpsz, str);
  540. return str.CompareNoCase(_T("True")) == 0 || str.CompareNoCase(_T("1")) == 0;
  541. }
  542. AFX_INLINE LPCWSTR GetPropExchangeIcon(CXTPPropExchange* pPX, LPCTSTR lpsz)
  543. {
  544. CString str;
  545. CXTPPropExchangeSection px(pPX->GetSection(lpsz));
  546. PX_String(&px, _T("Image"), str);
  547. if (str.IsEmpty())
  548. return NULL;
  549. if (str.CompareNoCase(_T("*Information")) == 0)
  550. return TD_INFORMATION_ICON;
  551. if (str.CompareNoCase(_T("*Error")) == 0)
  552. return TD_ERROR_ICON;
  553. if (str.CompareNoCase(_T("*Shield")) == 0)
  554. return TD_SHIELD_ICON;
  555. if (str.CompareNoCase(_T("*Warning")) == 0)
  556. return TD_WARNING_ICON;
  557. return NULL;
  558. }
  559. BOOL CXTPTaskDialog::CreateFromResource(UINT nIDResource, LPCTSTR lpszDialog)
  560. {
  561. return CreateFromResourceParam(AfxGetInstanceHandle(), nIDResource, lpszDialog, NULL, 0);
  562. }
  563. BOOL CXTPTaskDialog::CreateFromResource(HINSTANCE hInstance, UINT nIDResource, LPCTSTR lpszDialog)
  564. {
  565. return CreateFromResourceParam(hInstance, nIDResource, lpszDialog, NULL, 0);
  566. }
  567. BOOL CXTPTaskDialog::CreateFromResourceParam(HINSTANCE hInstance, UINT nIDResource, LPCTSTR lpszDialog, LPCTSTR const* rglpsz, int nString)
  568. {
  569. CXTPPropExchangeXMLNode px(TRUE, NULL, _T("Dialogs"));
  570. if (!px.LoadFromResource(hInstance, MAKEINTRESOURCE(nIDResource), RT_HTML))
  571. return FALSE;
  572. if (!px.OnBeforeExchange())
  573. return FALSE;
  574. px.SetCompactMode(TRUE);
  575. CString strDialogSection;
  576. strDialogSection.Format(_T("Dialog[@Name='%s']"), lpszDialog);
  577. if (!px.IsSectionExists(strDialogSection))
  578. return FALSE;
  579. CXTPPropExchangeSection pxDialog(px.GetSection(strDialogSection));
  580. if (!pxDialog->OnBeforeExchange())
  581. return FALSE;
  582. return CreateFromResourceParam((CXTPPropExchangeXMLNode*)&pxDialog, rglpsz, nString);
  583. }
  584. BOOL CXTPTaskDialog::CreateFromResourceParam(CXTPPropExchangeXMLNode* pPX, LPCTSTR const* rglpsz, int nString)
  585. {
  586. if (!pPX)
  587. return FALSE;
  588. EnableHyperlinks(GetPropExchangeFlag(pPX, _T("EnableHyperlinks")));
  589. EnableCancellation(GetPropExchangeFlag(pPX, _T("AllowCancel")));
  590. ShowProgressBar(GetPropExchangeFlag(pPX, _T("ProgressBar")), FALSE);
  591. SetWidth(GetPropExchangeInt(pPX, _T("Width")), TRUE);
  592. EnableRelativePosition(GetPropExchangeFlag(pPX, _T("RelativeToWindow")));
  593. EnableRtlLayout(GetPropExchangeFlag(pPX, _T("RTLLayout")));
  594. NoDefaultRadioButton(GetPropExchangeFlag(pPX, _T("NoDefaultRadioButton")));
  595. EnableMessageBoxStyle(GetPropExchangeFlag(pPX, _T("MessageBoxStyle")));
  596. SetWindowTitle(GetPropExchangeString(pPX, _T("WindowTitle"), rglpsz, nString));
  597. SetMainInstruction(GetPropExchangeString(pPX, _T("MainInstruction"), rglpsz, nString));
  598. SetContent(GetPropExchangeString(pPX, _T("Content"), rglpsz, nString));
  599. SetFooter(GetPropExchangeString(pPX, _T("Footer"), rglpsz, nString));
  600. SetMainIcon(GetPropExchangeIcon(pPX, _T("MainInstruction")));
  601. SetFooterIcon(GetPropExchangeIcon(pPX, _T("Footer")));
  602. CXTPPropExchangeSection pxButtons(pPX->GetSection(_T("Buttons")));
  603. CXTPPropExchangeEnumeratorPtr enumButton(pxButtons->GetEnumerator(NULL));
  604. POSITION pos = enumButton->GetPosition(0);
  605. while (pos)
  606. {
  607. CXTPPropExchangeSection secButton(enumButton->GetNext(pos));
  608. CString strSection = ((CXTPPropExchangeXMLNode*)&secButton)->GetSectionName();
  609. int nID = GetPropExchangeInt(&secButton, _T("ID"));
  610. if (strSection.CompareNoCase(_T("Button")) == 0 && (nID != 0))
  611. {
  612. AddButton(GetPropExchangeString(&secButton, NULL, NULL, 0), nID);
  613. }
  614. else if (strSection.CompareNoCase(_T("CommandLink")) == 0 && (nID != 0))
  615. {
  616. CString strText = GetPropExchangeString(&secButton, _T("Text"), rglpsz, nString);
  617. CString strExplanation = GetPropExchangeString(&secButton, _T("Explanation"), rglpsz, nString);
  618. if (!strExplanation.IsEmpty()) strText += _T("n") + strExplanation;
  619. AddButton(strText, nID);
  620. EnableCommandLinks(TRUE, !GetPropExchangeFlag(pPX, _T("NoCommandLinkGlyph")));
  621. }
  622. else if (strSection.CompareNoCase(_T("Ok")) == 0)
  623. {
  624. m_config.dwCommonButtons |= TDCBF_OK_BUTTON;
  625. }
  626. else if (strSection.CompareNoCase(_T("Yes")) == 0)
  627. {
  628. m_config.dwCommonButtons |= TDCBF_YES_BUTTON;
  629. }
  630. else if (strSection.CompareNoCase(_T("No")) == 0)
  631. {
  632. m_config.dwCommonButtons |= TDCBF_NO_BUTTON;
  633. }
  634. else if (strSection.CompareNoCase(_T("Cancel")) == 0)
  635. {
  636. m_config.dwCommonButtons |= TDCBF_CANCEL_BUTTON;
  637. }
  638. else if (strSection.CompareNoCase(_T("Retry")) == 0)
  639. {
  640. m_config.dwCommonButtons |= TDCBF_RETRY_BUTTON;
  641. }
  642. else if (strSection.CompareNoCase(_T("Close")) == 0)
  643. {
  644. m_config.dwCommonButtons |= TDCBF_CLOSE_BUTTON;
  645. }
  646. }
  647. SetDefaultButton(GetPropExchangeInt(&pxButtons, _T("Default")));
  648. CXTPPropExchangeSection pxRadioButtons(pPX->GetSection(_T("RadioButtons")));
  649. CXTPPropExchangeEnumeratorPtr enumRadioButton(pxRadioButtons->GetEnumerator(_T("RadioButton")));
  650. pos = enumRadioButton->GetPosition(0);
  651. while (pos)
  652. {
  653. CXTPPropExchangeSection secButton(enumRadioButton->GetNext(pos));
  654. int nID = GetPropExchangeInt(&secButton, _T("ID"));
  655. if (nID != 0)
  656. {
  657. AddRadioButton(GetPropExchangeString(&secButton, NULL, NULL, 0), nID);
  658. }
  659. }
  660. SetDefaultRadioButton(GetPropExchangeInt(&pxRadioButtons, _T("Default")));
  661. if (pPX->IsSectionExists(_T("ExpandedInformation")))
  662. {
  663. CXTPPropExchangeSection pxExpandedInformation(pPX->GetSection(_T("ExpandedInformation")));
  664. SetExpandedInformation(GetPropExchangeString(&pxExpandedInformation, NULL, rglpsz, nString));
  665. ExpandFooterArea(GetPropExchangeFlag(&pxExpandedInformation, _T("Footer")));
  666. ExpandedByDefault(GetPropExchangeFlag(&pxExpandedInformation, _T("Expanded")));
  667. SetExpandedControlText(GetPropExchangeString(pPX, _T("ExpandedText"), rglpsz, nString));
  668. SetCollapsedControlText(GetPropExchangeString(pPX, _T("CollapsedText"), rglpsz, nString));
  669. }
  670. if (pPX->IsSectionExists(_T("Verification")))
  671. {
  672. CXTPPropExchangeSection pxVerification(pPX->GetSection(_T("Verification")));
  673. SetVerificationText(GetPropExchangeString(&pxVerification, NULL, rglpsz, nString));
  674. SetVerifyCheckState(GetPropExchangeFlag(&pxVerification, _T("Checked")));
  675. }
  676. return TRUE;
  677. }