Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

800 lines
26 KiB

  1. /*****************************************************************************
  2. *
  3. * (C) COPYRIGHT MICROSOFT CORPORATION, 2000
  4. *
  5. * TITLE: seltemp.cpp
  6. *
  7. * VERSION: 1.0
  8. *
  9. * AUTHOR: RickTu
  10. *
  11. * DATE: 10/18/00
  12. *
  13. * DESCRIPTION: Implements code for the template selection page of the
  14. * print photos wizard...
  15. *
  16. *****************************************************************************/
  17. #include <precomp.h>
  18. #pragma hdrstop
  19. #define TILE_TITLE 0
  20. #define TILE_DESCRIPTION 1
  21. #define TILE_MAX 1
  22. #define LVS_EX_FLAGS (LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT)
  23. const UINT c_auTileColumns[] = {TILE_TITLE, TILE_DESCRIPTION};
  24. const UINT c_auTileSubItems[] = {TILE_DESCRIPTION};
  25. /*****************************************************************************
  26. CSelectTemplatePage -- constructor/desctructor
  27. <Notes>
  28. *****************************************************************************/
  29. CSelectTemplatePage::CSelectTemplatePage( CWizardInfoBlob * pBlob )
  30. : _hDlg(NULL),
  31. _pPreview(NULL),
  32. _hPrevWnd(NULL),
  33. _iFirstItemInListViewIndex(-1),
  34. _bAlreadySetSelection(FALSE),
  35. _bListviewIsDirty(TRUE),
  36. _pWizInfo(pBlob)
  37. {
  38. WIA_PUSH_FUNCTION_MASK((TRACE_PAGE_SEL_TEMPLATE, TEXT("CSelectTemplatePage::CSelectTemplatePage()")));
  39. if (_pWizInfo)
  40. {
  41. _pWizInfo->AddRef();
  42. }
  43. }
  44. CSelectTemplatePage::~CSelectTemplatePage()
  45. {
  46. WIA_PUSH_FUNCTION_MASK((TRACE_PAGE_SEL_TEMPLATE, TEXT("CSelectTemplatePage::~CSelectTemplatePage()")));
  47. if (_pPreview)
  48. {
  49. delete _pPreview;
  50. _pPreview = NULL;
  51. }
  52. if (_pWizInfo)
  53. {
  54. _pWizInfo->Release();
  55. _pWizInfo = NULL;
  56. }
  57. }
  58. /*****************************************************************************
  59. CSelectTemplatePage::_PopulateTemplateListView()
  60. Populates list of templates w/template info...
  61. *****************************************************************************/
  62. VOID CSelectTemplatePage::_PopulateTemplateListView()
  63. {
  64. WIA_PUSH_FUNCTION_MASK((TRACE_PAGE_SEL_TEMPLATE, TEXT("CSelectTemplatePage::_PopulateTemplateListView()")));
  65. if (!_pWizInfo)
  66. {
  67. WIA_ERROR((TEXT("_PopulateTemplateListView: FATAL: _pWizInfo is NULL, exiting early")));
  68. return;
  69. }
  70. HWND hwndList = GetDlgItem( _hDlg, IDC_TEMPLATES );
  71. if (hwndList)
  72. {
  73. HIMAGELIST hImageList = ListView_GetImageList(hwndList, LVSIL_NORMAL);
  74. if (hImageList)
  75. {
  76. //
  77. // Loop through templates and create list view items for each one...
  78. //
  79. SIZE size = { 48,62 };
  80. INT nImageListIndex = -1;
  81. INT iCount = _pWizInfo->CountOfTemplates();
  82. CTemplateInfo * pTemplateInfo;
  83. LONGLONG liTemplateWidth = 0;
  84. LONGLONG liTemplateHeight = 0;
  85. LONGLONG liPrintAreaWidth = 0;
  86. LONGLONG liPrintAreaHeight = 0;
  87. LONGLONG liTemplateArea = 0;
  88. LONGLONG liPrintArea = 0;
  89. CSimpleString strTitle, strDesc;
  90. for (INT i = 0; i < iCount; i++)
  91. {
  92. pTemplateInfo = NULL;
  93. if (SUCCEEDED(_pWizInfo->GetTemplateByIndex(i,&pTemplateInfo)) && pTemplateInfo)
  94. {
  95. HBITMAP hBmp = NULL;
  96. if (SUCCEEDED(_pWizInfo->TemplateGetPreviewBitmap(i, size, &hBmp)) && hBmp)
  97. {
  98. //
  99. // If the template is > 10% larger than printable
  100. // area of printer, then don't add it to the listview
  101. // as a choice as it won't print out very good anyway...
  102. //
  103. RENDER_DIMENSIONS dim = {0};
  104. RECT rc = {0};
  105. _pWizInfo->_SetupDimensionsForPrinting( NULL, pTemplateInfo, &dim );
  106. if (SUCCEEDED(pTemplateInfo->GetNominalRectForImageableArea( &rc )))
  107. {
  108. if ( (rc.left != -1) &&
  109. (rc.top != -1) &&
  110. (rc.right != -1) &&
  111. (rc.bottom != -1)
  112. )
  113. {
  114. liTemplateWidth = (LONGLONG)(rc.right - rc.left);
  115. liTemplateHeight = (LONGLONG)(rc.bottom - rc.top);
  116. liPrintAreaWidth = (LONGLONG)dim.NominalDevicePrintArea.cx;
  117. liPrintAreaHeight = (LONGLONG)dim.NominalDevicePrintArea.cy;
  118. liTemplateArea = liTemplateWidth * liTemplateHeight;
  119. liPrintArea = liPrintAreaWidth * liPrintAreaHeight;
  120. WIA_TRACE((TEXT("_PopulateTemplateListView: Template %d area is (%ld x %ld) = %ld"),i,liTemplateWidth,liTemplateHeight,liTemplateArea));
  121. WIA_TRACE((TEXT("_PopulateTemplateListView: Print area is (%ld x %ld) = %ld"),liPrintAreaWidth,liPrintAreaHeight,liPrintArea));
  122. if (liTemplateArea)
  123. {
  124. LONGLONG liRatio = (liPrintArea * 100) / liTemplateArea;
  125. if (liRatio < 85)
  126. {
  127. WIA_TRACE((TEXT("_PopulateTemplateListView: skipping template %d"),i));
  128. continue;
  129. }
  130. }
  131. }
  132. }
  133. WIA_TRACE((TEXT("_PopulateTemplateListView: adding template %d"),i));
  134. //
  135. // If we're adding this template, then get the title
  136. // and description...
  137. //
  138. if (SUCCEEDED(pTemplateInfo->GetTitle(&strTitle)) &&
  139. SUCCEEDED(pTemplateInfo->GetDescription(&strDesc)))
  140. {
  141. nImageListIndex = ImageList_Add(hImageList, hBmp, NULL);
  142. LV_ITEM lvi = { 0 };
  143. lvi.mask = LVIF_TEXT|LVIF_PARAM;
  144. lvi.lParam = (LPARAM)i;
  145. lvi.iItem = ListView_GetItemCount(hwndList); // append
  146. if (nImageListIndex >= 0)
  147. {
  148. lvi.mask |= LVIF_IMAGE;
  149. lvi.iImage = nImageListIndex;
  150. }
  151. #ifdef TEMPLATE_GROUPING
  152. CSimpleString strGroupName;
  153. if (SUCCEEDED(pTemplateInfo->GetGroup(&strGroupName)))
  154. {
  155. //
  156. // Get the group ID for this group name...
  157. //
  158. INT iGroupId = _GroupList.GetGroupId( strGroupName, hwndList );
  159. WIA_TRACE((TEXT("_PopulateTemplateListView: _GroupList.GetGroupId( %s ) returned %d"),strGroupName.String(),iGroupId));
  160. //
  161. // Set the item to be in the group...
  162. //
  163. if (-1 != iGroupId)
  164. {
  165. lvi.mask |= LVIF_GROUPID;
  166. lvi.iGroupId = iGroupId;
  167. }
  168. }
  169. #endif
  170. lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(strTitle));
  171. lvi.iItem = ListView_InsertItem(hwndList, &lvi);
  172. if (_iFirstItemInListViewIndex == -1)
  173. {
  174. _iFirstItemInListViewIndex = lvi.iItem;
  175. }
  176. lvi.iSubItem = 1;
  177. lvi.mask = LVIF_TEXT;
  178. lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(strDesc));
  179. ListView_SetItem(hwndList, &lvi);
  180. if (lvi.iItem != -1)
  181. {
  182. LVTILEINFO lvti;
  183. lvti.cbSize = sizeof(LVTILEINFO);
  184. lvti.iItem = lvi.iItem;
  185. lvti.cColumns = ARRAYSIZE(c_auTileSubItems);
  186. lvti.puColumns = (UINT*)c_auTileSubItems;
  187. ListView_SetTileInfo(hwndList, &lvti);
  188. }
  189. }
  190. DeleteObject( (HGDIOBJ)hBmp );
  191. }
  192. }
  193. }
  194. }
  195. _bListviewIsDirty = FALSE;
  196. }
  197. }
  198. /*****************************************************************************
  199. CSelectTemplatePage::_OnInitDialog
  200. Handles WM_INITDIALOG chores for this page...
  201. *****************************************************************************/
  202. LRESULT CSelectTemplatePage::_OnInitDialog()
  203. {
  204. WIA_PUSH_FUNCTION_MASK((TRACE_PAGE_SEL_TEMPLATE, TEXT("CSelectTemplatePage::_OnInitDialog()")));
  205. if (!_pWizInfo)
  206. {
  207. WIA_ERROR((TEXT("FATAL: _pWizInfo is NULL, exiting early")));
  208. return FALSE;
  209. }
  210. //
  211. // Set the text size of the edit control to only be 2 characters
  212. //
  213. SendDlgItemMessage( _hDlg, IDC_NUM_PICS, EM_LIMITTEXT, 2, 0 );
  214. //
  215. // Limit outselves to number only...and inform the user if they
  216. // press something other than numbers...
  217. //
  218. LIMITINPUT li = {0};
  219. li.cbSize = sizeof(li);
  220. li.dwMask = LIM_FLAGS | LIM_FILTER | LIM_MESSAGE | LIM_HINST;
  221. li.dwFlags = LIF_HIDETIPONVALID | LIF_CATEGORYFILTER;
  222. li.hinst = g_hInst;
  223. li.pszMessage = MAKEINTRESOURCE(IDS_ONLY_NUMBERS_TOOLTIP);
  224. li.pszFilter = (LPWSTR)(LICF_DIGIT | LICF_CNTRL | LICF_SPACE);
  225. SHLimitInputEditWithFlags( GetDlgItem( _hDlg, IDC_NUM_PICS ), &li );
  226. //
  227. // Set the base for the up/down control to base 10
  228. //
  229. SendDlgItemMessage( _hDlg, IDC_SPIN_PICS, UDM_SETBASE, (WPARAM)10, 0 );
  230. //
  231. // Set the range to be 1 - 99
  232. //
  233. SendDlgItemMessage( _hDlg, IDC_SPIN_PICS, UDM_SETRANGE, 0, (LPARAM)MAKELONG(MAX_NUMBER_OF_COPIES_ALLOWED,1) );
  234. //
  235. // Set the number to 1 to begin with...
  236. //
  237. SendDlgItemMessage( _hDlg, IDC_SPIN_PICS, UDM_SETPOS, 0, (LPARAM)MAKELONG(1,0) );
  238. //
  239. // Create preview window...
  240. //
  241. RECT rcWnd = {0};
  242. HWND hwnd = GetDlgItem( _hDlg, IDC_TEMPLATE_PREVIEW );
  243. if (hwnd)
  244. {
  245. GetClientRect( hwnd, &rcWnd );
  246. MapWindowPoints( hwnd, _hDlg, (LPPOINT)&rcWnd, 2 );
  247. }
  248. CPreviewWindow::s_RegisterClass(g_hInst);
  249. _pPreview = new CPreviewWindow( _pWizInfo );
  250. _pWizInfo->SetPreviewWindowClass( _pPreview );
  251. WIA_TRACE((TEXT("g_cPreviewClassWnd = 0x%x"),g_cPreviewClassWnd));
  252. WIA_TRACE((TEXT("Calling CreateWindowEx( x=%d, y=%d, w=%d, h=%d, hWndParent=0x%x, hInstance=0x%x"),rcWnd.left,rcWnd.top,rcWnd.right-rcWnd.left,rcWnd.bottom-rcWnd.top,_hDlg,g_hInst));
  253. _hPrevWnd = CreateWindowEx( WS_EX_NOPARENTNOTIFY,
  254. (LPCTSTR)g_cPreviewClassWnd,
  255. TEXT("PhotoPrintPreviewWindow"),
  256. WS_CHILD | WS_VISIBLE,
  257. rcWnd.left,
  258. rcWnd.top,
  259. rcWnd.right - rcWnd.left,
  260. rcWnd.bottom - rcWnd.top,
  261. _hDlg,
  262. (HMENU)IDC_PREVIEW_WINDOW,
  263. g_hInst,
  264. (LPVOID)_pPreview
  265. );
  266. if (_hPrevWnd)
  267. {
  268. WIA_TRACE((TEXT("Preview window created, hwnd = 0x%x"),_hPrevWnd));
  269. _pWizInfo->SetPreviewWnd( _hPrevWnd );
  270. }
  271. else
  272. {
  273. WIA_ERROR((TEXT("Couldn't create the preview window! (GLE = %d)"),GetLastError()));
  274. }
  275. //
  276. // Initialize Template Listview control
  277. //
  278. HWND hwndList = GetDlgItem(_hDlg, IDC_TEMPLATES);
  279. if (hwndList)
  280. {
  281. //
  282. // Hide the labels and use border selection
  283. //
  284. ListView_SetExtendedListViewStyleEx( hwndList,LVS_EX_FLAGS, LVS_EX_FLAGS);
  285. for (int i=0; i<ARRAYSIZE(c_auTileColumns); i++)
  286. {
  287. LV_COLUMN col;
  288. col.mask = LVCF_SUBITEM;
  289. col.iSubItem = c_auTileColumns[i];
  290. ListView_InsertColumn(hwndList, i, &col);
  291. }
  292. //
  293. // Set up tile view for this list view..
  294. //
  295. LVTILEVIEWINFO tvi = {0};
  296. tvi.cbSize = sizeof(tvi);
  297. tvi.dwMask = LVTVIM_TILESIZE | LVTVIM_COLUMNS;
  298. tvi.dwFlags = LVTVIF_AUTOSIZE;
  299. tvi.cLines = TILE_MAX;
  300. ListView_SetTileViewInfo(hwndList, &tvi);
  301. //
  302. // Switch to tile view
  303. //
  304. ListView_SetView(hwndList, LV_VIEW_TILE);
  305. #ifdef TEMPLATE_GROUPING
  306. ListView_EnableGroupView(hwndList, TRUE);
  307. #endif
  308. //
  309. // Turn on groups
  310. //
  311. //
  312. // Get the number of templates
  313. //
  314. LONG nItemCount = _pWizInfo->CountOfTemplates();
  315. WIA_TRACE((TEXT("There are %d templates to add to the listview"),nItemCount));
  316. //
  317. // Set the item count, to minimize recomputing the list size
  318. //
  319. ListView_SetItemCount( hwndList, nItemCount );
  320. //
  321. // Create the image list for the listview...
  322. //
  323. HIMAGELIST hImageList = ImageList_Create( _pWizInfo->_sizeTemplatePreview.cx, _pWizInfo->_sizeTemplatePreview.cy, ILC_COLOR24|ILC_MIRROR, nItemCount, 50 );
  324. if (hImageList)
  325. {
  326. //
  327. // Set the image list
  328. //
  329. ListView_SetImageList( hwndList, hImageList, LVSIL_NORMAL );
  330. }
  331. else
  332. {
  333. WIA_ERROR((TEXT("FATAL: Creation of the imagelist failed!")));
  334. return FALSE;
  335. }
  336. #ifdef TEMPLATE_GROUPING
  337. //
  338. // Add only the groups which have more than one item in them...
  339. //
  340. INT iCount = _pWizInfo->CountOfTemplates();
  341. CSimpleString strGroupName;
  342. CTemplateInfo * pTemplateInfo;
  343. for (INT i=0; i < iCount; i++)
  344. {
  345. pTemplateInfo = NULL;
  346. if (SUCCEEDED(_pWizInfo->GetTemplateByIndex( i, &pTemplateInfo )) && pTemplateInfo)
  347. {
  348. if (SUCCEEDED(pTemplateInfo->GetGroup( &strGroupName )))
  349. {
  350. INT iRes;
  351. iRes = _GroupList.GetGroupId( strGroupName, hwndList );
  352. WIA_TRACE((TEXT("_GroupList.GetGroupId( %s ) return %d"),strGroupName.String(),iRes));
  353. if (-1 == iRes)
  354. {
  355. WIA_TRACE((TEXT("Adding '%s' via _GroupList.Add"),strGroupName.String()));
  356. _GroupList.Add( hwndList, strGroupName );
  357. }
  358. }
  359. }
  360. }
  361. #endif
  362. }
  363. else
  364. {
  365. WIA_ERROR((TEXT("FATAL: Couldn't get listview")));
  366. }
  367. return TRUE;
  368. }
  369. /*****************************************************************************
  370. CSelectTemplatePage::_OnDestroy
  371. Handle WM_DESTROY for this wizard page...
  372. *****************************************************************************/
  373. LRESULT CSelectTemplatePage::_OnDestroy()
  374. {
  375. WIA_PUSH_FUNCTION_MASK((TRACE_PAGE_SEL_TEMPLATE, TEXT("CSelectTemplatePage::_OnDestroy()")));
  376. //
  377. // Nuke the imagelist
  378. //
  379. HIMAGELIST hImageList = ListView_SetImageList( GetDlgItem( _hDlg, IDC_TEMPLATES ), NULL, LVSIL_NORMAL );
  380. if (hImageList)
  381. {
  382. ImageList_Destroy(hImageList);
  383. }
  384. return 0;
  385. }
  386. /*****************************************************************************
  387. SelectTemplateTimerProc
  388. Called when the timer expires for typing in the edit box
  389. *****************************************************************************/
  390. VOID CALLBACK SelectTemplateTimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime )
  391. {
  392. WIA_PUSH_FUNCTION_MASK((TRACE_PAGE_SEL_TEMPLATE, TEXT("SelectTemplateTimerProc()")));
  393. if (idEvent == STP_TIMER_ID)
  394. {
  395. //
  396. // Kill the timer, and post a message to have the copies made and
  397. // the template previews updated...
  398. //
  399. KillTimer( hwnd, STP_TIMER_ID );
  400. PostMessage( hwnd, STP_MSG_DO_READ_NUM_PICS, 0, 0 );
  401. }
  402. }
  403. /*****************************************************************************
  404. CSelectTemplatePage::_OnCommand
  405. Handle WM_COMMAND messages sent to this page...
  406. *****************************************************************************/
  407. LRESULT CSelectTemplatePage::_OnCommand( WPARAM wParam, LPARAM lParam )
  408. {
  409. WIA_PUSH_FUNCTION_MASK((TRACE_PAGE_SEL_TEMPLATE, TEXT("CSelectTemplatePage::_OnCommand()")));
  410. if ((wParam !=0) && (wParam !=1))
  411. {
  412. WORD wCode = HIWORD(wParam);
  413. WORD wId = LOWORD(wParam);
  414. switch (wId)
  415. {
  416. case IDC_NUM_PICS:
  417. if (wCode == EN_CHANGE)
  418. {
  419. //
  420. // User changed the number of times to print each
  421. // photo. But let's start (or reset) a timer so that
  422. // we can catch multiple keystrokes and not regenerate
  423. // on each one...
  424. //
  425. SetTimer( _hDlg, STP_TIMER_ID, COPIES_TIMER_TIMEOUT_VALUE, SelectTemplateTimerProc );
  426. }
  427. break;
  428. }
  429. }
  430. return 0;
  431. }
  432. /*****************************************************************************
  433. CSelectTemplatePage::_OnNotify
  434. Handles WM_NOTIFY for this page...
  435. *****************************************************************************/
  436. LRESULT CSelectTemplatePage::_OnNotify( WPARAM wParam, LPARAM lParam )
  437. {
  438. WIA_PUSH_FUNCTION_MASK((TRACE_DLGPROC, TEXT("CSelectTemplatePage::_OnNotify()")));
  439. LONG_PTR lpRes = 0;
  440. LPNMHDR pnmh = (LPNMHDR)lParam;
  441. if (pnmh)
  442. {
  443. switch (pnmh->code)
  444. {
  445. case LVN_ITEMCHANGED:
  446. {
  447. WIA_TRACE((TEXT("CSelectTemplatePage: got LVN_ITEMCHANGED")));
  448. LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
  449. if( !(pnmv->uOldState & LVIS_SELECTED) && (pnmv->uNewState & LVIS_SELECTED) )
  450. {
  451. // update the preview picture
  452. HWND hwndList = GetDlgItem(_hDlg, IDC_TEMPLATES);
  453. if( hwndList && pnmv && 0 == pnmv->iSubItem )
  454. {
  455. _pWizInfo->SetCurrentTemplateIndex( (INT)pnmv->lParam );
  456. if (_hPrevWnd)
  457. {
  458. PostMessage( _hPrevWnd, PW_SETNEWTEMPLATE, (WPARAM)pnmv->lParam, 0 );
  459. }
  460. }
  461. }
  462. break;
  463. }
  464. case PSN_SETACTIVE:
  465. {
  466. WIA_TRACE((TEXT("CSelectTemplatePage: got PSN_SETACTIVE")));
  467. PropSheet_SetWizButtons( GetParent(_hDlg), PSWIZB_BACK | PSWIZB_NEXT );
  468. //
  469. // If the listview is dirty, then remove all entries and re-populate...
  470. //
  471. if (_bListviewIsDirty)
  472. {
  473. ListView_DeleteAllItems( GetDlgItem( _hDlg, IDC_TEMPLATES ) );
  474. _iFirstItemInListViewIndex = -1;
  475. _bAlreadySetSelection = FALSE;
  476. _PopulateTemplateListView();
  477. }
  478. RENDER_DIMENSIONS Dim;
  479. CTemplateInfo * pTemplateInfo = NULL;
  480. //
  481. // Just use first template in the list, doesn't matter for this...
  482. //
  483. if (SUCCEEDED(_pWizInfo->GetTemplateByIndex( 0, &pTemplateInfo )) && pTemplateInfo)
  484. {
  485. //
  486. // size the preview window according to the printer layout...
  487. //
  488. _pWizInfo->_SetupDimensionsForScreen( pTemplateInfo, _hPrevWnd, &Dim );
  489. }
  490. //
  491. // Invalidate the previews...
  492. //
  493. if (_pWizInfo)
  494. {
  495. if (_pWizInfo->GetPreviewsAreDirty())
  496. {
  497. _pWizInfo->InvalidateAllPreviews();
  498. _pWizInfo->SetPreviewsAreDirty(FALSE);
  499. }
  500. }
  501. //
  502. // Now that we've set up the window, generate the "still working" bitmap...
  503. //
  504. _pWizInfo->GenerateStillWorkingBitmap();
  505. //
  506. // pick the template to view...
  507. //
  508. PostMessage( _hDlg, STP_MSG_DO_SET_ACTIVE, 0, 0 );
  509. }
  510. lpRes = 0;
  511. break;
  512. case PSN_WIZNEXT:
  513. WIA_TRACE((TEXT("CSelectTemplatePage: got PSN_WIZNEXT")));
  514. //
  515. // Read and fix the number of copies if needed. We do
  516. // a sendmessage here to make sure that this completes
  517. // before we switch pages...
  518. //
  519. SendMessage(_hDlg,STP_MSG_DO_READ_NUM_PICS,0,0);
  520. lpRes = IDD_PRINT_PROGRESS;
  521. break;
  522. case PSN_WIZBACK:
  523. WIA_TRACE((TEXT("CSelectTemplatePage: got PSN_WIZBACK")));
  524. lpRes = IDD_PRINTING_OPTIONS;
  525. _bListviewIsDirty = TRUE;
  526. break;
  527. case PSN_QUERYCANCEL:
  528. WIA_TRACE((TEXT("CSelectTemplatePage: got PSN_QUERYCANCEL")));
  529. if (_pWizInfo)
  530. {
  531. lpRes = _pWizInfo->UserPressedCancel();
  532. }
  533. break;
  534. }
  535. }
  536. SetWindowLongPtr( _hDlg, DWLP_MSGRESULT, lpRes );
  537. return TRUE;
  538. }
  539. /*****************************************************************************
  540. CSelectTemplatePage::DoHandleMessage
  541. Hanlder for messages sent to this page...
  542. *****************************************************************************/
  543. INT_PTR CSelectTemplatePage::DoHandleMessage( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
  544. {
  545. WIA_PUSH_FUNCTION_MASK((TRACE_DLGPROC, TEXT("CSelectTemplatePage::DoHandleMessage( uMsg = 0x%x, wParam = 0x%x, lParam = 0x%x )"),uMsg,wParam,lParam));
  546. switch ( uMsg )
  547. {
  548. case WM_INITDIALOG:
  549. _hDlg = hDlg;
  550. return _OnInitDialog();
  551. case WM_DESTROY:
  552. return _OnDestroy();
  553. case WM_COMMAND:
  554. return _OnCommand( wParam, lParam );
  555. case WM_NOTIFY:
  556. return _OnNotify( wParam, lParam );
  557. case WM_SYSCOLORCHANGE:
  558. case WM_SETTINGCHANGE:
  559. //
  560. // Forward these messages to the listview
  561. //
  562. SendDlgItemMessage( _hDlg, IDC_TEMPLATES, uMsg, wParam, lParam );
  563. break;
  564. case STP_MSG_DO_SET_ACTIVE:
  565. //
  566. // If selection has never been set, set it to the first item...
  567. //
  568. if ((_iFirstItemInListViewIndex != -1) && (!_bAlreadySetSelection))
  569. {
  570. ListView_SetItemState( GetDlgItem(_hDlg,IDC_TEMPLATES),
  571. _iFirstItemInListViewIndex,
  572. LVIS_SELECTED, LVIS_SELECTED
  573. );
  574. _bAlreadySetSelection = TRUE;
  575. }
  576. break;
  577. case STP_MSG_DO_READ_NUM_PICS:
  578. {
  579. //
  580. // Read the number of copies...
  581. //
  582. BOOL bSuccess = FALSE;
  583. BOOL bUpdate = FALSE;
  584. UINT uCopies = GetDlgItemInt( _hDlg, IDC_NUM_PICS, &bSuccess, FALSE );
  585. if (!bSuccess)
  586. {
  587. uCopies = 1;
  588. bUpdate = TRUE;
  589. }
  590. if (uCopies == 0)
  591. {
  592. uCopies = 1;
  593. bUpdate = TRUE;
  594. }
  595. if (uCopies > MAX_NUMBER_OF_COPIES_ALLOWED)
  596. {
  597. uCopies = MAX_NUMBER_OF_COPIES_ALLOWED;
  598. bUpdate = TRUE;
  599. }
  600. if (bUpdate)
  601. {
  602. SendDlgItemMessage( _hDlg, IDC_NUM_PICS, WM_CHAR, (WPARAM)TEXT("a"), 0 );
  603. SetDlgItemInt( _hDlg, IDC_NUM_PICS, uCopies, FALSE );
  604. }
  605. if (_pWizInfo)
  606. {
  607. _pWizInfo->SetNumberOfCopies( uCopies );
  608. }
  609. }
  610. break;
  611. }
  612. return FALSE;
  613. }