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

对话框与窗口

开发平台:

Visual C++

  1. // OptionsDialog.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "OptionsDialog.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // COptionsDialog dialog
  12. COptionsDialog::COptionsDialog(CWnd* pParent /*=NULL*/)
  13. : CDialog(COptionsDialog::IDD, pParent)
  14. {
  15. //{{AFX_DATA_INIT(COptionsDialog)
  16. // NOTE: the ClassWizard will add member initialization here
  17. //}}AFX_DATA_INIT
  18. m_nActive = 0;
  19. }
  20. void COptionsDialog::DoDataExchange(CDataExchange* pDX)
  21. {
  22. CDialog::DoDataExchange(pDX);
  23. //{{AFX_DATA_MAP(COptionsDialog)
  24. // NOTE: the ClassWizard will add DDX and DDV calls here
  25. //}}AFX_DATA_MAP
  26. }
  27. BEGIN_MESSAGE_MAP(COptionsDialog, CDialog)
  28. //{{AFX_MSG_MAP(COptionsDialog)
  29. ON_NOTIFY(TVN_SELCHANGED, IDC_LIST_OPTIONS, OnSelectionChanged)
  30. //}}AFX_MSG_MAP
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // COptionsDialog message handlers
  34. BOOL COptionsDialog::OnInitDialog() 
  35. {
  36. CDialog::OnInitDialog();
  37. m_wndList.SubclassDlgItem(IDC_LIST_OPTIONS, this);
  38. GetDlgItem(IDC_WORKSPACE)->GetWindowRect(m_rcWorkspace);
  39. ScreenToClient(m_rcWorkspace);
  40. for (int i = 0; i < m_arrPages.GetSize(); i++)
  41. {
  42. COptionsPage* pPage = m_arrPages[i];
  43. pPage->Create(pPage->m_psp.pszTemplate, this);
  44. HTREEITEM hItem = m_wndList.InsertItem(pPage->m_strTitle, 1, 0);
  45. m_wndList.SetItemData(hItem, (DWORD_PTR)pPage);
  46. pPage->MoveWindow(m_rcWorkspace);
  47. if (i == m_nActive) m_wndList.SelectItem(hItem);
  48. }
  49. return TRUE;               
  50. }
  51. void COptionsDialog::SetActivePage(int nPage)
  52. {
  53. m_nActive = nPage;
  54. }
  55. void COptionsDialog::AddPage(COptionsPage *pPage)
  56. {
  57. m_arrPages.Add(pPage);
  58. }
  59. void COptionsDialog::OnSelectionChanged(NMHDR* pNMHDR, LRESULT* pResult) 
  60. {
  61. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  62. // TODO: Add your control notification handler code here
  63. if (pNMTreeView->itemNew.hItem)
  64. {
  65. CPropertyPage* pPage = (CPropertyPage*)pNMTreeView->itemNew.lParam;
  66. ASSERT(pPage);
  67. ASSERT_KINDOF(CPropertyPage, pPage);
  68. pPage->ShowWindow(SW_SHOW);   
  69. pPage->EnableWindow();
  70. pPage->ModifyStyle(0, WS_TABSTOP);
  71. }
  72. if (pNMTreeView->itemOld.hItem)
  73. {
  74. CPropertyPage* pPage = (CPropertyPage*)pNMTreeView->itemOld.lParam;
  75. ASSERT(pPage);
  76. ASSERT_KINDOF(CPropertyPage, pPage);
  77. pPage->ShowWindow(SW_HIDE);   
  78. }
  79. *pResult = 0;
  80. }
  81. BOOL COptionsDialog::PreTranslateMessage(MSG* pMsg) 
  82. {
  83. if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB )
  84. {
  85.  if (GetKeyState(VK_CONTROL) < 0)
  86.  {
  87.  
  88.  HTREEITEM hItem = m_wndList.GetSelectedItem();
  89.  if (hItem)
  90.  {  
  91.  hItem = GetKeyState(VK_SHIFT) < 0 ?
  92.  m_wndList.GetPrevVisibleItem(hItem): m_wndList.GetNextVisibleItem(hItem);  
  93.  
  94.  if (hItem) m_wndList.SelectItem(hItem);
  95.  }  
  96.  
  97.  return TRUE;
  98.  }
  99. }
  100. return CDialog::PreTranslateMessage(pMsg);
  101. }
  102. void COptionsDialog::OnOK()
  103. {
  104. for (int i = 0; i < m_arrPages.GetSize(); i++)
  105. {
  106. m_arrPages[i]->UpdateData();
  107. m_arrPages[i]->OnOK();
  108. }
  109. CDialog::OnOK();
  110. }