SetRule.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:16k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // SetRule.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SetRule.h"
  5. #include "../ParamDlg/SetParamDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CSetRule property page
  13. #define SETRULE_MAINLEFT 228
  14. #define SETRULE_MAINTOP 23
  15. IMPLEMENT_DYNCREATE(CSetRule, CPropertyPageEx)
  16. CSetRule::CSetRule() : CPropertyPageEx(CSetRule::IDD)
  17. {
  18. //{{AFX_DATA_INIT(CSetRule)
  19. // NOTE: the ClassWizard will add member initialization here
  20. //}}AFX_DATA_INIT
  21. m_pParamDlg = NULL;
  22. m_pTechParameters = NULL;
  23. m_panSelectedTechs = NULL;
  24. m_dwButtonFlags = PSWIZB_BACK | PSWIZB_NEXT;
  25. m_bModified = FALSE;
  26. }
  27. CSetRule::CSetRule( UINT nIDCaption, UINT nIDTitle, UINT nIDSubTitle )
  28.  : CPropertyPageEx(CSetRule::IDD,nIDCaption, nIDTitle, nIDSubTitle)
  29. {
  30. m_pParamDlg = NULL;
  31. m_pTechParameters = NULL;
  32. m_panSelectedTechs = NULL;
  33. m_dwButtonFlags = PSWIZB_BACK | PSWIZB_NEXT;
  34. m_bModified = FALSE;
  35. }
  36. CSetRule::~CSetRule()
  37. {
  38. if( m_pParamDlg )
  39. {
  40. delete m_pParamDlg;
  41. m_pParamDlg = NULL;
  42. }
  43. }
  44. void CSetRule::SetTechParameters( CTechParameters * pParam, CSPDWordArray *panSelectedTechs )
  45. {
  46. ASSERT( pParam && panSelectedTechs );
  47. m_pTechParameters = pParam;
  48. m_panSelectedTechs = panSelectedTechs;
  49. m_anSelectedTechs.RemoveAll();
  50. m_anSelectedTechs.Copy( *panSelectedTechs );
  51. }
  52. BOOL CSetRule::InitTreeTechs( )
  53. {
  54. if( NULL == m_ImageList.GetSafeHandle() )
  55. {
  56. m_ImageList.Create(IDB_TECHSVIEW_ICONS, 16, 1, RGB(0,255,0));
  57. m_tree.SetImageList (&m_ImageList, TVSIL_NORMAL);
  58. }
  59. m_tree.DeleteAllItems();
  60. CString strClassLast;
  61. HTREEITEM hTechClass = NULL, hTech = NULL, hTechFirstSelected = NULL;
  62. UINT nTechUserCount = CTechUser::GetTechUserCount();
  63. for( UINT i=STT_MIN; i <= STT_MAX+nTechUserCount; i ++ )
  64. {
  65. UINT nTech = i;
  66. if( nTech > STT_MAX )
  67. nTech = i-STT_MAX-1+STT_USER_MIN;
  68. if( STT_PV == nTech || STT_DJ == nTech || STT_CW == nTech || STT_MIKE == nTech
  69. || STT_AD == nTech || STT_CI == nTech || STT_R == nTech || STT_DMI == nTech
  70. || STT_CDP == nTech )
  71. continue;
  72. CString strClass = AfxGetSTTClassName(nTech);
  73. if( strClass.GetLength() > 0 && 0 != strClass.Compare(strClassLast) )
  74. {
  75. hTechClass = m_tree.InsertItem(strClass,/*IMG_TECHCLASS*/0,/*IMG_TECHCLASS_SEL*/0);
  76. m_tree.SetItemData( hTechClass, 0 );
  77. m_anClassChecked.Add( 0 );
  78. }
  79. strClassLast = strClass;
  80. if( NULL == hTechClass )
  81. hTechClass = TVI_ROOT;
  82. CString strTechName = AfxGetSTTFullName(nTech);
  83. hTech = m_tree.InsertItem(strTechName,/*IMG_TECH*/0,/*IMG_TECH_SEL*/0,hTechClass);
  84. m_tree.SetItemData( hTech, nTech );
  85. for( int i=0; i<m_anSelectedTechs.GetSize(); i++ )
  86. {
  87. if( m_anSelectedTechs[i] == nTech )
  88. {
  89. m_tree.SetCheck( hTech, TRUE );
  90. if( NULL == hTechFirstSelected )
  91. hTechFirstSelected = hTech;
  92. }
  93. }
  94. }
  95. HTREEITEM hParent = m_tree.GetParentItem(hTechFirstSelected);
  96. if( NULL == hParent )
  97. hParent = m_tree.GetRootItem();
  98. m_tree.Expand( hParent, TVE_EXPAND );
  99. m_tree.Select( hTechFirstSelected, TVGN_CARET );
  100. ::PostMessage( GetSafeHwnd(), WM_USER_SETRULECLICKTREE, 0, 0 );
  101. return TRUE;
  102. }
  103. void CSetRule::GetCurrentSelectedTechs( CSPDWordArray & au )
  104. {
  105. au.RemoveAll();
  106. HTREEITEM hItem = m_tree.GetRootItem();
  107. while( hItem )
  108. {
  109. HTREEITEM hChild = m_tree.GetChildItem( hItem );
  110. while( hChild )
  111. {
  112. if( m_tree.GetCheck( hChild ) )
  113. {
  114. UINT nTech = m_tree.GetItemData(hChild);
  115. if( (nTech >= STT_MIN && nTech <= STT_MAX) || nTech >= STT_USER_MIN )
  116. au.Add( nTech );
  117. }
  118. hChild = m_tree.GetNextItem( hChild, TVGN_NEXT );
  119. }
  120. hItem = m_tree.GetNextItem( hItem, TVGN_NEXT );
  121. }
  122. }
  123. BOOL CSetRule::ValidData( )
  124. {
  125. if( m_pParamDlg && ::IsWindow(m_pParamDlg->GetSafeHwnd()) )
  126. {
  127. if( !m_pParamDlg->RefreshData( TRUE ) )
  128. {
  129. AfxMessageBox( IDS_SETPARAM_INVALID, MB_OK | MB_ICONINFORMATION );
  130. return FALSE;
  131. }
  132. }
  133. GetCurrentSelectedTechs( m_anSelectedTechs );
  134. if( m_anSelectedTechs.GetSize() <= 0 )
  135. {
  136. AfxMessageBox( IDS_SETRULE_NOSELECTED, MB_OK | MB_ICONINFORMATION );
  137. return FALSE;
  138. }
  139. return TRUE;
  140. }
  141. BOOL CSetRule::StoreData( )
  142. {
  143. GetCurrentSelectedTechs( m_anSelectedTechs );
  144. if( m_panSelectedTechs )
  145. m_bModified = (m_bModified || !m_panSelectedTechs->IsEqualTo(m_anSelectedTechs) );
  146. if( m_panSelectedTechs )
  147. m_panSelectedTechs->Copy( m_anSelectedTechs );
  148. if( m_pParamDlg && ::IsWindow(m_pParamDlg->GetSafeHwnd()) )
  149. {
  150. m_pParamDlg->OnCmdMsg( IDOK, 0, NULL, NULL );
  151. delete m_pParamDlg;
  152. m_pParamDlg = NULL;
  153. }
  154. return TRUE;
  155. }
  156. void CSetRule::DoDataExchange(CDataExchange* pDX)
  157. {
  158. CPropertyPageEx::DoDataExchange(pDX);
  159. //{{AFX_DATA_MAP(CSetRule)
  160. DDX_Control(pDX, IDC_TREE, m_tree);
  161. DDX_Control(pDX, IDC_ALLDEFAULT, m_btnAllDefault);
  162. //}}AFX_DATA_MAP
  163. }
  164. BEGIN_MESSAGE_MAP(CSetRule, CPropertyPageEx)
  165. //{{AFX_MSG_MAP(CSetRule)
  166. ON_BN_CLICKED(IDC_ALLDEFAULT, OnAlldefault)
  167. ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnSelchangedTree)
  168. ON_NOTIFY(TVN_SELCHANGING, IDC_TREE, OnSelchangingTree)
  169. ON_NOTIFY(NM_CLICK, IDC_TREE, OnClickTree)
  170. //}}AFX_MSG_MAP
  171. ON_MESSAGE(WM_USER_SETRULECLICKTREE, OnSetRuleClickTree)
  172. END_MESSAGE_MAP()
  173. /////////////////////////////////////////////////////////////////////////////
  174. // CSetRule message handlers
  175. BOOL CSetRule::OnInitDialog() 
  176. {
  177. CPropertyPageEx::OnInitDialog();
  178. InitTreeTechs( );
  179. UpdateData( FALSE );
  180. return TRUE;  // return TRUE unless you set the focus to a control
  181.               // EXCEPTION: OCX Property Pages should return FALSE
  182. }
  183. BOOL CSetRule::OnKillActive() 
  184. {
  185. // TODO: Add your specialized code here and/or call the base class
  186. UpdateData( );
  187. if( !ValidData( ) )
  188. return FALSE;
  189. StoreData( );
  190. return CPropertyPageEx::OnKillActive();
  191. }
  192. LRESULT CSetRule::OnWizardBack() 
  193. {
  194. // TODO: Add your specialized code here and/or call the base class
  195. UpdateData( );
  196. if( !ValidData( ) )
  197. return -1L;
  198. StoreData( );
  199. return CPropertyPageEx::OnWizardBack();
  200. }
  201. LRESULT CSetRule::OnWizardNext() 
  202. {
  203. // TODO: Add your specialized code here and/or call the base class
  204. UpdateData( );
  205. if( !ValidData( ) )
  206. return -1L;
  207. StoreData( );
  208. return CPropertyPageEx::OnWizardNext();
  209. }
  210. BOOL CSetRule::OnWizardFinish() 
  211. {
  212. // Add your specialized code here and/or call the base class
  213. UpdateData( );
  214. if( !ValidData( ) )
  215. return FALSE;
  216. StoreData( );
  217. return CPropertyPageEx::OnWizardFinish();
  218. }
  219. void CSetRule::OnOK() 
  220. {
  221. // TODO: Add your specialized code here and/or call the base class
  222. UpdateData( );
  223. if( !ValidData( ) )
  224. return;
  225. StoreData( );
  226. CPropertyPageEx::OnOK();
  227. }
  228. void CSetRule::OnAlldefault() 
  229. {
  230. // TODO: Add your control notification handler code here
  231. if( m_pTechParameters )
  232. {
  233. m_pTechParameters->SetDefaultParametersAll( );
  234. }
  235. if( m_pParamDlg && ::IsWindow(m_pParamDlg->GetSafeHwnd()) )
  236. {
  237. m_pParamDlg->RefreshData( FALSE );
  238. }
  239. }
  240. void CSetRule::OnSelchangingTree(NMHDR* pNMHDR, LRESULT* pResult) 
  241. {
  242. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  243. // TODO: Add your control notification handler code here
  244. if( m_pParamDlg && ::IsWindow(m_pParamDlg->GetSafeHwnd()) )
  245. {
  246. if( !m_pParamDlg->RefreshData( TRUE ) )
  247. {
  248. AfxMessageBox( IDS_SETPARAM_INVALID, MB_OK | MB_ICONINFORMATION );
  249. *pResult = -1;
  250. return;
  251. }
  252. m_pParamDlg->OnCmdMsg( IDOK, 0, NULL, NULL );
  253. delete m_pParamDlg;
  254. m_pParamDlg = NULL;
  255. }
  256. *pResult = 0;
  257. }
  258. void CSetRule::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) 
  259. {
  260. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  261. // TODO: Add your control notification handler code here
  262. if( NULL == m_pTechParameters )
  263. {
  264. *pResult = 0;
  265. return;
  266. }
  267. HTREEITEM hSelItem = m_tree.GetSelectedItem();
  268. if( hSelItem )
  269. {
  270. DWORD dwData = m_tree.GetItemData( hSelItem );
  271. if( !( (dwData >= STT_MIN && dwData <= STT_MAX) || dwData >= STT_USER_MIN ) )
  272. return;
  273. CTechParameters & param = (*m_pTechParameters);
  274. switch( dwData )
  275. {
  276. case STT_MA: m_pParamDlg = new CMADlg(NULL,&(param.ma)); m_pParamDlg->Create( CMADlg::IDD, this ); break;
  277. case STT_BBI: m_pParamDlg = new CBBIDlg(NULL,&(param.bbi)); m_pParamDlg->Create( CBBIDlg::IDD, this ); break;
  278. case STT_BOLL: m_pParamDlg = new CBOLLDlg(NULL,&(param.boll)); m_pParamDlg->Create( CBOLLDlg::IDD, this ); break;
  279. case STT_PV: m_pParamDlg = new CPVDlg(NULL,&(param.pv)); m_pParamDlg->Create( CPVDlg::IDD, this ); break;
  280. case STT_SAR: m_pParamDlg = new CSARDlg(NULL,&(param.sar)); m_pParamDlg->Create( CSARDlg::IDD, this ); break;
  281. case STT_DJ: m_pParamDlg = new CDJDlg(NULL,&(param.dj)); m_pParamDlg->Create( CDJDlg::IDD, this ); break;
  282. case STT_CW: m_pParamDlg = new CCWDlg(NULL,&(param.cw)); m_pParamDlg->Create( CCWDlg::IDD, this ); break;
  283. case STT_MACD: m_pParamDlg = new CMACDDlg(NULL,&(param.macd)); m_pParamDlg->Create( CMACDDlg::IDD, this ); break;
  284. case STT_MIKE: m_pParamDlg = new CMIKEDlg(NULL,&(param.mike)); m_pParamDlg->Create( CMIKEDlg::IDD, this ); break;
  285. case STT_PSY: m_pParamDlg = new CPSYDlg(NULL,&(param.psy)); m_pParamDlg->Create( CPSYDlg::IDD, this ); break;
  286. case STT_VOLUME: m_pParamDlg = new CVOLUMEDlg(NULL,&(param.volume)); m_pParamDlg->Create( CVOLUMEDlg::IDD, this ); break;
  287. case STT_NVI: m_pParamDlg = new CNVIDlg(NULL,&(param.nvi)); m_pParamDlg->Create( CNVIDlg::IDD, this ); break;
  288. case STT_PVI: m_pParamDlg = new CPVIDlg(NULL,&(param.pvi)); m_pParamDlg->Create( CPVIDlg::IDD, this ); break;
  289. case STT_VR: m_pParamDlg = new CVRDlg(NULL,&(param.vr)); m_pParamDlg->Create( CVRDlg::IDD, this ); break;
  290. case STT_VROC: m_pParamDlg = new CVROCDlg(NULL,&(param.vroc)); m_pParamDlg->Create( CVROCDlg::IDD, this ); break;
  291. case STT_OBV: m_pParamDlg = new COBVDlg(NULL,&(param.obv)); m_pParamDlg->Create( COBVDlg::IDD, this ); break;
  292. case STT_MOBV: m_pParamDlg = new CMOBVDlg(NULL,&(param.mobv)); m_pParamDlg->Create( CMOBVDlg::IDD, this ); break;
  293. case STT_MFI: m_pParamDlg = new CMFIDlg(NULL,&(param.mfi)); m_pParamDlg->Create( CMFIDlg::IDD, this ); break;
  294. case STT_VMACD: m_pParamDlg = new CVMACDDlg(NULL,&(param.vmacd)); m_pParamDlg->Create( CVMACDDlg::IDD, this ); break;
  295. case STT_WVAD: m_pParamDlg = new CWVADDlg(NULL,&(param.wvad)); m_pParamDlg->Create( CWVADDlg::IDD, this ); break;
  296. case STT_EMV: m_pParamDlg = new CEMVDlg(NULL,&(param.emv)); m_pParamDlg->Create( CEMVDlg::IDD, this ); break;
  297. case STT_VRSI: m_pParamDlg = new CVRSIDlg(NULL,&(param.vrsi)); m_pParamDlg->Create( CVRSIDlg::IDD, this ); break;
  298. case STT_NVRSI: m_pParamDlg = new CNVRSIDlg(NULL,&(param.nvrsi)); m_pParamDlg->Create( CNVRSIDlg::IDD, this ); break;
  299. case STT_AD: m_pParamDlg = new CADDlg(NULL,&(param.ad)); m_pParamDlg->Create( CADDlg::IDD, this ); break;
  300. case STT_CI: m_pParamDlg = new CCIDlg(NULL,&(param.ci)); m_pParamDlg->Create( CCIDlg::IDD, this ); break;
  301. case STT_KDJ: m_pParamDlg = new CKDJDlg(NULL,&(param.kdj)); m_pParamDlg->Create( CKDJDlg::IDD, this ); break;
  302. case STT_R: m_pParamDlg = new CRDlg(NULL,&(param.r)); m_pParamDlg->Create( CRDlg::IDD, this ); break;
  303. case STT_RSI: m_pParamDlg = new CRSIDlg(NULL,&(param.rsi)); m_pParamDlg->Create( CRSIDlg::IDD, this ); break;
  304. case STT_BIAS: m_pParamDlg = new CBIASDlg(NULL,&(param.bias)); m_pParamDlg->Create( CBIASDlg::IDD, this ); break;
  305. case STT_MTM: m_pParamDlg = new CMTMDlg(NULL,&(param.mtm)); m_pParamDlg->Create( CMTMDlg::IDD, this ); break;
  306. case STT_DMI: m_pParamDlg = new CDMIDlg(NULL,&(param.dmi)); m_pParamDlg->Create( CDMIDlg::IDD, this ); break;
  307. case STT_ROC: m_pParamDlg = new CROCDlg(NULL,&(param.roc)); m_pParamDlg->Create( CROCDlg::IDD, this ); break;
  308. case STT_CCI: m_pParamDlg = new CCCIDlg(NULL,&(param.cci)); m_pParamDlg->Create( CCCIDlg::IDD, this ); break;
  309. case STT_CV: m_pParamDlg = new CCVDlg(NULL,&(param.cv)); m_pParamDlg->Create( CCVDlg::IDD, this ); break;
  310. case STT_ARBR: m_pParamDlg = new CARBRDlg(NULL,&(param.arbr)); m_pParamDlg->Create( CARBRDlg::IDD, this ); break;
  311. case STT_CR: m_pParamDlg = new CCRDlg(NULL,&(param.cr)); m_pParamDlg->Create( CCRDlg::IDD, this ); break;
  312. case STT_OSC: m_pParamDlg = new COSCDlg(NULL,&(param.osc)); m_pParamDlg->Create( COSCDlg::IDD, this ); break;
  313. case STT_UOS: m_pParamDlg = new CUOSDlg(NULL,&(param.uos)); m_pParamDlg->Create( CUOSDlg::IDD, this ); break;
  314. case STT_MAOSC: m_pParamDlg = new CMAOSCDlg(NULL,&(param.maosc)); m_pParamDlg->Create( CMAOSCDlg::IDD, this ); break;
  315. case STT_36BIAS: m_pParamDlg = new C36BIASDlg(NULL,&(param.bias36)); m_pParamDlg->Create( C36BIASDlg::IDD, this ); break;
  316. case STT_DPO: m_pParamDlg = new CDPODlg(NULL,&(param.dpo)); m_pParamDlg->Create( CDPODlg::IDD, this ); break;
  317. case STT_KST: m_pParamDlg = new CKSTDlg(NULL,&(param.kst)); m_pParamDlg->Create( CKSTDlg::IDD, this ); break;
  318. case STT_REI: m_pParamDlg = new CREIDlg(NULL,&(param.rei)); m_pParamDlg->Create( CREIDlg::IDD, this ); break;
  319. case STT_DMKI: m_pParamDlg = new CDMKIDlg(NULL,&(param.dmki)); m_pParamDlg->Create( CDMKIDlg::IDD, this ); break;
  320. case STT_PCNT: m_pParamDlg = new CPCNTDlg(NULL,&(param.pcnt)); m_pParamDlg->Create( CPCNTDlg::IDD, this ); break;
  321. case STT_HLC: m_pParamDlg = new CHLCDlg(NULL,&(param.hlc)); m_pParamDlg->Create( CHLCDlg::IDD, this ); break;
  322. case STT_CDP: m_pParamDlg = new CCDPDlg(NULL,&(param.cdp)); m_pParamDlg->Create( CCDPDlg::IDD, this ); break;
  323. case STT_ASI: m_pParamDlg = new CASIDlg(NULL,&(param.asi)); m_pParamDlg->Create( CASIDlg::IDD, this ); break;
  324. case STT_ATR: m_pParamDlg = new CATRDlg(NULL,&(param.atr)); m_pParamDlg->Create( CATRDlg::IDD, this ); break;
  325. case STT_CYO: m_pParamDlg = new CCYODlg(NULL,&(param.cyo)); m_pParamDlg->Create( CCYODlg::IDD, this ); break;
  326. case STT_DCYO: m_pParamDlg = new CDCYODlg(NULL,&(param.dcyo)); m_pParamDlg->Create( CDCYODlg::IDD, this ); break;
  327. case STT_HSL: m_pParamDlg = new CHSLDlg(NULL,&(param.hsl)); m_pParamDlg->Create( CHSLDlg::IDD, this ); break;
  328. case STT_DPER: m_pParamDlg = new CDPERDlg(NULL,&(param.dper)); m_pParamDlg->Create( CDPERDlg::IDD, this ); break;
  329. default:
  330. ;
  331. }
  332. if( m_pParamDlg && ::IsWindow(m_pParamDlg->GetSafeHwnd()) )
  333. m_pParamDlg->SetWindowPos( NULL, SETRULE_MAINLEFT, SETRULE_MAINTOP, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOACTIVATE );
  334. m_tree.SetFocus();
  335. }
  336. *pResult = 0;
  337. }
  338. void CSetRule::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) 
  339. {
  340. ::PostMessage( GetSafeHwnd(), WM_USER_SETRULECLICKTREE, 0, 0 );
  341. *pResult = 0;
  342. }
  343. LRESULT CSetRule::OnSetRuleClickTree(WPARAM wParam, LPARAM lParam)
  344. {
  345. // Check Children same as Class Item
  346. int nCount = 0;
  347. HTREEITEM hItem = m_tree.GetRootItem();
  348. while( hItem )
  349. {
  350. UINT temp1 = m_anClassChecked[nCount];
  351. UINT temp2 = m_tree.GetCheck( hItem );
  352. if( m_anClassChecked[nCount] != (UINT)m_tree.GetCheck( hItem ) )
  353. {
  354. BOOL bChecked = m_tree.GetCheck( hItem );
  355. m_anClassChecked.SetAt( nCount, bChecked );
  356. HTREEITEM hChild = m_tree.GetChildItem( hItem );
  357. while( hChild )
  358. {
  359. m_tree.SetCheck( hChild, bChecked );
  360. hChild = m_tree.GetNextItem( hChild, TVGN_NEXT );
  361. }
  362. }
  363. hItem = m_tree.GetNextItem( hItem, TVGN_NEXT );
  364. nCount ++;
  365. }
  366. // Check Class Item Check according Children
  367. nCount = 0;
  368. hItem = m_tree.GetRootItem();
  369. while( hItem )
  370. {
  371. BOOL bCheckedAll = TRUE;
  372. HTREEITEM hChild = m_tree.GetChildItem( hItem );
  373. while( hChild )
  374. {
  375. if( !m_tree.GetCheck( hChild ) )
  376. bCheckedAll = FALSE;
  377. hChild = m_tree.GetNextItem( hChild, TVGN_NEXT );
  378. }
  379. m_anClassChecked.SetAt( nCount, bCheckedAll );
  380. m_tree.SetCheck( hItem, bCheckedAll );
  381. hItem = m_tree.GetNextItem( hItem, TVGN_NEXT );
  382. nCount ++;
  383. }
  384. return 0L;
  385. }
  386. BOOL CSetRule::PreTranslateMessage(MSG* pMsg) 
  387. {
  388. // TODO: Add your specialized code here and/or call the base class
  389. if( WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam )
  390. return TRUE;
  391. return CPropertyPageEx::PreTranslateMessage(pMsg);
  392. }
  393. BOOL CSetRule::OnSetActive() 
  394. {
  395. // TODO: Add your specialized code here and/or call the base class
  396. CPropertySheetEx * pSheet = DYNAMIC_DOWNCAST( CPropertySheetEx, GetParent() );
  397. if( pSheet )
  398. {
  399. pSheet->SetWizardButtons( m_dwButtonFlags );
  400. }
  401. return CPropertyPageEx::OnSetActive();
  402. }