PageListCtrl.cpp
上传用户:yangzi5763
上传日期:2007-01-02
资源大小:239k
文件大小:35k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 10/15/98 9:30:26 AM
  5.   Comments: PageListCtrl.cpp : implementation file
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "XPropertiesWnd.h"
  9. #include "PageListCtrl.h"
  10. #include "XFloorPropertiesWnd.h"
  11. #include "XPropertiesWndCtl.h"
  12. #include "gdi.h"
  13. #include <afxpriv.h>
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CPageListCtrl
  21. IMPLEMENT_DYNCREATE(CPageListCtrl, CListCtrl)
  22. BOOL CPageListCtrl::m_bAutoResizingColumns = TRUE;
  23. CAsControls CPageListCtrl::m_asControls;
  24. COLORREF CPageListCtrl::m_rgbDisableItem = GetSysColor(COLOR_GRAYTEXT);
  25. COLORREF CPageListCtrl::m_rgbEnableItem = RGB(0,0,0);
  26. #define NULLPOINT CPoint(-1,-1)
  27. // Function name : CPageListCtrl::CPageListCtrl
  28. // Description     : Default consturctor
  29. // Return type : 
  30. CPageListCtrl::CPageListCtrl(CXPropertiesWndCtrl* pControl, int nHeight)
  31. {
  32. m_pControl = pControl;
  33. m_nHeight = nHeight;
  34. m_nIndexPage = -1;
  35. m_hIconDown = AfxGetApp()->LoadIcon(IDI_ICON_DOWN);
  36. m_hIconUp = AfxGetApp()->LoadIcon(IDI_ICON_UP);
  37. m_hIconDots = AfxGetApp()->LoadIcon(IDI_ICON_DOTS);
  38. m_hIconReturn = AfxGetApp()->LoadIcon(IDI_ICON_RETURN);
  39. m_hIconLink = AfxGetApp()->LoadIcon(IDI_ICON_LINK);
  40. m_hIconFont = m_hIconDots;
  41. m_hIconClick = AfxGetApp()->LoadIcon(IDI_ICON_CLICK);
  42. m_pEditControl = NULL;
  43. m_nOpenedProperty = -1;
  44. m_ptnCapture = NULLPOINT;
  45. m_nColumnName = -1;
  46. m_nColumnValue = -1;
  47. m_pDrawFont = NULL;
  48. }
  49. // Function name : CPageListCtrl::SetIndexPage
  50. // Description     : Save the window of page into control
  51. // Return type : void 
  52. // Argument         : long nIndexPage
  53. void CPageListCtrl::SetIndexPage(long nIndexPage)
  54. {
  55. m_nIndexPage = nIndexPage;
  56. }
  57. // Function name : CPageListCtrl::GetIndexPage
  58. // Description     : return the index of page
  59. // Return type : const long 
  60. const long CPageListCtrl::GetIndexPage()
  61. {
  62. return m_nIndexPage;
  63. }
  64. // Function name : CPageListCtrl::~CPageListCtrl
  65. // Description     : Virtual Destructor
  66. // Return type : 
  67. CPageListCtrl::~CPageListCtrl()
  68. {
  69. ResetEditControl();
  70. }
  71. BEGIN_MESSAGE_MAP(CPageListCtrl, CListCtrl)
  72. //{{AFX_MSG_MAP(CPageListCtrl)
  73. ON_WM_CREATE()
  74. ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit)
  75. ON_WM_SIZE()
  76. ON_WM_LBUTTONDOWN()
  77. ON_WM_DRAWITEM_REFLECT()
  78. ON_WM_MEASUREITEM()
  79. ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged)
  80. ON_WM_KEYDOWN()
  81. ON_WM_LBUTTONDBLCLK()
  82. ON_WM_LBUTTONUP()
  83. ON_WM_MOUSEMOVE()
  84. ON_WM_KILLFOCUS()
  85. ON_NOTIFY_REFLECT(LVN_INSERTITEM, OnInsertitem)
  86. ON_NOTIFY_REFLECT(LVN_ITEMCHANGING, OnItemchanging)
  87. ON_WM_RBUTTONDOWN()
  88. ON_WM_RBUTTONDBLCLK()
  89. ON_WM_SETCURSOR()
  90. ON_NOTIFY_REFLECT(LVN_DELETEITEM, OnDeleteitem)
  91. //}}AFX_MSG_MAP
  92. END_MESSAGE_MAP()
  93. BEGIN_EVENTSINK_MAP( CPageListCtrl, CListCtrl )
  94. ON_EVENT( CPageListCtrl, IDNCOMBOBOX, 2 /*ChangedItem*/, OnChangedItem, VTS_I4)
  95. END_EVENTSINK_MAP()
  96. /////////////////////////////////////////////////////////////////////////////
  97. // CPageListCtrl message handlers
  98. // Function name : CPageListCtrl::OnNew
  99. // Description     : Called after new operator
  100. // Return type : void 
  101. // Argument         : CWnd* pParentWnd
  102. // Argument         : UINT nID
  103. void CPageListCtrl::OnNew(CWnd* pParentWnd, UINT nID)
  104. {
  105. Create(WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_REPORT | GetDefaultStyle() , CRect(0,0,0,0), pParentWnd, nID);
  106. ListView_SetExtendedListViewStyle(m_hWnd, GetDefaultExStyle());
  107. }
  108. // Function name : CPageListCtrl::GetDefaultStyle
  109. // Description     : Called by void CPageListCtrl::OnNew(CWnd* pParentWnd, UINT nID)
  110. // Return type : const UINT 
  111. const UINT CPageListCtrl::GetDefaultStyle()
  112. {
  113. return LVS_SINGLESEL | LVS_OWNERDRAWFIXED;
  114. }
  115. // Function name : CPageListCtrl::GetDefaultExStyle
  116. // Description     : 
  117. // Return type : const UINT 
  118. const UINT CPageListCtrl::GetDefaultExStyle()
  119. {
  120. return LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
  121. }
  122. // Function name : CPageListCtrl::OnCreate
  123. // Description     : Called to Init control 
  124. // Return type : int 
  125. // Argument         : LPCREATESTRUCT lpCreateStruct
  126. int CPageListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  127. {
  128. if (CListCtrl::OnCreate(lpCreateStruct) == -1)
  129. return -1;
  130. if (!OnInit())
  131. {
  132. #ifdef _DEBUG
  133. TRACE0("Warning: Cannot create PageListCtrl.n");
  134. #endif
  135. return -1;
  136. }
  137. return 0;
  138. }
  139. // Function name : CPageListCtrl::OnInit
  140. // Description     : Initilalize the control
  141. // Return type : BOOL 
  142. BOOL CPageListCtrl::OnInit()
  143. {
  144. // Insert two columns for name and value
  145. int i = 0;
  146. while (GetColumn(i++,NULL));
  147. m_nColumnName = InsertColumn(i, _T("Name"), LVCFMT_LEFT, 96);
  148. m_nColumnValue = InsertColumn(i + 1, _T("Value"), LVCFMT_LEFT, 128);
  149. //Create the item font
  150. LOGFONT logFont;
  151. if (::GetObject(GetControlWnd()->m_itemFont.GetFontHandle(), sizeof(LOGFONT), &logFont))
  152. CreateItemFont((const LOGFONT*)&logFont);
  153. //Create the tooltips if neccessarly
  154. if (GetControlWnd()->m_bToolTips)
  155. m_toolTip.Create(this);
  156. return TRUE;
  157. }
  158. // Function name : CPageListCtrl::OnEndlabeledit
  159. // Description     : On EndEdit label
  160. // Return type : void 
  161. // Argument         : NMHDR* pNMHDR
  162. // Argument         : LRESULT* pResult
  163. void CPageListCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
  164. {
  165. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  166. CString item; GetEditControl()->GetWindowText(item);
  167. if (item.IsEmpty())
  168. DeleteItemVrt(pDispInfo->item.iItem);
  169. else
  170. SetItemText(pDispInfo->item.iItem, pDispInfo->item.iSubItem, item);
  171. *pResult = 0;
  172. }
  173. void CPageListCtrl::Save(CString & stream)
  174. {
  175. }
  176. // Function name : CPageListCtrlDesign::Load
  177. // Description     : Call to load items in design/runtime time. Depend on case
  178. // Return type : void 
  179. // Argument         : CString & stream
  180. void CPageListCtrl::Load(CString & stream)
  181. {
  182. if (::IsWindow(m_hWnd))
  183. {
  184. DeleteAll();
  185. CString sItem;
  186. int i = 0;
  187. AfxExtractSubString(sItem, stream, i, _cPagesSeparator);
  188. while (!sItem.IsEmpty())
  189. {
  190. CString sItem0, sItem1, sItem2, sItem3;
  191. AfxExtractSubString(sItem0, sItem, 0, TCHAR('\'));
  192. AfxExtractSubString(sItem1, sItem, 1, TCHAR('\'));
  193. AfxExtractSubString(sItem2, sItem, 2, TCHAR('\'));
  194. AfxExtractSubString(sItem3, sItem, 3, TCHAR('\'));
  195. OnLoad(sItem0, sItem1, sItem2, sItem3);
  196. AfxExtractSubString(sItem, stream, ++i, _cPagesSeparator);
  197. }
  198. }
  199. }
  200. // Function name : CPageListCtrl::OnLoad
  201. // Description     : Called from Load function, to insert a new prop
  202. // Return type : int 
  203. // Argument         : LPCTSTR lpszName
  204. // Argument         : LPCTSTR lpszAs
  205. // Argument         : LPCTSTR lpszType
  206. // Argument         : LPCTSTR lpszGroup
  207. int CPageListCtrl::OnLoad(LPCTSTR lpszName, LPCTSTR lpszAs, LPCTSTR lpszType, LPCTSTR lpszGroup)
  208. {
  209. static const CString enable(_T("Enable"));
  210. static const CString grayed(_T("Grayed"));
  211. int nItem = InsertItemVrt(GetItemCount(), lpszName, MAKELPARAM(m_asControls.GetID(lpszAs), enable.CompareNoCase(lpszType) == 0 ? 0 : (grayed.CompareNoCase(lpszType)) == 0 ? 1 : 2), lpszGroup);
  212. return nItem;
  213. }
  214. // Function name : CPageListCtrl::IsGrayedItem
  215. // Description     : 
  216. // Return type : BOOL 
  217. // Argument         : int nItem
  218. BOOL CPageListCtrl::IsGrayedItem(int nIndex)
  219. {
  220. if (nIndex >= 0)
  221. if (nIndex < GetItemCount())
  222. return HIWORD(GetItemData(nIndex)) == 1;
  223. return FALSE;
  224. }
  225. // Function name : CPageListCtrl::IsBlackItem
  226. // Description     : 
  227. // Return type : BOOL 
  228. // Argument         : int nItem
  229. BOOL CPageListCtrl::IsBlackItem(int nIndex)
  230. {
  231. if (nIndex >= 0)
  232. if (nIndex < GetItemCount())
  233. return HIWORD(GetItemData(nIndex)) == 2;
  234. return NULL;
  235. }
  236. // Function name : CPageListCtrl::IsEnableItem
  237. // Description     : Return TRUE or FALSE case on Enable disable
  238. // Return type : BOOL 
  239. // Argument         : int nIndex
  240. BOOL CPageListCtrl::IsEnableItem(int nIndex)
  241. {
  242. if (nIndex >= 0)
  243. if (nIndex < GetItemCount())
  244. return HIWORD(GetItemData(nIndex)) == 0;
  245. return FALSE;
  246. }
  247. // Function name : CPageListCtrl::IsEditItem
  248. // Description     : Edit Item
  249. // Return type : BOOL 
  250. // Argument         : int nItem
  251. BOOL CPageListCtrl::IsEditItem(int nItem)
  252. {
  253. return CString(GetItemAsControl(nItem)).CompareNoCase(_T("Edit")) == 0;
  254. }
  255. BOOL CPageListCtrl::IsButtonItem(int nItem)
  256. {
  257. return (CString(GetItemAsControl(nItem)).CompareNoCase(_T("Button")) == 0) ||
  258. (CString(GetItemAsControl(nItem)).CompareNoCase(_T("Return")) == 0) || 
  259. (CString(GetItemAsControl(nItem)).CompareNoCase(_T("Link")) == 0) ||
  260. (CString(GetItemAsControl(nItem)).CompareNoCase(_T("Font")) == 0);
  261. }
  262. // Function name : CPageListCtrl::GetItemAsControl
  263. // Description     : Get as string the as of item
  264. // Return type : LPCTSTR 
  265. // Argument         : int nIndex
  266. LPCTSTR CPageListCtrl::GetItemAsControl(int nIndex)
  267. {
  268. if (nIndex >= 0)
  269. if (nIndex < GetItemCount())
  270. return m_asControls.GetName(LOWORD(GetItemData(nIndex)));
  271. return NULL;
  272. }
  273. // Function name : CPageListCtrl::ResizeColumns
  274. // Description     : Resize the last column, such that the sum of widths is equal with width of client rect
  275. // Return type : void 
  276. // Argument         : int cx
  277. // Argument         : int cy
  278. void CPageListCtrl::ResizeColumns()
  279. {
  280. if (m_bAutoResizingColumns)
  281. {
  282. LV_COLUMN lColumn; lColumn.mask = LVCF_WIDTH;
  283. CRect rect; GetClientRect(rect);
  284. if (!rect.IsRectEmpty())
  285. {
  286. if (GetColumn(0,&lColumn))
  287. {
  288. int s = 0, i = 0;
  289. for (i = 0; GetColumn(i, &lColumn); i++, s += lColumn.cx);
  290. i--;
  291. SetColumnWidth(i, abs(rect.Width() - (s - GetColumnWidth(i))));
  292. }
  293. // One penible bug
  294. SendMessage(WM_HSCROLL, MAKEWPARAM( SB_ENDSCROLL, 0), NULL);
  295. }
  296. }
  297. }
  298. // Function name : CPageListCtrl::OnSize
  299. // Description     : On resize control
  300. // Return type : void 
  301. // Argument         : UINT nType
  302. // Argument         : int cx
  303. // Argument         : int cy
  304. void CPageListCtrl::OnSize(UINT nType, int cx, int cy) 
  305. {
  306. CListCtrl::OnSize(nType, cx, cy);
  307. ResizeColumns();
  308. }
  309. // Function name : CPageListCtrl::GetLastRect
  310. // Description     : Return rect of item nItem and subitme nSubItem
  311. // Return type : CRect 
  312. // Argument         : int nItem
  313. // Argument         : int nSubItem
  314. CRect CPageListCtrl::GetLastRect(int nItem)
  315. {
  316. CRect rResult;
  317. GetItemRect(nItem, rResult, LVIR_BOUNDS);
  318. rResult.left = rResult.right - GetColumnWidth(m_nColumnValue);
  319. rResult.OffsetRect(2,0);
  320. return rResult;
  321. }
  322. // Function name : CPageListCtrl::OpenEditing
  323. // Description     : Open editing mode
  324. // Return type : BOOL 
  325. // Argument         : int nItem
  326. // Argument         : CPoint point
  327. BOOL CPageListCtrl::OpenEditing(int nItem, LPARAM lParam)
  328. {
  329. if (IsEnableItem(nItem))
  330. {
  331. if (CreateEditControl(nItem))
  332. {
  333. if (m_nOpenedProperty != nItem)
  334. GetEditingControl()->Load();
  335. m_nOpenedProperty = nItem;
  336. }
  337. else m_nOpenedProperty = -1;
  338. return TRUE;
  339. }
  340. return FALSE;
  341. }
  342. // Function name : CPageListCtrl::GetWindowEditing
  343. // Description     : 
  344. // Return type : CWnd* 
  345. CWnd* CPageListCtrl::GetWindowEditing()
  346. {
  347. if (CControlsWnd* pEditControl = GetEditingControl())
  348. return pEditControl->GetWindow();
  349. return NULL;
  350. }
  351. // Function name : CPageListCtrl::CloseEditing
  352. // Description     : Close editing mode
  353. // Return type : void 
  354. void CPageListCtrl::CloseEditing()
  355. {
  356. }
  357. // Function name : CPageListCtrl::NextItem
  358. // Description     : 
  359. // Return type : void 
  360. // Argument         : int nItem
  361. void CPageListCtrl::NextItem(int nItem)
  362. {
  363. if (IsEnableItem(nItem))
  364. if (CControlsWnd* pEditControl = GetEditingControl())
  365. pEditControl->OnNextItem();
  366. }
  367. // Function name : CPageListCtrl::OnKeyDown
  368. // Description     : Press SPACE, start edit item
  369. // Return type : void 
  370. // Argument         : UINT nChar
  371. // Argument         : UINT nRepCnt
  372. // Argument         : UINT nFlags
  373. void CPageListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  374. {
  375. switch (nChar)
  376. {
  377. case VK_PRIOR:
  378. case VK_NEXT:
  379. case VK_END:
  380. case VK_HOME:
  381. case VK_LEFT:
  382. case VK_UP:
  383. case VK_RIGHT:
  384. case VK_DOWN:
  385. {
  386. CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
  387. break;
  388. }
  389. case VK_DELETE:
  390. {
  391. if (CXPropertiesWndCtrl* pControlWnd = GetControlWnd())
  392. if (CControlsWnd* pEditControl = GetEditingControl())
  393. pControlWnd->FireDelete((short)pEditControl->GetWindowNotify()->m_nIndexPage, (short)pEditControl->GetSelectedItem());
  394. break;
  395. }
  396. default:
  397. {
  398. if (CControlsWnd* pEditControl = GetEditingControl())
  399. {
  400. BOOL bEdit = pEditControl->IsKindOf(RUNTIME_CLASS(CControlsWnd_CEdit));
  401. if (bEdit || ( nChar == VK_F4) || (nChar == VK_RETURN))
  402. {
  403. pEditControl->Show();
  404. if (bEdit)
  405. pEditControl->GetWindow()->PostMessage(WM_KEYDOWN, nChar, nFlags);
  406. }
  407. if (nChar == VK_SPACE)
  408. NextItem(pEditControl->GetSelectedItem());
  409. }
  410. break;
  411. }
  412. }
  413. }
  414. // Function name : CPageListCtrl::OnRButtonDown
  415. // Description     : 
  416. // Return type : void 
  417. // Argument         : UINT nFlags
  418. // Argument         : CPoint point
  419. void CPageListCtrl::OnRButtonDown(UINT nFlags, CPoint point) 
  420. {
  421. }
  422. // Function name : CPageListCtrl::OnRButtonDblClk
  423. // Description     : 
  424. // Return type : void 
  425. // Argument         : UINT nFlags
  426. // Argument         : CPoint point
  427. void CPageListCtrl::OnRButtonDblClk(UINT nFlags, CPoint point) 
  428. {
  429. }
  430. // Function name : CPageListCtrl::CheckEditMode
  431. // Description     : 
  432. // Return type : BOOL 
  433. // Argument         : CPoint point
  434. // Argument         : int nSelected
  435. BOOL CPageListCtrl::CheckEditMode(int nItem, CPoint point, int nSelected)
  436. {
  437. if (nItem>=0)
  438. if (IsEnableItem(nItem))
  439. // In item as edit  control must click twice.
  440. if (IsEditItem(nItem))
  441. return nItem == nSelected;
  442. else
  443. // You must click in button
  444. if (!m_btnRect.IsRectEmpty())
  445. return m_btnRect.PtInRect(point);
  446. return FALSE;
  447. }
  448. // Function name : CPageListCtrl::OnLButtonDblClk
  449. // Description     : If user dblclk the combos move next item
  450. // Return type : void 
  451. // Argument         : UINT nFlags
  452. // Argument         : CPoint point
  453. void CPageListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) 
  454. {
  455. if ((m_btnRect.IsRectEmpty()) || ((!m_btnRect.IsRectEmpty()) && (!m_btnRect.PtInRect(point))))
  456. {
  457. int nItem = HitTest(point);
  458. if (nItem >= 0)
  459. NextItem(nItem);
  460. }
  461. }
  462. // Function name : CPageListCtrl::DrawButton
  463. // Description     : 
  464. // Return type : void 
  465. // Argument         : CDC * pDC
  466. // Argument         : CRect rB
  467. // Argument         : int nItem
  468. // Argument         : BOOL bClick
  469. void CPageListCtrl::DrawButton(CDC * pDC, CRect rB, int nItem, BOOL bClick)
  470. {
  471. int type = LOWORD(GetItemData(nItem));
  472. if (type != ID_MENUAS_GROUP)
  473. {
  474. CDC* pDCDraw = pDC;
  475. if (!pDC)
  476. pDCDraw = GetDC();
  477. rB.InflateRect(-1,-1);
  478. pDCDraw->FillRect(rB, &CBrush(RGB(192,192,192)));
  479. pDCDraw->DrawEdge(rB, EDGE_RAISED, BF_RECT);
  480. rB.InflateRect(-1,-1);
  481. HICON hIcon = m_hIconDown;
  482. if (IsButtonItem(nItem))
  483. {
  484. switch (type)
  485. {
  486. case ID_MENUAS_BUTTON:
  487. {
  488. hIcon = m_hIconDots;
  489. break;
  490. }
  491. case ID_MENUAS_RETURN:
  492. {
  493. hIcon = m_hIconReturn;
  494. break;
  495. }
  496. case ID_MENUAS_LINK:
  497. {
  498. hIcon = m_hIconLink;
  499. break;
  500. }
  501. case ID_MENUAS_FONT:
  502. {
  503. hIcon = m_hIconFont;
  504. break;
  505. }
  506. }
  507. }
  508. pDCDraw->DrawIcon(rB.left, rB.top, hIcon );
  509. if (bClick)
  510. pDCDraw->DrawIcon(rB.left, rB.top, m_hIconClick);
  511. if (!pDC)
  512. ReleaseDC(pDCDraw);
  513. }
  514. }
  515. #define GetColorItem(sItem) CControlsWnd_CColorComboBox::GetColor(sItem)
  516. #define formatDrawText DT_VCENTER | DT_SINGLELINE | DT_LEFT
  517. // Function name : CPageListCtrl::UserPaint
  518. // Description     : If user want to paint something ...
  519. // Return type : void 
  520. // Argument         : int nItem
  521. // Argument         : CDC * pDC
  522. // Argument         : CRect rect
  523. BOOL CPageListCtrl::UserPaint(int nItem, CDC * pDC, CRect rect)
  524. {
  525. // Type of item is in LOWORD of GetItemData(nItem)
  526. CGdiStack stack;
  527. switch (LOWORD(GetItemData(nItem)))
  528. {
  529. case ID_MENUAS_COLORCOMBOBOX:
  530. {
  531. CRect rColor(rect); rColor.right = rColor.left + rColor.Height();
  532. rect.left = rColor.right + 4;
  533. rColor.InflateRect(-2,-2); rColor.OffsetRect(0,1);
  534. CString sItem = GetItemText(nItem, m_nColumnValue);
  535. pDC->FillRect(rColor, &CBrush(GetColorItem(sItem)));
  536. pDC->FrameRect(rColor, &CBrush(RGB(0,0,0)));
  537. pDC->DrawText(sItem, rect, formatDrawText);
  538. return TRUE;
  539. }
  540. case ID_MENUAS_FONT:
  541. {
  542. if (CControlsWnd_CFont* pFontControl = (CControlsWnd_CFont*)CControlsWnd::LookupControl(this, nItem))
  543. {
  544. CFont font;
  545. LOGFONT logFont;
  546. memcpy(&logFont, pFontControl->GetLogFont(), sizeof(logFont));
  547. logFont.lfHeight = min(rect.Height() - 2, abs(logFont.lfHeight));
  548. font.CreateFontIndirect(&logFont);
  549. stack.Push(pDC, &font);
  550. COLORREF oColor = pDC->SetTextColor(pFontControl->GetColorFont());
  551. pDC->DrawText(GetItemText(nItem, m_nColumnValue), rect, formatDrawText);
  552. pDC->SetTextColor(oColor);
  553. stack.Pop();
  554. font.DeleteObject();
  555. return TRUE;
  556. }
  557. return FALSE;
  558. }
  559. }
  560. return FALSE;
  561. }
  562. // Function name : CPageListCtrl::OnBeginDrawItem
  563. // Description     : 
  564. // Return type : void 
  565. // Argument         :  CDC* pDC
  566. // Argument         : int nItem
  567. // Argument         : LPARAM itemData
  568. void CPageListCtrl::OnBeginDrawItem( CDC* pDC, int nItem, LPARAM itemData )
  569. {
  570. m_pDrawFont = GetControlWnd()->SelectFontObject(pDC, GetControlWnd()->m_itemFont);
  571. }
  572. // Function name : CPageListCtrl::OnEndDrawItem
  573. // Description     : 
  574. // Return type : void 
  575. // Argument         :  CDC* pDC
  576. // Argument         : int nItem
  577. // Argument         : LPARAM itemData
  578. void CPageListCtrl::OnEndDrawItem( CDC* pDC, int nItem, LPARAM itemData)
  579. {
  580. pDC->SelectObject(m_pDrawFont);
  581. }
  582. // Function name : CPageListCtrl::DrawItem
  583. // Description     : 
  584. // Return type : void 
  585. // Argument         : LPDRAWITEMSTRUCT lpDrawItemStruct
  586. void CPageListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  587. {
  588. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  589. CRect rectDraw(lpDrawItemStruct->rcItem), rectItem(rectDraw);
  590. int nItem = lpDrawItemStruct->itemID;
  591. CRect rectAll; GetItemRect(nItem, rectAll, LVIR_BOUNDS);
  592. BOOL bFocused = GetFocus() && (GetItemState(nItem, LVIS_FOCUSED) == LVIS_FOCUSED);
  593. BOOL bSelected = GetItemState(nItem, LVIS_SELECTED) == LVIS_SELECTED;
  594. if (bFocused && bSelected) m_btnRect.SetRectEmpty();
  595. BOOL bEnabled = IsEnableItem(nItem);
  596. BOOL bEdit = IsEditItem(nItem);
  597. LV_COLUMN lColumn; lColumn.mask = LVCF_WIDTH;
  598. rectItem.left += 2;
  599. pDC->SetTextColor(bEnabled ? (bSelected & bFocused ? RGB(255,255,255) : m_rgbEnableItem) : (IsGrayedItem(nItem) ? m_rgbDisableItem : RGB(0,0,0)));
  600. CBrush brush(bEnabled & bSelected ? (bFocused ? RGB(0,0,128) : RGB(192,192,192)) : RGB(255,255,255));
  601. pDC->FillRect(rectAll, &CBrush(RGB(255,255,255)));
  602. OnBeginDrawItem( pDC, nItem, lpDrawItemStruct->itemData );
  603. int i = 0;
  604. BOOL bEditMode = IsEditMode() && bFocused;
  605. BOOL bUser = FALSE;
  606. for (i = 0; GetColumn(i, &lColumn); i++, rectItem.left += lColumn.cx + 2)
  607. {
  608. rectItem.right = rectItem.left + lColumn.cx;
  609. if (i == m_nColumnValue)
  610. bUser = UserPaint(nItem, pDC, rectItem);
  611. else
  612. if ( i == m_nColumnName )
  613. {
  614. CRect r(rectItem);
  615. r.OffsetRect(-2,0);r.right -= 2;
  616. pDC->FillRect(r, &brush);
  617. if (bFocused && !bEnabled)
  618. {
  619. r.InflateRect(0,-1);
  620. r.bottom++;
  621. pDC->FrameRect(r, &CBrush(RGB(0,0,0)));
  622. }
  623. }
  624. if (!bUser)
  625. pDC->DrawText(GetItemText(nItem, i), rectItem, formatDrawText);
  626. if ( i == m_nColumnName)
  627. pDC->SetTextColor(!bEditMode ? RGB(0,0,0) : GetControlWnd()->m_rgbEditColor);
  628. }
  629. OnEndDrawItem(pDC, nItem, lpDrawItemStruct->itemData);
  630. pDC->SetTextColor(RGB(0,0,0));
  631. i--;
  632. if (!(bFocused && !bEnabled))
  633. {
  634. if (!bEdit)
  635. if (bFocused && bSelected)
  636. {
  637. CRect rB(rectAll);
  638. rB.top++;
  639. rB.left = rB.right - (GetSystemMetrics(SM_CXHSCROLL) + 2);
  640. if (rB.left < rB.right)
  641. if (rB.Width() < GetColumnWidth(i))
  642. {
  643. m_btnRect = rB;
  644. DrawButton(pDC, m_btnRect, nItem, FALSE);
  645. }
  646. }
  647. }
  648. }
  649. // Function name : CPageListCtrl::OnMeasureItem
  650. // Description     : Measure the item
  651. // Return type : void 
  652. // Argument         : int nIDCtl
  653. // Argument         : LPMEASUREITEMSTRUCT lpMeasureItemStruct
  654. void CPageListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
  655. {
  656. ASSERT (nIDCtl == GetDlgCtrlID());
  657. lpMeasureItemStruct->itemHeight = m_nHeight;
  658. CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
  659. }
  660. // Function name : CPageListCtrl::GetControlWnd
  661. // Description     : Return pointer to class tha create this control. In fact * to CXPropertiesWndCtrl
  662. // Return type : CXPropertiesWndCtrl* 
  663. CXPropertiesWndCtrl* CPageListCtrl::GetControlWnd()
  664. {
  665. return m_pControl;
  666. }
  667. // Function name : CPageListCtrl::GetFloorWnd
  668. // Description     : Return pointer to OLE Control xFloorWnd as Window
  669. // Return type : CXFloorPropertiesWnd* 
  670. CXFloorPropertiesWnd* CPageListCtrl::GetFloorWnd()
  671. {
  672. if (GetControlWnd())
  673. return &GetControlWnd()->m_xFloorWnd;
  674. return NULL;
  675. }
  676. // Function name : CPageListCtrl::OnInsertitem
  677. // Description     : Called after insert item
  678. // Return type : void 
  679. // Argument         : NMHDR* pNMHDR
  680. // Argument         : LRESULT* pResult
  681. void CPageListCtrl::OnInsertitem(NMHDR* pNMHDR, LRESULT* pResult) 
  682. {
  683. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  684. /*
  685. if (GetControlWnd())
  686. SetDefaultValue(pNMListView->iItem, GetItemText(pNMListView->iItem, m_nColumnValue));
  687. */
  688. *pResult = 0;
  689. }
  690. // Function name : CPageListCtrl::OnItemchanging
  691. // Description     : 
  692. // Return type : void 
  693. // Argument         : NMHDR* pNMHDR
  694. // Argument         : LRESULT* pResult
  695. void CPageListCtrl::OnItemchanging(NMHDR* pNMHDR, LRESULT* pResult) 
  696. {
  697. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  698. if (CXPropertiesWndCtrl* pControlWnd = GetControlWnd())
  699. {
  700. }
  701. *pResult = 0;
  702. }
  703. // Function name : CPageListCtrl::OnItemchanged
  704. // Description     : Fire to user a event as SelectItem(int nIndexPage, int nIndexItem)
  705. // Return type : void 
  706. // Argument         : NMHDR* pNMHDR
  707. // Argument         : LRESULT* pResult
  708. void CPageListCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  709. {
  710. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  711. // Generate a fire event as user select a item (In fact when, user changes the items, the fire will be auomaticlay generated
  712. if (CXPropertiesWndCtrl* pControlWnd = GetControlWnd())
  713. {
  714. int nPage = GetFloorWnd()->GetActivePage();
  715. if (pNMListView->uNewState & LVIS_SELECTED)
  716. {
  717. ResetEditControl();
  718. pControlWnd->FireSelectItem(nPage ,pNMListView->iItem);
  719. OpenEditing(pNMListView->iItem);
  720. }
  721. else
  722. if (pNMListView->uNewState == 0)
  723. if (pNMListView->uChanged == LVIS_DROPHILITED)
  724. {
  725. if (GetItemState(pNMListView->iItem, LVIS_SELECTED | LVIS_FOCUSED) == 0)
  726. pControlWnd->FireUnselectItem(nPage,pNMListView->iItem);
  727. }
  728. }
  729. *pResult = 0;
  730. }
  731. // Function name : CPageListCtrl::OnKillFocus
  732. // Description     : 
  733. // Return type : void 
  734. // Argument         : CWnd* pNewWnd
  735. void CPageListCtrl::OnKillFocus(CWnd* pNewWnd) 
  736. {
  737. CListCtrl::OnKillFocus(pNewWnd);
  738. if (CControlsWnd* pEditControl = GetEditingControl())
  739. pEditControl->Close(FALSE);
  740. }
  741. // Function name : CPageListCtrl::WindowProc
  742. // Description     : 
  743. // Return type : LRESULT 
  744. // Argument         : UINT message
  745. // Argument         : WPARAM wParam
  746. // Argument         : LPARAM lParam
  747. LRESULT CPageListCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  748. {
  749. switch (message)
  750. {
  751. case WM_KEYDOWN:
  752. case WM_SYSKEYDOWN:
  753. case WM_SYSKEYUP:
  754. case WM_KEYUP:
  755. {
  756. if (IsEditMode())
  757. if (CWnd* pWnd = GetWindowEditing())
  758. return pWnd->SendMessage(message, wParam, lParam);
  759. break;
  760. }
  761. case WM_VSCROLL:
  762. case WM_HSCROLL:
  763. {
  764. ResetEditControl();
  765. break;
  766. }
  767. }
  768. if (::IsWindow(m_toolTip.GetSafeHwnd()))
  769. {
  770. MSG msg = {m_hWnd, message, wParam, lParam};
  771. m_toolTip.RelayEvent(&msg);
  772. }
  773. return CListCtrl::WindowProc(message, wParam, lParam);
  774. }
  775. // Function name : CPageListCtrl::ResetEditControl
  776. // Description     : Is called every time, when you change the current selectio in pagelistctrl
  777. // Return type : void 
  778. void CPageListCtrl::ResetEditControl()
  779. {
  780. if (CControlsWnd* pEditControl = GetEditingControl())
  781. m_pEditControl = pEditControl->Delete();
  782. }
  783. // Function name : CPageListCtrl::CreateEditControl
  784. // Description     : Creae edit control. Not window
  785. // Return type : BOOL 
  786. // Argument         : int nItem
  787. BOOL CPageListCtrl::CreateEditControl(int nItem)
  788. {
  789. if (!GetEditingControl())
  790. m_pEditControl = CControlsWnd::Create(GetItemAsControl(nItem), this, nItem, m_nColumnValue );
  791. return GetEditingControl() != NULL;
  792. }
  793. // Function name : CPageListCtrl::GetPropertyName
  794. // Description     : Return the property name
  795. // Return type : CString 
  796. // Argument         : int nIndexProperty
  797. CString CPageListCtrl::GetPropertyName(int nIndexProperty)
  798. {
  799. return GetItemText(nIndexProperty, m_nColumnName);
  800. }
  801. // Function name : CPageListCtrl::GetDefaultValue
  802. // Description     : Return the default value of property nIndexProperty
  803. // Return type : CString 
  804. // Argument         : int nIndexProperty
  805. const CString CPageListCtrl::GetDefaultValue(int nIndexProperty)
  806. {
  807. return GetItemText(nIndexProperty, m_nColumnValue);
  808. }
  809. // Function name : CPageListCtrl::SetDefaultValue
  810. // Description     : Set default value
  811. // Return type : BOOL 
  812. // Argument         : int nIndexProperty
  813. // Argument         : LPCTSTR lpszdefaultValue
  814. BOOL CPageListCtrl::SetDefaultValue(int nIndexProperty, LPCTSTR lpszdefaultValue)
  815. {
  816. if (nIndexProperty >= 0)
  817. if (nIndexProperty < GetItemCount())
  818. {
  819. CString sValue(lpszdefaultValue);
  820. SetItemText(nIndexProperty, m_nColumnValue, sValue.IsEmpty() ? (LPCTSTR)NULL : (LPCTSTR)sValue);
  821. return TRUE;
  822. }
  823. return FALSE;
  824. }
  825. // Function name : CPageListCtrl::SetPropertyName
  826. // Description     : Set the property Name
  827. // Return type : void 
  828. // Argument         : int nIndexProperty
  829. // Argument         : LPCTSTR lpszPropertyName
  830. void CPageListCtrl::SetPropertyName(int nIndexProperty, LPCTSTR lpszPropertyName)
  831. {
  832. if (nIndexProperty >= 0)
  833. if (nIndexProperty < GetItemCount())
  834. SetItemText(nIndexProperty, 0, lpszPropertyName);
  835. }
  836. // Function name : CPageListCtrl::GetActiveProperty
  837. // Description     : return the active property
  838. // Return type : int 
  839. int CPageListCtrl::GetActiveProperty()
  840. {
  841. return GetNextItem(-1, LVNI_SELECTED);
  842. }
  843. // Function name : CPageListCtrl::SetActiveProperty
  844. // Description     : Set the active property
  845. // Return type : void 
  846. // Argument         : int nIndexProperty
  847. void CPageListCtrl::SetActiveProperty(int nIndexProperty)
  848. {
  849. SetItemState(nIndexProperty, LVNI_SELECTED , LVNI_SELECTED);
  850. }
  851. BOOL CPageListCtrl::PreTranslateMessage(MSG* pMsg) 
  852. {
  853. // TODO: Add your specialized code here and/or call the base class
  854. return CListCtrl::PreTranslateMessage(pMsg);
  855. }
  856. // Function name : CPageListCtrl::CreateItemFont
  857. // Description     : Create a font for items
  858. // Return type : BOOL 
  859. // Argument         : const LOGFONT * pLogFont
  860. BOOL CPageListCtrl::CreateItemFont(const LOGFONT * pLogFont)
  861. {
  862. m_itemFont.DeleteObject();
  863. return m_itemFont.CreateFontIndirect(pLogFont);
  864. }
  865. // Function name : CPageListCtrl::IsEditMode
  866. // Description     : return TRUE if is edit mode
  867. // Return type : BOOL 
  868. BOOL CPageListCtrl::IsEditMode()
  869. {
  870. if (CControlsWnd* pEditControl = GetEditingControl())
  871. return pEditControl->IsVisible();
  872. return FALSE;
  873. }
  874. // Function name : CPageListCtrl::GetControl
  875. // Description     : Return the control from nIndex item.
  876. // Return type : CControlsWnd* 
  877. // Argument         : int nIndex
  878. CControlsWnd* CPageListCtrl::GetControl(int nIndex, BOOL bDelete)
  879. {
  880. // We will try to create and then delete one control. In this way, I will
  881. // find if the control is destroyble or not.
  882. if (CControlsWnd* pControl = CControlsWnd::Create(GetItemAsControl(nIndex), this, nIndex, m_nColumnValue))
  883. if (bDelete)
  884. {
  885. pControl->Delete();
  886. // Check if after Delete function the pControl has a valid vTable or not
  887. // If it is valid, that means that this object is either CControlsWnd_CADORComboBox or ...
  888. // a control non delete.
  889. if (AfxIsValidAddress(*(void**)pControl, sizeof(void*), FALSE))
  890. return pControl;
  891. }
  892. else
  893. return pControl;
  894. return NULL;
  895. }
  896. // Function name : CPageListCtrl::OnSetCursor
  897. // Description     : 
  898. // Return type : BOOL 
  899. // Argument         : CWnd* pWnd
  900. // Argument         : UINT nHitTest
  901. // Argument         : UINT message
  902. BOOL CPageListCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  903. {
  904. if (IsSizingLine())
  905. {
  906. ::SetCursor(AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(IDC_SIZEWE)));
  907. return TRUE;
  908. }
  909. return CListCtrl::OnSetCursor(pWnd, nHitTest, message);
  910. }
  911. // Function name : CPageListCtrl::IsSizingLine
  912. // Description     : Return TRUE if mouse point is over the first right side of first column
  913. // Return type : BOOL 
  914. BOOL CPageListCtrl::IsSizingLine()
  915. {
  916. if (m_bAutoResizingColumns)
  917. if (GetControlWnd()->m_bResizeFirstColumn) 
  918. {
  919. DWORD lPoint = ::GetMessagePos();
  920. CPoint p(LOWORD(lPoint), HIWORD(lPoint));
  921. ScreenToClient(&p);
  922. CRect rect; GetClientRect(rect);
  923. int i = -1, x = 0;
  924. while ( ++i <= m_nColumnName ) x += GetColumnWidth(i);
  925. rect.left = x - 2;
  926. rect.right = x + 2;
  927. return rect.PtInRect(p);
  928. }
  929. return FALSE;
  930. }
  931. // Function name : CPageListCtrl::OnLButtonDown
  932. // Description     : User click mouse in runtime time
  933. // Return type : void 
  934. // Argument         : UINT nFlags
  935. // Argument         : CPoint point
  936. void CPageListCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  937. {
  938. SetFocus();
  939. if (IsSizingLine())
  940. {
  941. ResetEditControl();
  942. SetCapture();
  943. m_ptnCapture = point;
  944. return;
  945. }
  946. // continue the operation ...
  947. m_nSelected = GetActiveProperty();
  948. int nItem = HitTest(point);
  949. if (nItem >= 0)
  950. {
  951. SetItemState(nItem, LVNI_SELECTED | LVNI_FOCUSED, LVNI_FOCUSED | LVNI_SELECTED);
  952. EnsureVisible(nItem, FALSE);
  953. }
  954. }
  955. // Function name : CPageListCtrl::IsMouseCaptured
  956. // Description     : 
  957. // Return type : BOOL 
  958. BOOL CPageListCtrl::IsMouseCaptured()
  959. {
  960. return m_ptnCapture != NULLPOINT;
  961. }
  962. // Function name : CPageListCtrl::InvalidateNew
  963. // Description     : 
  964. // Return type : void 
  965. void CPageListCtrl::InvalidateNew()
  966. {
  967. if (CBitmap* pBitmap = Preview(this, RGB(255,255,255)))
  968. {
  969. CGdiStack stack;
  970. CDC* pDC = GetDC();
  971. CDC dcMem;
  972. CRect rect; GetClientRect(rect);
  973. if (dcMem.CreateCompatibleDC(pDC))
  974. {
  975. stack.Push(&dcMem, pBitmap);
  976. pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem, 0,0, SRCCOPY);
  977. stack.Pop();
  978. }
  979. ReleaseDC(pDC);
  980. pBitmap->DeleteObject();
  981. delete pBitmap;
  982. }
  983. else Invalidate();
  984. }
  985. // Function name : CPageListCtrl::OnMouseMove
  986. // Description     : 
  987. // Return type : void 
  988. // Argument         : UINT nFlags
  989. // Argument         : CPoint point
  990. void CPageListCtrl::OnMouseMove(UINT nFlags, CPoint point) 
  991. {
  992. if (IsMouseCaptured())
  993. {
  994. CRect rect; GetClientRect(rect);
  995. int rMin = rect.Width() / 6, rMax = rect.Width() - rMin;
  996. int newWidth = GetColumnWidth( m_nColumnName ) + ( point.x - m_ptnCapture.x );
  997. if ((newWidth >= rMin) && (newWidth <= rMax))
  998. {
  999. ModifyStyle(WS_VISIBLE, 0, SWP_NOREDRAW);
  1000. SetColumnWidth(m_nColumnName, newWidth );
  1001. ResizeColumns();
  1002. ModifyStyle(0, WS_VISIBLE, SWP_NOREDRAW);
  1003. InvalidateNew();
  1004. m_ptnCapture = point;
  1005. }
  1006. }
  1007. CListCtrl::OnMouseMove(nFlags, point);
  1008. }
  1009. // Function name : CPageListCtrl::OnLButtonUp
  1010. // Description     : 
  1011. // Return type : void 
  1012. // Argument         : UINT nFlags
  1013. // Argument         : CPoint point
  1014. void CPageListCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
  1015. {
  1016. CListCtrl::OnLButtonUp(nFlags, point);
  1017. int nItem = HitTest(point);
  1018. if (IsMouseCaptured()) // is mouse captured
  1019. {
  1020. ReleaseCapture();
  1021. m_ptnCapture = NULLPOINT;
  1022. CreateEditControl(nItem);
  1023. }
  1024. if (CControlsWnd* pEditControl = GetEditingControl())
  1025. {
  1026. if (CheckEditMode(nItem, point, m_nSelected))
  1027. {
  1028. EnsureVisible(nItem, TRUE);
  1029. pEditControl->Show();
  1030. }
  1031. }
  1032. }
  1033. // Function name : CPageListCtrl::OnDeleteitem
  1034. // Description     : 
  1035. // Return type : void 
  1036. // Argument         : NMHDR* pNMHDR
  1037. // Argument         : LRESULT* pResult
  1038. void CPageListCtrl::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) 
  1039. {
  1040. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  1041. *pResult = 0;
  1042. }
  1043. // Function name : CPageListCtrl::OnFontChanged
  1044. // Description     : Called when font is changed
  1045. // Return type : void 
  1046. void CPageListCtrl::OnFontChanged()
  1047. {
  1048. // do nothing
  1049. }
  1050. // Function name : CPageListCtrl::InsertItemVrt
  1051. // Description     : Called when new property is added into control
  1052. // Return type : int 
  1053. // Argument         : int nItem
  1054. // Argument         : LPCTSTR lpszItemName
  1055. // Argument         : LPARAM lParam
  1056. // Description lParam parameter: MAKELPARAM(asControl, asType)
  1057. int CPageListCtrl::InsertItemVrt(int nItem, LPCTSTR lpszItemName, LPARAM lParam, LPCTSTR lpszGroup)
  1058. {
  1059. // Just insert into list control
  1060. int nResult = InsertItem(nItem, _T(""));
  1061. if (nResult >= 0)
  1062. {
  1063. SetItemText(nResult, m_nColumnName, lpszItemName);
  1064. SetItemData(nResult, lParam);
  1065. }
  1066. return nResult;
  1067. }
  1068. // Function name : CPageListCtrl::DeleteItemVrt
  1069. // Description     : Called when one property need to be deleted
  1070. // Return type : BOOL 
  1071. // Argument         : int nItem
  1072. BOOL CPageListCtrl::DeleteItemVrt(int nItem)
  1073. {
  1074. return DeleteItem(nItem);
  1075. }
  1076. // Function name : CPageListCtrl::Expand
  1077. // Description     : Do nothing
  1078. // Return type : void 
  1079. // Argument         : int nItem
  1080. // Argument         : BOOL &bExppanded
  1081. void CPageListCtrl::Expand(int nItem, BOOL &bExppanded)
  1082. {
  1083. }
  1084. // Function name : CPageListCtrl::GetEditingControl
  1085. // Description     : Return the editing control.
  1086. // Return type : CControlsWnd* 
  1087. CControlsWnd* CPageListCtrl::GetEditingControl()
  1088. {
  1089. if (m_pEditControl)
  1090. if (AfxIsValidAddress(*(void**)&*m_pEditControl, sizeof(void*), FALSE))
  1091. return m_pEditControl;
  1092. return NULL;
  1093. }
  1094. // Function name : CPageListCtrl::DeleteAll
  1095. // Description     : 
  1096. // Return type : void 
  1097. void CPageListCtrl::DeleteAll()
  1098. {
  1099. DeleteAllItems();
  1100. }
  1101. // Function name : CPageListCtrl::OnChangedItem
  1102. // Description     : Called by one NCombo when selection is changed into control
  1103. // We will propagate the seelction throw the my controls.
  1104. // Return type : void 
  1105. // Argument         : long nItem
  1106. void CPageListCtrl::OnChangedItem(long nItem)
  1107. {
  1108. if (CControlsWnd* pControl = GetEditingControl())
  1109. if (pControl->IsKindOf(RUNTIME_CLASS(CControlsWnd_CNComboBox)))
  1110. {
  1111. CString sItem;
  1112. pControl->OnSelectItem(sItem, nItem);
  1113. }
  1114. }