WIZARD.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:21k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
  2. //ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  3. //THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright  1994-1996  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. // PROGRAM: Wizard.c
  9. //
  10. // PURPOSE: Demonstrates how to manipulate a wizard control
  11. //
  12. // PLATFORMS: Windows 95
  13. //
  14. // FUNCTIONS:
  15. // WinMain() - calls initialization function, processes message loop
  16. // InitApplication() - Initializes window data nd registers window
  17. // InitInstance() -saves instance handle and creates main window
  18. // MainWindProc() Processes messages
  19. // About() - Process messages for "About" dialog box
  20. // YourInfo() - Process the "Your Information" Wizard page
  21. // WorkHabits() - Processes the "Work Habits" Wizard page
  22. // TeamWork() - Processes the "Team Work" Wizard page
  23. // Reliability() - Processes the "Reliability" Wizard page
  24. // Goals() - Processes the "Goal Attainment" Wizard page
  25. //  Adaptation() - Processes the "Adaptability to Change" Wizard page
  26. // FillInPropertyPage() - Fills in a PROPSHEETPAGE structure
  27. // CreateWizard() - Creates the wizard
  28. // GenerateReview() - Generates the resulting review
  29. //
  30. // SPECIAL INSTRUCTIONS: N/A
  31. //
  32. #include <windows.h>    // includes basic windows functionality
  33. #include <string.h>     // includes the string functions
  34. #include <prsht.h>      // includes the property sheet functionality
  35. #include "resource.h"   // includes the definitions for the resources
  36. #include "wizard.h"     // includes the application-specific information
  37. REVIEWINFO rvInfo;      // a structure containing the review information
  38. HWND hwndEdit;          // handle to the main MLE
  39. TCHAR lpReview[MAX_BUF]; // Buffer for the review
  40. //
  41. //
  42. //   FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
  43. //
  44. //   PURPOSE: Main entry point for the application. 
  45. //
  46. //   COMMENTS:
  47. //
  48. // This function calls the initialization functions and processes
  49. // the main message loop.
  50. // 
  51. int APIENTRY WinMain(
  52. HINSTANCE hInstance,
  53. HINSTANCE hPrevInstance,
  54. LPSTR lpCmdLine,
  55. int nCmdShow
  56. )
  57. {
  58. MSG msg;                       
  59.       // save off the current instance
  60. rvInfo.hInst = hInstance;
  61.       // if the initialization fails, return.
  62. if (!InitApplication(hInstance))
  63. return (FALSE);     
  64. // Perform initializations that apply to a specific instance 
  65. if (!InitInstance(hInstance, nCmdShow))
  66. return (FALSE);
  67. // Acquire and dispatch messages until a WM_QUIT message is received. 
  68. while (GetMessage(&msg,
  69. NULL,              
  70. 0,                 
  71. 0))                
  72. {
  73. TranslateMessage(&msg);
  74. DispatchMessage(&msg); 
  75. }
  76. return (msg.wParam);  
  77.  
  78. }
  79. //
  80. //
  81. //   FUNCTION: InitApplication(HANDLE) 
  82. //
  83. //   PURPOSE: Initializes window data and registers window class 
  84. //
  85. //   COMMENTS:
  86. //
  87. // This function registers the window class for the main window.
  88. // 
  89. BOOL InitApplication(HANDLE hInstance)
  90. {
  91.         WNDCLASS  wcSample;
  92. // Fill in window class structure with parameters that describe the       
  93. // main window.                                                           
  94.         wcSample.style = 0;                     
  95.         wcSample.lpfnWndProc = (WNDPROC)MainWndProc; 
  96.         wcSample.cbClsExtra = 0;              
  97.         wcSample.cbWndExtra = 0;              
  98.         wcSample.hInstance = hInstance;       
  99.         wcSample.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(EXE_ICON));
  100.         wcSample.hCursor = LoadCursor(NULL, IDC_ARROW);
  101.         wcSample.hbrBackground = GetStockObject(WHITE_BRUSH); 
  102.         wcSample.lpszMenuName =  TEXT("WizardMenu");  
  103.         wcSample.lpszClassName = TEXT("SampleWClass");
  104.         return (RegisterClass(&wcSample));
  105. }
  106. //
  107. //
  108. //   FUNCTION: InitInstance(HANDLE, int)
  109. //
  110. //   PURPOSE: Creates the main window.
  111. //
  112. //   COMMENTS: N/A
  113. //
  114. // 
  115. BOOL InitInstance(
  116. HANDLE          hInstance,
  117. int             nCmdShow) 
  118. {
  119. HWND hWndMain;
  120. hWndMain = CreateWindow(
  121.                 TEXT("SampleWClass"),
  122.                 TEXT("Wizard Sample"), 
  123. WS_OVERLAPPEDWINDOW,
  124. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  125. NULL,               
  126. NULL,               
  127. hInstance,          
  128. NULL);
  129. /* If window could not be created, return "failure" */
  130. if (!hWndMain)
  131. return (FALSE);
  132. /* Make the window visible; update its client area; and return "success" */
  133. ShowWindow(hWndMain, nCmdShow);
  134. UpdateWindow(hWndMain); 
  135. return (TRUE);      
  136. }
  137. //
  138. //   FUNCTION: MainWndProc(HWND, UINT, UINT, LONG)
  139. //
  140. //  PURPOSE:  Processes messages for the main window procedure 
  141. //
  142. //    MESSAGES:
  143. //
  144. // WM_CREATE - creates the main MLE for the window
  145. // WM_COMMAND - processes the menu commands for the application
  146. // WM_SIZE - sizes the MLE to fill the client area of the window
  147. // WM_DESTROY - posts a quit message and returns
  148. //
  149. LONG APIENTRY MainWndProc(
  150. HWND hWnd,                // window handle                   
  151. UINT message,             // type of message                 
  152. UINT wParam,              // additional information          
  153. LONG lParam)              // additional information          
  154. {
  155. switch (message) 
  156. {
  157.         case WM_CREATE:
  158. // Create an MLE for the file contents.
  159. hwndEdit = CreateWindow(
  160.                 TEXT("EDIT"),     
  161. NULL,       
  162.                 WS_CHILD | WS_VISIBLE | ES_WANTRETURN |
  163.                     ES_MULTILINE | ES_AUTOVSCROLL,
  164.                 0, 0, 0, 0, 
  165.                 hWnd,       
  166.                 (HMENU) ID_EDITCHILD, 
  167.                 (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),
  168.                 NULL);               
  169.             // Update the MLE. 
  170.             SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM) "Choose Performance Review Wizard from the Options menu.");
  171.             return 0;
  172.         case WM_SIZE:
  173.             // Make the edit control the size of the window's client area. 
  174.             MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);          
  175.             return 0;
  176.         case WM_COMMAND:
  177.             switch( LOWORD( wParam ))
  178. {
  179.                 case IDM_WIZARD:
  180.                     CreateWizard(hWnd, rvInfo.hInst);
  181. // Update the MLE. 
  182.     if (SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM) lpReview) != TRUE)
  183. MessageBox( hWnd, TEXT("Text not set!"), NULL, MB_OK);
  184. break;
  185. case IDM_EXIT:
  186. PostQuitMessage(0);
  187. break;
  188. case IDM_ABOUT:
  189. DialogBox(rvInfo.hInst, TEXT("AboutBox"), hWnd, (DLGPROC)About);
  190. break;
  191. default:
  192. return (DefWindowProc(hWnd, message, wParam, lParam));
  193. }
  194. break;
  195. case WM_DESTROY:                  /* message: window being destroyed */
  196. PostQuitMessage(0);
  197. break;
  198. default:
  199. return (DefWindowProc(hWnd, message, wParam, lParam));
  200. }
  201. return (0);
  202. }
  203. //
  204. //  FUNCTION: About(HWND, UINT, UINT, LONG)
  205. //
  206. //  PURPOSE:  Processes messages for the "About" dialog box 
  207. //
  208. //  MESSAGES:
  209. //
  210. // WM_INITDIALOG - initalizes the dialog box
  211. // WM_COMMAND - processes the input
  212. //
  213. BOOL APIENTRY About(
  214.    HWND hDlg,
  215. UINT message,
  216. UINT wParam,
  217. LONG lParam)
  218. {
  219. switch (message)
  220. {
  221.    case WM_INITDIALOG:
  222.   return TRUE;
  223.    case WM_COMMAND:              
  224.   if (LOWORD(wParam) == IDOK)
  225.  {
  226.   EndDialog(hDlg, TRUE);
  227.   return TRUE;
  228.   }
  229.   break;
  230. default:
  231. return FALSE;
  232. }
  233. }
  234. //
  235. //  FUNCTION: YourInfo(HWND, UINT, UINT, LONG)
  236. //
  237. //  PURPOSE:  Processes messages for "Your Information" page 
  238. //
  239. //  MESSAGES:
  240. //
  241. // WM_INITDIALOG - intializes the page
  242. // WM_NOTIFY - processes the notifications sent to the page
  243. //
  244. BOOL APIENTRY YourInfo(
  245. HWND hDlg,
  246. UINT message,
  247. UINT wParam,
  248. LONG lParam)
  249. {
  250. switch (message)
  251. {
  252. case WM_INITDIALOG:
  253. lstrcpy(rvInfo.pszName, TEXT(""));
  254. lstrcpy(rvInfo.pszTitle, TEXT(""));
  255. lstrcpy(rvInfo.pszProject, TEXT(""));
  256. lstrcpy(rvInfo.pszDepartment, TEXT(""));
  257. break;
  258. case WM_NOTIFY:
  259.      switch (((NMHDR FAR *) lParam)->code) 
  260.      {
  261.    case PSN_KILLACTIVE:
  262.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  263. return 1;
  264. break;
  265. case PSN_RESET:
  266. // reset to the original values
  267. lstrcpy(rvInfo.pszName, TEXT(""));
  268. lstrcpy(rvInfo.pszTitle,TEXT(""));
  269. lstrcpy(rvInfo.pszProject, TEXT(""));
  270. lstrcpy(rvInfo.pszDepartment, TEXT(""));
  271.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  272. break;
  273.   case PSN_SETACTIVE:
  274.      PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
  275. SendMessage(GetDlgItem(hDlg,0x3024 ), BM_SETSTYLE, (WPARAM)BS_PUSHBUTTON, MAKELONG(FALSE, 0));
  276. //SendMessage(GetParent(hDlg), DM_SETDEFID, (WPARAM)IDC_BUTTON1, 0);
  277. SendMessage(GetDlgItem(hDlg, IDE_NAME), WM_SETTEXT, 0, (LPARAM)rvInfo.pszName);
  278. SendMessage(GetDlgItem(hDlg, IDE_TITLE), WM_SETTEXT, 0, (LPARAM)rvInfo.pszTitle);
  279. SendMessage(GetDlgItem(hDlg, IDE_PROJECT), WM_SETTEXT, 0, (LPARAM)rvInfo.pszProject);
  280. SendMessage(GetDlgItem(hDlg, IDE_DEPARTMENT), WM_SETTEXT, 0, (LPARAM)rvInfo.pszDepartment);
  281. break;
  282.                 case PSN_WIZNEXT:
  283. // the Next button was pressed
  284.   SendDlgItemMessage(hDlg, IDE_NAME, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM) rvInfo.pszName);
  285. SendDlgItemMessage(hDlg, IDE_TITLE, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)rvInfo.pszTitle);
  286. SendDlgItemMessage(hDlg, IDE_PROJECT, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)rvInfo.pszProject);
  287. SendDlgItemMessage(hDlg, IDE_DEPARTMENT, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)rvInfo.pszDepartment);
  288.       break;
  289. default:
  290. return FALSE;
  291.      }
  292. break;
  293. default:
  294. return FALSE;
  295. }
  296. return TRUE;   
  297. }
  298. //
  299. //  FUNCTION: WorkHabits(HWND, UINT, UINT, LONG)
  300. //
  301. //  PURPOSE:  Processes messages for "Work Habits" page 
  302. //
  303. //  MESSAGES:
  304. //
  305. // WM_INITDIALOG - intializes the page
  306. // WM_NOTIFY - processes the notifications sent to the page
  307. // WM_COMMAND - saves the id of the choice selected
  308. //
  309. BOOL APIENTRY WorkHabits(
  310. HWND hDlg,
  311. UINT message,
  312. UINT wParam,
  313. LONG lParam)
  314. {
  315. switch (message)
  316. {
  317. case WM_INITDIALOG:
  318. rvInfo.iWorkHabits = 0;
  319. break;
  320. case WM_COMMAND:
  321. if (HIWORD(wParam) == BN_CLICKED)
  322. {
  323. rvInfo.iWorkHabits = LOWORD(wParam);
  324. CheckRadioButton( hDlg, IDC_WORKHAB1,IDC_WORKHAB4, LOWORD(wParam));
  325. }
  326. break;
  327. case WM_NOTIFY:
  328.      switch (((NMHDR FAR *) lParam)->code) 
  329.      {
  330.    case PSN_KILLACTIVE:
  331.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  332. return 1;
  333. break;
  334. case PSN_RESET:
  335. // rest to the original values
  336. rvInfo.iWorkHabits = 0;
  337.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  338. break;
  339.   case PSN_SETACTIVE:
  340.      PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT | PSWIZB_BACK);
  341. if (rvInfo.iWorkHabits)
  342. SendMessage(GetDlgItem(hDlg, rvInfo.iWorkHabits), BM_SETCHECK, 1, 0L);
  343. break;
  344.                 case PSN_WIZNEXT:
  345. // get the selected radio button
  346.       break;
  347. default:
  348. return FALSE;
  349.      }
  350. break;
  351. default:
  352. return FALSE;
  353. }
  354. return TRUE;   
  355. }
  356. //
  357. //  FUNCTION: TeamWork(HWND, UINT, UINT, LONG)
  358. //
  359. //  PURPOSE:  Processes messages for "Team Work" page 
  360. //
  361. //  MESSAGES:
  362. //
  363. // WM_INITDIALOG - intializes the page
  364. // WM_NOTIFY - processes the notifications sent to the page
  365. // WM_COMMAND - saves the id of the choice selected
  366. //
  367. //
  368. BOOL APIENTRY TeamWork(
  369. HWND hDlg,
  370. UINT message,
  371. UINT wParam,
  372. LONG lParam)
  373. {
  374. switch (message)
  375. {
  376. case WM_INITDIALOG:
  377. rvInfo.iTeamWork = 0;
  378. break;
  379. case WM_COMMAND:
  380. if (HIWORD(wParam) == BN_CLICKED)
  381. {
  382. rvInfo.iTeamWork = LOWORD(wParam);
  383. CheckRadioButton( hDlg, IDC_TEAMWORK1,IDC_TEAMWORK4, LOWORD(wParam));
  384. }
  385. break;
  386. case WM_NOTIFY:
  387.      switch (((NMHDR FAR *) lParam)->code) 
  388.      {
  389.    case PSN_KILLACTIVE:
  390.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  391. return 1;
  392. break;
  393. case PSN_RESET:
  394. // rest to the original values
  395. rvInfo.iTeamWork = 0;
  396.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  397. break;
  398.   case PSN_SETACTIVE:
  399. if (rvInfo.iTeamWork)
  400. SendMessage(GetDlgItem(hDlg, rvInfo.iTeamWork), BM_SETCHECK, 1, 0L);
  401. PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
  402. break;
  403.                 case PSN_WIZBACK:
  404.                     break;
  405.                 case PSN_WIZNEXT:
  406.                     break;
  407. default:
  408. return FALSE;
  409.      }
  410. break;
  411. default:
  412. return FALSE;
  413. }
  414. return TRUE;   
  415. }
  416. //
  417. //  FUNCTION: Reliability(HWND, UINT, UINT, LONG)
  418. //
  419. //  PURPOSE:  Processes messages for "Reliability" page 
  420. //
  421. //  MESSAGES:
  422. //
  423. // WM_INITDIALOG - intializes the page
  424. // WM_NOTIFY - processes the notifications sent to the page
  425. // WM_COMMAND - saves the id of the choice selected
  426. //
  427. BOOL APIENTRY Reliability(
  428. HWND hDlg,
  429. UINT message,
  430. UINT wParam,
  431. LONG lParam)
  432. {
  433. switch (message)
  434. {
  435. case WM_INITDIALOG:
  436. rvInfo.iReliability = 0;
  437. break;
  438. case WM_COMMAND:
  439. if (HIWORD(wParam) == BN_CLICKED)
  440. {
  441. rvInfo.iReliability = LOWORD(wParam);
  442. CheckRadioButton( hDlg, IDC_RELIABILITY1,IDC_RELIABILITY4, LOWORD(wParam));
  443. }
  444. break;
  445. case WM_NOTIFY:
  446.      switch (((NMHDR FAR *) lParam)->code) 
  447.      {
  448.    case PSN_KILLACTIVE:
  449.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  450. return 1;
  451. break;
  452. case PSN_RESET:
  453. // rest to the original values
  454. rvInfo.iReliability = 0;
  455.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  456. break;
  457.   case PSN_SETACTIVE:
  458. if (rvInfo.iReliability)
  459. SendMessage(GetDlgItem(hDlg, rvInfo.iReliability), BM_SETCHECK, 1, 0L);
  460. PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
  461. break;
  462.                 case PSN_WIZBACK:
  463.                     break;
  464.                 case PSN_WIZNEXT:
  465.                     break;
  466. default:
  467. return FALSE;
  468.      }
  469. break;
  470. default:
  471. return FALSE;
  472. }
  473. return TRUE;   
  474. }
  475. //
  476. //  FUNCTION: Goals(HWND, UINT, UINT, LONG)
  477. //
  478. //  PURPOSE:  Processes messages for "Goal Attainment" page 
  479. //
  480. //  MESSAGES:
  481. //
  482. // WM_INITDIALOG - intializes the page
  483. // WM_NOTIFY - processes the notifications sent to the page
  484. // WM_COMMAND - saves the id of the choice selected
  485. //
  486. BOOL APIENTRY Goals(
  487. HWND hDlg,
  488. UINT message,
  489. UINT wParam,
  490. LONG lParam)
  491. {
  492. switch (message)
  493. {
  494. case WM_INITDIALOG:
  495. rvInfo.iGoals = 0;
  496. break;
  497. case WM_COMMAND:
  498. if (HIWORD(wParam) == BN_CLICKED)
  499. {
  500. rvInfo.iGoals = LOWORD(wParam);
  501. CheckRadioButton( hDlg, IDC_GOALS1, IDC_GOALS4, LOWORD(wParam));
  502. }
  503. break;
  504. case WM_NOTIFY:
  505.      switch (((NMHDR FAR *) lParam)->code) 
  506.      {
  507.    case PSN_KILLACTIVE:
  508.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  509. return 1;
  510. break;
  511. case PSN_RESET:
  512. // rest to the original values
  513. rvInfo.iGoals = 0;
  514.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  515. break;
  516.   case PSN_SETACTIVE:
  517. if (rvInfo.iGoals)
  518. SendMessage(GetDlgItem(hDlg, rvInfo.iGoals), BM_SETCHECK, 1, 0L);
  519.   PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
  520. break;
  521.                 case PSN_WIZBACK:
  522.                     break;
  523.                 case PSN_WIZNEXT:
  524.                     break;
  525. default:
  526. return FALSE;
  527.      }
  528. break;
  529. default:
  530. return FALSE;
  531. }
  532. return TRUE;   
  533. }
  534. //
  535. //  FUNCTION: Adaptation(HWND, UINT, UINT, LONG)
  536. //
  537. //  PURPOSE:  Processes messages for "Addaptability to Change" page 
  538. //
  539. //  MESSAGES:
  540. //
  541. // WM_INITDIALOG - intializes the page
  542. // WM_NOTIFY - processes the notifications sent to the page
  543. // WM_COMMAND - saves the id of the choice selected
  544. //
  545. //
  546. BOOL APIENTRY Adaptation(
  547. HWND hDlg,
  548. UINT message,
  549. UINT wParam,
  550. LONG lParam)
  551. {
  552. switch (message)
  553. {
  554. case WM_INITDIALOG:
  555. rvInfo.iAdaptation = 0;
  556. break;
  557. case WM_COMMAND:
  558. if (HIWORD(wParam) == BN_CLICKED)
  559.             {
  560. rvInfo.iAdaptation = LOWORD(wParam);
  561. CheckRadioButton( hDlg, IDC_ADAPTATION1, IDC_ADAPTATION4, LOWORD(wParam));
  562. }
  563. break;
  564. case WM_NOTIFY:
  565.      switch (((NMHDR FAR *) lParam)->code) 
  566.      {
  567.    case PSN_KILLACTIVE:
  568.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  569. return 1;
  570. break;
  571. case PSN_RESET:
  572. // rest to the original values
  573. rvInfo.iAdaptation = 0;
  574.             SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  575. break;
  576.   case PSN_SETACTIVE:
  577. if (rvInfo.iAdaptation)
  578. SendMessage(GetDlgItem(hDlg, rvInfo.iAdaptation), BM_SETCHECK, 1, 0L);
  579. PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_FINISH);
  580. break;
  581.                 case PSN_WIZBACK:
  582.                     break;
  583.                 case PSN_WIZFINISH:
  584. GenerateReview(hDlg);
  585.                     break;
  586. default:
  587. return FALSE;
  588.      }
  589. break;
  590. default:
  591. return FALSE;
  592. }
  593. return TRUE;   
  594. }
  595. //
  596. //
  597. //  FUNCTION: FillInPropertyPage(PROPSHEETPAGE *, int, LPSTR, LPFN) 
  598. //
  599. //  PURPOSE: Fills in the given PROPSHEETPAGE structure 
  600. //
  601. //  COMMENTS:
  602. //
  603. //      This function fills in a PROPSHEETPAGE structure with the
  604. //      information the system needs to create the page.
  605. // 
  606. void FillInPropertyPage( PROPSHEETPAGE* psp, int idDlg, LPSTR pszProc, DLGPROC pfnDlgProc)
  607. {
  608.     psp->dwSize = sizeof(PROPSHEETPAGE);
  609.     psp->dwFlags = 0;
  610.     psp->hInstance = rvInfo.hInst;
  611.     psp->pszTemplate = MAKEINTRESOURCE(idDlg);
  612.     psp->pszIcon = NULL;
  613.     psp->pfnDlgProc = pfnDlgProc;
  614.     psp->pszTitle = pszProc;
  615.     psp->lParam = 0;
  616. }
  617. //
  618. //
  619. //    FUNCTION: CreateWizard(HWND)
  620. //
  621. //    PURPOSE: Create the Wizard control. 
  622. //
  623. //   COMMENTS:
  624. //
  625. //      This function creates the wizard property sheet.
  626. //
  627. int CreateWizard(HWND hwndOwner, HINSTANCE hInst)
  628. {
  629.     PROPSHEETPAGE psp[NUM_PAGES];
  630.     PROPSHEETHEADER psh;
  631. FillInPropertyPage( &psp[0], IDD_INFO, TEXT("Your Information"), YourInfo);
  632. FillInPropertyPage( &psp[1], IDD_WORKHABITS, TEXT("Work Habits"), WorkHabits);
  633. FillInPropertyPage( &psp[2], IDD_TEAMWORK, TEXT("Team Work"), TeamWork);
  634. FillInPropertyPage( &psp[3], IDD_RELIABILITY, TEXT("Reliability"), Reliability);
  635. FillInPropertyPage( &psp[4], IDD_GOALS, TEXT("Attainment of Goals"), Goals);
  636. FillInPropertyPage( &psp[5], IDD_ADAPTATION, TEXT("Adaptability to Change"), Adaptation);
  637.     
  638.     psh.dwSize = sizeof(PROPSHEETHEADER);
  639.     psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD | PSH_NOAPPLYNOW;
  640.     psh.hwndParent = hwndOwner;
  641.     psh.pszCaption = (LPSTR) TEXT("Review Wizard");
  642.     psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
  643.     psh.nStartPage = 0;
  644.     psh.ppsp = (LPCPROPSHEETPAGE) &psp;
  645.     return (PropertySheet(&psh));
  646. }
  647. //
  648. //
  649. //    FUNCTION: GenerateReview(void)
  650. //
  651. //    PURPOSE: Generate the review. 
  652. //
  653. //   COMMENTS:
  654. //
  655. //      This function generates the review based upon the answers
  656. //      given by the Wizard. The function translates lame reality into
  657. //      impressive-sounding manager-speak via a string table.
  658. //
  659. void GenerateReview( HWND hDlg )
  660. {
  661.     TCHAR lpBuf1[MAX_LINE];  // Buffers for the lines in the review.
  662.     TCHAR lpBuf2[MAX_LINE];
  663.     TCHAR lpBuf3[MAX_LINE];
  664.     TCHAR lpBuf4[MAX_LINE];
  665.     TCHAR lpBuf5[MAX_LINE];
  666. wsprintf(lpReview, TEXT("Name: %s%C%C%C%CTitle: %s%C%C%C%CDepartment: %s%C%C%C%CMain Project: %s%C%C%C%C"),
  667. rvInfo.pszName, 0x0d, 0x0a, 0x0d, 0x0a, 
  668. rvInfo.pszTitle, 0x0d, 0x0a, 0x0d, 0x0a, 
  669. rvInfo.pszDepartment, 0x0d, 0x0a, 0x0d, 0x0a, 
  670. rvInfo.pszProject,0x0d, 0x0a, 0x0d, 0x0a );
  671. // Add a line describing work habits
  672. if (LoadString(rvInfo.hInst, rvInfo.iWorkHabits, lpBuf1, sizeof(lpBuf1)) == 0)
  673. MessageBox(hDlg, TEXT("Error loading string!"), NULL, MB_OK);
  674. else
  675. lstrcat(lpReview, lpBuf1);
  676. // Add a line describing team work
  677. if (LoadString(rvInfo.hInst, rvInfo.iTeamWork, lpBuf2, sizeof(lpBuf2)) == 0)
  678. MessageBox(hDlg, TEXT("Error loading string!"), NULL, MB_OK);
  679. else
  680. lstrcat(lpReview, lpBuf2);
  681. // Add a line describing reliability
  682. if (LoadString(rvInfo.hInst, rvInfo.iReliability, lpBuf3, sizeof(lpBuf3)) == 0)
  683. MessageBox(hDlg, TEXT("Error loading string!"), NULL, MB_OK);
  684. else
  685. lstrcat(lpReview, lpBuf3);
  686. // Add a line describing goals
  687. if (LoadString(rvInfo.hInst, rvInfo.iGoals, lpBuf4, sizeof(lpBuf4)) == 0)
  688. MessageBox(hDlg, TEXT("Error loading string!"), NULL, MB_OK);
  689. else
  690. lstrcat(lpReview, lpBuf4);
  691. // Add a line describing adaptability
  692. if (LoadString(rvInfo.hInst, rvInfo.iAdaptation, lpBuf5, sizeof(lpBuf5)) == 0)
  693. MessageBox(hDlg, TEXT("Error loading string!"), NULL, MB_OK);
  694. else
  695. lstrcat(lpReview, lpBuf5);
  696.    
  697. }