ComboInListView.cpp
上传用户:meggie0806
上传日期:2007-01-02
资源大小:87k
文件大小:3k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. // ComboInListView.cpp : implementation file
  2. //
  3. // The code contained in this file is based on the original
  4. // CInPlaceList from http://www.codeguru.com/listview
  5. #include "stdafx.h"
  6. #include "SuperGrid.h"
  7. #include "ComboInListView.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CComboInListView
  15. CComboInListView::CComboInListView(int iItem, int iSubItem, CStringList *plstItems)
  16. {
  17. m_iItem = iItem;
  18. m_iSubItem = iSubItem;
  19. m_lstItems.AddTail(plstItems);
  20. m_bVK_ESCAPE = 0;
  21. }
  22. CComboInListView::~CComboInListView()
  23. {
  24. }
  25. BEGIN_MESSAGE_MAP(CComboInListView, CComboBox)
  26. //{{AFX_MSG_MAP(CComboInListView)
  27. ON_WM_CREATE()
  28. ON_WM_KILLFOCUS()
  29. ON_WM_CHAR()
  30. ON_WM_NCDESTROY()
  31. ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseup)
  32. ON_WM_SIZE()
  33. //}}AFX_MSG_MAP
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // 
  37. int CComboInListView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  38. {
  39. if (CComboBox::OnCreate(lpCreateStruct) == -1)
  40. return -1;
  41. CFont* font = GetParent()->GetFont();
  42. SetFont(font);
  43. //add the items from CStringlist
  44. POSITION pos = m_lstItems.GetHeadPosition();
  45. while(pos != NULL)
  46. AddString((LPCTSTR)(m_lstItems.GetNext(pos)));
  47. SetFocus();
  48. return 0;
  49. }
  50. BOOL CComboInListView::PreTranslateMessage(MSG* pMsg) 
  51. {
  52. if( pMsg->message == WM_KEYDOWN )
  53. {
  54. if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
  55. {
  56. ::TranslateMessage(pMsg);
  57. ::DispatchMessage(pMsg);
  58. return 1;
  59. }
  60. }
  61. return CComboBox::PreTranslateMessage(pMsg);
  62. }
  63. void CComboInListView::OnKillFocus(CWnd* pNewWnd) 
  64. {
  65. int nIndex = GetCurSel();
  66. CComboBox::OnKillFocus(pNewWnd);
  67. CString str;
  68. GetWindowText(str);
  69. // Send Notification to parent of ListView ctrl
  70. LV_DISPINFO lvDispinfo;
  71. lvDispinfo.hdr.hwndFrom = GetParent()->m_hWnd;
  72. lvDispinfo.hdr.idFrom = GetDlgCtrlID();//that's us
  73. lvDispinfo.hdr.code = LVN_ENDLABELEDIT;
  74. lvDispinfo.item.mask = LVIF_TEXT | LVIF_PARAM;
  75. lvDispinfo.item.iItem = m_iItem;
  76. lvDispinfo.item.iSubItem = m_iSubItem;
  77. lvDispinfo.item.pszText = m_bVK_ESCAPE ? NULL : LPTSTR((LPCTSTR)str);
  78. lvDispinfo.item.cchTextMax = str.GetLength();
  79. lvDispinfo.item.lParam = GetItemData(GetCurSel());
  80. if(nIndex!=CB_ERR)
  81. GetParent()->GetParent()->SendMessage(WM_NOTIFY, GetParent()->GetDlgCtrlID(), (LPARAM)&lvDispinfo);
  82. PostMessage(WM_CLOSE);
  83. }
  84. //need to catch the VK_ESCAPE for the notification msg
  85. void CComboInListView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  86. {
  87. if(nChar == VK_ESCAPE || nChar == VK_RETURN)
  88. {
  89. if( nChar == VK_ESCAPE)
  90. m_bVK_ESCAPE = 1;
  91. GetParent()->SetFocus();
  92. return;
  93. }
  94. CComboBox::OnChar(nChar, nRepCnt, nFlags);
  95. }
  96. //doing this hence we are "modaless" and need to clean up me self
  97. void CComboInListView::OnNcDestroy() 
  98. {
  99. CComboBox::OnNcDestroy();
  100. delete this;
  101. }
  102. void CComboInListView::OnCloseup() 
  103. {
  104. GetParent()->SetFocus();
  105. }
  106. void CComboInListView::OnSize(UINT nType, int cx, int cy) 
  107. {
  108. CComboBox::OnSize(nType, cx, cy);
  109. }