cstm2dlg.cpp
上传用户:apjinmao
上传日期:2007-01-02
资源大小:96k
文件大小:13k
源码类别:

PropertySheet

开发平台:

Visual C++

  1. // cstm2dlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PropSheet Wizard.h"
  5. #include "cstm2dlg.h"
  6. #include "PropSheet Wizardaw.h"
  7. #include "PageDlg.h"
  8. #ifdef _PSEUDO_DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. #ifndef TBSTYLE_TRANSPARENT
  13. #define TBSTYLE_TRANSPARENT 0x0800
  14. #endif //TBSTYLE_TRANSPARENT
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CCustom2Dlg dialog
  17. CCustom2Dlg::CCustom2Dlg()
  18. : CAppWizStepDlg(CCustom2Dlg::IDD)
  19. {
  20. //{{AFX_DATA_INIT(CCustom2Dlg)
  21. m_pageSize = 1;
  22. m_title = _T("");
  23. //}}AFX_DATA_INIT
  24. }
  25. void CCustom2Dlg::DoDataExchange(CDataExchange* pDX)
  26. {
  27. CAppWizStepDlg::DoDataExchange(pDX);
  28. //{{AFX_DATA_MAP(CCustom2Dlg)
  29. DDX_Control(pDX, IDC_FRAME_TOOLBAR, m_frame);
  30. DDX_Control(pDX, IDC_LIST_PAGES, m_pages);
  31. DDX_Radio(pDX, IDC_RADIO_SMALLPAGES, m_pageSize);
  32. DDX_Text(pDX, IDC_EDIT_TITLE, m_title);
  33. //}}AFX_DATA_MAP
  34. }
  35. // This is called whenever the user presses Next, Back, or Finish with this step
  36. //  present.  Do all validation & data exchange from the dialog in this function.
  37. BOOL CCustom2Dlg::OnDismiss()
  38. {
  39. if (!UpdateData ())
  40. return (FALSE);
  41. if (m_title.IsEmpty ())
  42. return (FALSE);
  43. DefineStringMacro (_T ("SHEET_TITLE"), m_title);
  44. for (int i = 0;i < m_pages.GetItemCount ();i++)
  45. {
  46. CString file;
  47. DefineStringMacro (_T ("PAGE_CAPTION"), i, m_pages.GetItemText (i, 0));
  48. DefineStringMacro (_T ("PAGE_CLASS"), i, file = m_pages.GetItemText (i, 1));
  49. if (file[0] == TCHAR ('C'))
  50. file = file.Mid (1);
  51. DefineStringMacro (_T ("PAGE_FILE"), i, file);
  52. file.SetAt (0, tolower (file[0]));
  53. DefineStringMacro (_T ("PAGE_VAR"), i, _T ("m_") + file);
  54. file.MakeUpper ();
  55. DefineStringMacro (_T ("PAGE_ID"), i, _T ("IDD_") + file);
  56. DefineStringMacro (_T ("PAGE_BMP"), i, _T ("IDB_") + file);
  57. if (!i)
  58. DefineStringMacro (_T ("PAGE_FIRST_BMP"), _T ("IDB_") + file);
  59. DefineIntMacro (_T ("PAGE_VAL"), i, 1000 + i);
  60. DefineIntMacro (_T ("PAGE_ITERATOR"), i, i + 1);
  61. }
  62. int nPages = m_pages.GetItemCount (), nClasses = nPages + 2, nIndex = nPages;
  63. DefineIntMacro (_T ("NUM_PAGES"), nPages);
  64. CString sAbout;
  65. if (PropSheetWizardaw.m_Dictionary.Lookup (_T ("ABOUT_BOX"), sAbout))
  66. {
  67. DefineIntMacro (_T ("ABOUT_NUM"), ++nIndex);
  68. nClasses++;
  69. }
  70. DefineIntMacro (_T ("NUM_CLASSES"), nClasses);
  71. DefineIntMacro (_T ("NUM_RESOURCES"), nClasses - 1 - !PropSheetWizardaw.m_Dictionary.Lookup (_T ("SEND_TO_TASKBAR"), sAbout));
  72. DefineIntMacro (_T ("MAINSHEET_NUM"), ++nIndex);
  73. DefineIntMacro (_T ("APP_NUM"), ++nIndex);
  74. DefineBoolMacro (_T ("SMALL_PAGE"), m_pageSize == 0);
  75. DefineBoolMacro (_T ("MEDIUM_PAGE"), m_pageSize == 1);
  76. DefineBoolMacro (_T ("LARGE_PAGE"), m_pageSize == 2);
  77. return (TRUE); // return FALSE if the dialog shouldn't be dismissed
  78. }
  79. BOOL CCustom2Dlg::PreTranslateMessage (MSG* pMsg)
  80. {
  81. // Let the ToolTip process this message.
  82. m_ctrlTooltip.RelayEvent (pMsg);
  83. return CAppWizStepDlg::PreTranslateMessage (pMsg);
  84. }
  85. BEGIN_MESSAGE_MAP(CCustom2Dlg, CAppWizStepDlg)
  86. //{{AFX_MSG_MAP(CCustom2Dlg)
  87. ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_PAGES, OnItemchangedListPages)
  88. ON_COMMAND(IDC_PAGE_NEW, OnPageNew)
  89. ON_COMMAND(IDC_PAGE_MODIFY, OnPageModify)
  90. ON_COMMAND(IDC_PAGE_DELETE, OnPageDelete)
  91. ON_COMMAND(IDC_PAGE_MOVEUP, OnPageMoveUp)
  92. ON_COMMAND(IDC_PAGE_MOVEDOWN, OnPageMoveDown)
  93. ON_WM_PAINT()
  94. ON_BN_CLICKED(IDC_RADIO_LARGEPAGES, OnChangeSize)
  95. ON_BN_CLICKED(IDC_RADIO_MEDIUMPAGES, OnChangeSize)
  96. ON_BN_CLICKED(IDC_RADIO_SMALLPAGES, OnChangeSize)
  97. ON_NOTIFY(NM_DBLCLK, IDC_LIST_PAGES, OnDblclkListPages)
  98. //}}AFX_MSG_MAP
  99. ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0x0000, 0xFFFF, OnToolTipText)
  100. ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0x0000, 0xFFFF, OnToolTipText)
  101. END_MESSAGE_MAP()
  102. /////////////////////////////////////////////////////////////////////////////
  103. // CCustom2Dlg message handlers
  104. BOOL CCustom2Dlg::OnInitDialog() 
  105. {
  106. PropSheetWizardaw.m_Dictionary.Lookup (_T ("Root"), m_title);
  107. CAppWizStepDlg::OnInitDialog();
  108. // Create the ToolTip control.
  109. m_ctrlTooltip.Create (this);
  110. m_ctrlTooltip.Activate (TRUE);
  111. // TODO: Use one of the following forms to add controls:
  112. m_ctrlTooltip.AddTool (GetDlgItem (IDC_EDIT_TITLE), IDS_CUSTOM2_EDIT_TITLE_TIP);
  113. m_ctrlTooltip.AddTool (GetDlgItem (IDC_RADIO_SMALLPAGES), IDS_CUSTOM2_RADIO_SMALLPAGES_TIP);
  114. m_ctrlTooltip.AddTool (GetDlgItem (IDC_RADIO_MEDIUMPAGES), IDS_CUSTOM2_RADIO_MEDIUMPAGES_TIP);
  115. m_ctrlTooltip.AddTool (GetDlgItem (IDC_RADIO_LARGEPAGES), IDS_CUSTOM2_RADIO_LARGEPAGES_TIP);
  116. m_ctrlTooltip.AddTool (GetDlgItem (IDC_LIST_PAGES), IDS_CUSTOM2_LIST_PAGES_TIP);
  117. m_ctrlTooltip.AddTool (&m_toolBar, LPSTR_TEXTCALLBACK);
  118. m_toolBar.SetToolTips (&m_ctrlTooltip);
  119. CRect r;
  120. m_frame.GetWindowRect (r);
  121. CWnd *pParent = this;
  122. pParent->ScreenToClient (r);
  123. r.InflateRect (0, 2);
  124. m_toolBar.Create (WS_CHILD|WS_VISIBLE|CCS_NOPARENTALIGN|CCS_NODIVIDER|CCS_NORESIZE|TBSTYLE_TRANSPARENT|TBSTYLE_TOOLTIPS, r, pParent, IDR_TOOLBAR);
  125. m_toolBar.SetButtonSize (CSize (21, 18));
  126. m_toolBar.SetBitmapSize (CSize (14, 12));
  127. VERIFY (m_toolBar.AddBitmap (5, IDR_TOOLBAR) != -1);
  128. for (int i = 0;i < 5;i++)
  129. {
  130. TBBUTTON tb;
  131. tb.iString = 0;
  132. tb.fsState = TBSTATE_ENABLED;
  133. tb.fsStyle = TBSTYLE_BUTTON;
  134. tb.dwData = 0;
  135. tb.iBitmap = i;
  136. tb.idCommand = IDC_PAGE_NEW + i;
  137. VERIFY (m_toolBar.AddButtons (1, &tb));
  138. }
  139. m_toolBar.AutoSize ();
  140. m_toolBar.SetWindowPos (NULL, r.left, r.top, r.Width (), r.Height (), SWP_NOZORDER);
  141. m_pages.ModifyStyle (0, LVS_SHOWSELALWAYS);
  142. m_pages.GetClientRect (r);
  143. m_pages.InsertColumn (0, _T ("Page Caption"), LVCFMT_LEFT, r.Width () / 2);
  144. m_pages.InsertColumn (1, _T ("Page Class"), LVCFMT_LEFT, r.Width () / 2);
  145. m_pages.DeleteAllItems ();
  146. CString root, page;
  147. PropSheetWizardaw.m_Dictionary.Lookup (_T ("Root"), root);
  148. m_pages.InsertItem (0, root + _T (" Page"));
  149. PropSheetWizardaw.m_Dictionary.Lookup (_T ("Safe_root"), root);
  150. root.SetAt (0, toupper (root[0]));
  151. page = _T ("C") + root + _T ("Page");
  152. root.SetAt (0, tolower (root[0]));
  153. m_pages.SetItemText (0, 1, page);
  154. UpdateControls ();
  155. return TRUE;  // return TRUE unless you set the focus to a control
  156.               // EXCEPTION: OCX Property Pages should return FALSE
  157. }
  158. void CCustom2Dlg::OnItemchangedListPages(NMHDR* pNMHDR, LRESULT* pResult) 
  159. {
  160. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  161. if (pNMListView->uChanged & LVIF_STATE)
  162. UpdateControls ();
  163. *pResult = 0;
  164. }
  165. void CCustom2Dlg::OnPageMoveUp() 
  166. {
  167. int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
  168. if (nSelect > 0)
  169. {
  170. CString s1 = m_pages.GetItemText (nSelect, 0), s2 = m_pages.GetItemText (nSelect, 1);
  171. m_pages.DeleteItem (nSelect);
  172. nSelect = m_pages.InsertItem (nSelect - 1, s1);
  173. m_pages.SetItemText (nSelect, 1, s2);
  174. m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
  175. }
  176. UpdateControls ();
  177. }
  178. void CCustom2Dlg::OnPageMoveDown() 
  179. {
  180. int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
  181. if (nSelect < m_pages.GetItemCount () - 1)
  182. {
  183. CString s1 = m_pages.GetItemText (nSelect, 0), s2 = m_pages.GetItemText (nSelect, 1);
  184. m_pages.DeleteItem (nSelect);
  185. nSelect = m_pages.InsertItem (nSelect + 1, s1);
  186. m_pages.SetItemText (nSelect, 1, s2);
  187. m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
  188. }
  189. UpdateControls ();
  190. }
  191. void CCustom2Dlg::OnPageNew() 
  192. {
  193. CPageDlg dlg;
  194. if (dlg.DoModal () == IDOK)
  195. {
  196. for (int i = m_pages.GetItemCount ();--i >= 0;)
  197. {
  198. CString f1 = m_pages.GetItemText (i, 1),
  199. f2 = dlg.m_class;
  200. if (f1 == f2)
  201. {
  202. CString msg;
  203. AfxFormatString1 (msg, IDS_CLASS_EXIST, dlg.m_class);
  204. AfxMessageBox (msg, MB_OK|MB_ICONHAND);
  205. return;
  206. }
  207. CString szClassOld = f1;
  208. if (f1[0] == 'C')
  209. f1 = f1.Mid (1);
  210. if (f2[0] == 'C')
  211. f2 = f2.Mid (1);
  212. if (f1 == f2)
  213. {
  214. CString msg;
  215. AfxFormatString2 (msg, IDS_FILE_EXIST, f1, szClassOld);
  216. AfxMessageBox (msg, MB_OK|MB_ICONHAND);
  217. return;
  218. }
  219. }
  220. int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
  221. nSelect = m_pages.InsertItem (nSelect + 1, dlg.m_caption);
  222. m_pages.SetItemText (nSelect, 1, dlg.m_class);
  223. m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
  224. UpdateControls ();
  225. }
  226. }
  227. void CCustom2Dlg::OnPageModify() 
  228. {
  229. int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
  230. if (nSelect < 0)
  231. return;
  232. CPageDlg dlg;
  233. dlg.m_caption = m_pages.GetItemText (nSelect, 0);
  234. dlg.m_class = m_pages.GetItemText (nSelect, 1);
  235. if (dlg.DoModal () == IDOK)
  236. {
  237. for (int i = m_pages.GetItemCount ();--i >= 0;)
  238. {
  239. if (i == nSelect)
  240. continue;
  241. CString f1 = m_pages.GetItemText (i, 1),
  242. f2 = dlg.m_class;
  243. if (f1 == f2)
  244. {
  245. CString msg;
  246. AfxFormatString1 (msg, IDS_CLASS_EXIST, dlg.m_class);
  247. AfxMessageBox (msg, MB_OK|MB_ICONHAND);
  248. return;
  249. }
  250. CString szClassOld = f1;
  251. if (f1[0] == 'C')
  252. f1 = f1.Mid (1);
  253. if (f2[0] == 'C')
  254. f2 = f2.Mid (1);
  255. if (f1 == f2)
  256. {
  257. CString msg;
  258. AfxFormatString2 (msg, IDS_FILE_EXIST, f1, szClassOld);
  259. AfxMessageBox (msg, MB_OK|MB_ICONHAND);
  260. return;
  261. }
  262. }
  263. m_pages.SetItemText (nSelect, 0, dlg.m_caption);
  264. m_pages.SetItemText (nSelect, 1, dlg.m_class);
  265. m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
  266. UpdateControls ();
  267. }
  268. }
  269. void CCustom2Dlg::OnPageDelete() 
  270. {
  271. int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
  272. if (nSelect >= 0)
  273. {
  274. m_pages.DeleteItem (nSelect);
  275. m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
  276. if (nSelect >= m_pages.GetItemCount ())
  277. nSelect = m_pages.GetItemCount () - 1;
  278. if (nSelect >= 0)
  279. m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
  280. UpdateControls ();
  281. }
  282. }
  283. void CCustom2Dlg::UpdateControls ()
  284. {
  285. int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED);
  286. m_toolBar.EnableButton (IDC_PAGE_MODIFY, nSelect >= 0);
  287. m_toolBar.EnableButton (IDC_PAGE_DELETE, nSelect >= 0 && m_pages.GetItemCount () > 1);
  288. m_toolBar.EnableButton (IDC_PAGE_MOVEUP, nSelect > 0);
  289. m_toolBar.EnableButton (IDC_PAGE_MOVEDOWN, nSelect >= 0 && nSelect < m_pages.GetItemCount () - 1);
  290. }
  291. #define STEP2_LEFT 8
  292. #define STEP2_TOP 72
  293. #define STEP2_WIDTH 179
  294. #define STEP2_HEIGHT 180
  295. // Coordinates for yellow rectangle in dialog-box units
  296. #define RIGHT_YELLOW_DLGU 124
  297. #define BOTTOM_YELLOW_DLGU 197
  298. void CCustom2Dlg::OnPaint() 
  299. {
  300. CPaintDC dc(this); // device context for painting
  301. CDC mdc;
  302. mdc.CreateCompatibleDC (&dc);
  303. CRect rect (0, 0, RIGHT_YELLOW_DLGU+1, BOTTOM_YELLOW_DLGU+1);
  304. MapDialogRect (&rect);
  305. dc.DPtoLP (&rect);
  306. CBitmap bmp, *ob;
  307. bmp.CreateCompatibleBitmap (&dc, rect.right, rect.bottom);
  308. ob = mdc.SelectObject (&bmp);
  309. PaintBackground (mdc, this);
  310. UINT nBmpID;
  311. switch (m_pageSize)
  312. {
  313. case 0:
  314. nBmpID = IDB_STEP2SMALL;
  315. break;
  316. case 2:
  317. nBmpID = IDB_STEP2LARGE;
  318. break;
  319. default:
  320. nBmpID = IDB_STEP2MEDIUM;
  321. break;
  322. }
  323. PaintBitmap (nBmpID, STEP2_LEFT, STEP2_TOP, STEP2_WIDTH, STEP2_HEIGHT, mdc);
  324. dc.BitBlt (rect.left, rect.top, rect.Width (), rect.Height (), &mdc, rect.left, rect.top, SRCCOPY);
  325. mdc.SelectObject (ob);
  326. }
  327. void CCustom2Dlg::OnChangeSize() 
  328. {
  329. if (UpdateData ())
  330. {
  331. // Invalidate the portion of this dialog on which we draw the picture
  332. CRect rect (STEP2_LEFT, STEP2_TOP, STEP2_LEFT + STEP2_WIDTH, STEP2_TOP + STEP2_HEIGHT);
  333. InvalidateRect (rect, FALSE);
  334. RedrawWindow (rect, NULL, RDW_UPDATENOW);
  335. UpdateControls ();
  336. }
  337. }
  338. void CCustom2Dlg::OnDblclkListPages(NMHDR* pNMHDR, LRESULT* pResult) 
  339. {
  340. int index = m_pages.GetNextItem (-1, LVNI_SELECTED);
  341. if (index >= 0 && index < m_pages.GetItemCount ())
  342. OnPageModify ();
  343. *pResult = 0;
  344. }
  345. BOOL CCustom2Dlg::OnToolTipText(UINT nId, NMHDR* pNMHDR, LRESULT* pResult)
  346. {
  347. *pResult = 0;
  348. TOOLTIPTEXTA *pTTTA = (TOOLTIPTEXTA *)pNMHDR;
  349. TOOLTIPTEXTW *pTTTW = (TOOLTIPTEXTW *)pNMHDR;
  350. UINT nID = pNMHDR->idFrom - IDC_PAGE_NEW + IDS_CUSTOM2_PAGE_NEW_TIP;
  351. if (pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW)
  352. {
  353. CString strTipText;
  354. strTipText.LoadString (nID);
  355. static CHAR szBuffer[1000];
  356. static WCHAR wszBuffer[1000];
  357. if (pNMHDR->code == TTN_NEEDTEXTA)
  358. {
  359. lstrcpy (szBuffer, strTipText);
  360. pTTTA->lpszText = szBuffer;
  361. }
  362. else
  363. {
  364. _mbstowcsz (wszBuffer, strTipText, strTipText.GetLength () + 1);
  365. pTTTW->lpszText = wszBuffer;
  366. }
  367. }
  368. return (FALSE);
  369. }