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

ListView/ListBox

开发平台:

Visual C++

  1. // MySuperGrid.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "supergrid.h"
  5. #include "MySuperGrid.h"
  6. #include "ComboInListView.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CMySuperGrid
  14. CMySuperGrid::CMySuperGrid()
  15. {
  16. m_bDrag = TRUE;
  17. }
  18. CMySuperGrid::~CMySuperGrid()
  19. {
  20. }
  21. BEGIN_MESSAGE_MAP(CMySuperGrid, CSuperGridCtrl)
  22. //{{AFX_MSG_MAP(CMySuperGrid)
  23. ON_WM_CREATE()
  24. //}}AFX_MSG_MAP
  25. END_MESSAGE_MAP()
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CMySuperGrid message handlers
  28. int CMySuperGrid::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  29. {
  30. if (CSuperGridCtrl::OnCreate(lpCreateStruct) == -1)
  31. return -1;
  32. /////////////////////
  33. //remember this
  34. ///////////////////
  35. //associate imagelist with listviewctrl
  36. if(!m_image.Create(IDB_FOLDERS,16,1,RGB(0, 255, 255)))
  37. return -1;
  38. SetImageList(&m_image, LVSIL_SMALL);
  39. CImageList *pImageList = GetImageList(LVSIL_SMALL);
  40. if(pImageList)
  41. ImageList_GetIconSize(pImageList->m_hImageList, &m_cxImage, &m_cyImage);
  42. else
  43. return -1;
  44. return 0;
  45. }
  46. void CMySuperGrid::InitializeGrid()
  47. {
  48. /*
  49. ExtendedStyle support:
  50. LVS_EX_TRACKSELECT
  51. LVS_EX_GRIDLINES
  52. LVS_EX_FLATSB
  53. LVS_EX_CHECKBOXES
  54. LVS_EX_FLATSB
  55. all other ExStyles are not supported...buhhh and you call your self a windows-developer :(
  56. */
  57. SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES);
  58. LPTSTR lpszCols[] = {_T("Tree thing"),_T("Column #1"),_T("Column #2"),_T("Column #3"),_T("Column #4"),0};
  59. LV_COLUMN   lvColumn;
  60. //initialize the columns
  61. lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  62. lvColumn.fmt = LVCFMT_LEFT;
  63. lvColumn.cx = 200;
  64. for(int x = 0; lpszCols[x]!=NULL; x++)
  65.     {
  66. //make the secondary columns smaller
  67. if(x)
  68.   lvColumn.cx = 150;
  69. lvColumn.pszText = lpszCols[x];
  70. InsertColumn(x,&lvColumn);
  71.     }
  72. CItemInfo* lp = new CItemInfo();
  73. lp->SetImage(4);
  74. //add item text
  75. lp->SetItemText(_T("Hello World"));
  76. //add subitem text
  77. lp->AddSubItemText(_T("Happy"));      // 0 zero based subitems...
  78. lp->AddSubItemText(_T("Programming"));// 1
  79. lp->AddSubItemText(_T("with this"));  // 2
  80. lp->AddSubItemText(_T("SuperGrid"));  // 3 combo goes here
  81. //setup a combobox for the last column
  82. lp->SetControlType(lp->CONTROLTYPE::combobox, 3/*col # 3 from subitems...really col #4 in view, live with it*/);
  83. CStringList list;
  84. //initalized list for the combobox
  85. list.AddTail("Super control :}");
  86. list.AddTail("bad written control :{");
  87. list.AddTail("said piece of code :{");
  88. lp->SetListData(3, &list);
  89. //Create root item
  90. CTreeItem * pRoot = InsertRootItem(lp);//previous on N.Y.P.D we call it CreateTreeCtrl(lp)
  91. if( pRoot == NULL )
  92. return;
  93. //insert items
  94. int nCol = GetNumCol();
  95. for(int i=0; i < nCol; i++)
  96. {
  97. CItemInfo* lpItemInfo = new CItemInfo();
  98. CString strItem;
  99. strItem.Format(_T("Item %d"),i);
  100. //add items text
  101. lpItemInfo->SetItemText(strItem);
  102. //add subitem text
  103. for(int y=0;y < nCol-1; y++) 
  104. {
  105. CString str;
  106. str.Format(_T("subItem %d of %s"),y,lpItemInfo->GetItemText());
  107. lpItemInfo->AddSubItemText(str);
  108. }
  109. //insert the iteminfo with ParentPtr
  110. CTreeItem* pParent = InsertItem(pRoot, lpItemInfo);
  111. //other nodes
  112. if(i%nCol)
  113. {
  114. CTreeItem* pParent1=NULL;
  115. CTreeItem* pParent2=NULL;
  116. for(int x=0; x < nCol; x++)
  117. {
  118. CItemInfo* lpItemInfo = new CItemInfo();
  119. CString strItem;
  120. strItem.Format(_T("Item %d"),x);
  121. lpItemInfo->SetItemText(strItem);
  122. for(int z=0; z < nCol-1; z++) 
  123. {
  124. CString str;
  125. str.Format(_T("subItem %d of %s"),z, lpItemInfo->GetItemText());
  126. lpItemInfo->AddSubItemText(str);
  127. }
  128. pParent1 = InsertItem(pParent, lpItemInfo);
  129. }
  130. //this was pretty hard to get information !
  131. CItemInfo* lpAgent = new CItemInfo();
  132. lpAgent->SetItemText(_T("Mission: Impossible"));
  133. lpAgent->AddSubItemText(_T("Ethan Hunt"));
  134. lpAgent->AddSubItemText(_T("Jack Harmen"));
  135. lpAgent->AddSubItemText(_T("Jim Phelps"));
  136. lpAgent->AddSubItemText(_T("Allan Nielsen"));
  137. pParent2 = InsertItem(pParent1, lpAgent);
  138.  
  139. CItemInfo* lpRelative = new CItemInfo();
  140. lpRelative->SetItemText("Nearst relative");
  141. lpRelative->AddSubItemText(_T("Margeret Ethan Hunt"));
  142. lpRelative->AddSubItemText(_T("Alexandra Soria"));
  143. lpRelative->AddSubItemText(_T("Claire Phelps"));
  144. lpRelative->AddSubItemText(_T("N/A"));
  145. InsertItem(pParent2, lpRelative);
  146. CItemInfo* lpTraningAgent = new CItemInfo();
  147. lpTraningAgent->SetItemText(_T("Training Agent"));
  148. lpTraningAgent->AddSubItemText(_T("Peter Menich"));
  149. lpTraningAgent->AddSubItemText(_T("Chris Smith"));
  150. lpTraningAgent->AddSubItemText(_T("Eva Wojdat"));
  151. lpTraningAgent->AddSubItemText(_T("Mr. Bean"));
  152. InsertItem(pParent2, lpTraningAgent);
  153. }
  154. }
  155. //Epilog
  156. CItemInfo* lpAgent = new CItemInfo();
  157. lpAgent->SetCheck(1);//I want this to be checked if LVS_EX_CHECKBOXES
  158. lpAgent->SetItemText(_T("Bugs: Impossible"));
  159. lpAgent->SetImage(3);
  160. CTreeItem *pParent2 = InsertItem(pRoot,lpAgent);
  161. CItemInfo* lpRelative = new CItemInfo();
  162. lpRelative->SetItemText("But if.....no When");
  163. lpRelative->AddSubItemText(_T("You"));//0
  164. lpRelative->AddSubItemText(_T("find one"));//1
  165. lpRelative->AddSubItemText(_T("please notify"));//2
  166. lpRelative->AddSubItemText(_T("me"));//3 combo goes here
  167. lpRelative->SetCheck(1); //I want this to be checked if LVS_EX_CHECKBOXES
  168. //add combobox in col 2(3)
  169. lpRelative->SetControlType(lpRelative->CONTROLTYPE::combobox, 2);
  170. CStringList lst;
  171. lst.AddTail("please call");
  172. lst.AddTail("shout at");
  173. lst.AddTail("phone");
  174. lpRelative->SetListData(2/*col*/, &lst);
  175. //add another combobox in this row in col 3(4)
  176. lpRelative->SetControlType(lpRelative->CONTROLTYPE::combobox, 3);
  177. CStringList list1;
  178. list1.AddTail("your mama");
  179. list1.AddTail("your pet dog");
  180. list1.AddTail("911");
  181. //set initalized list for combobox
  182. lpRelative->SetListData(3, &list1);
  183. InsertItem(pParent2, lpRelative);
  184. //create some node so we can sort them later on, well you can sort all of them but..
  185. CItemInfo* lpSort = new CItemInfo();
  186. lpSort->SetItemText("you can sort me and my children");
  187. CTreeItem *p=InsertItem(pRoot, lpSort);
  188. for(int a=10;a>=0;a--)
  189. {
  190. CItemInfo* lp = new CItemInfo();
  191. CString str;
  192. str.Format("%c%c",a+65,a+66);
  193. lp->SetItemText(str);
  194. CTreeItem *p1=InsertItem(p, lp);
  195. if(a%2)
  196. {
  197. for(int k=10;k>=0;k--)
  198. {
  199. CItemInfo* lp = new CItemInfo();
  200. CString str;
  201. str.Format("%c",k+65);
  202. lp->SetItemText(str);
  203. InsertItem(p1, lp);
  204. }
  205. }
  206. }
  207. //could now expand one level
  208. Expand(pRoot, 0 /*listview index 0*/); 
  209. UINT uflag = LVIS_SELECTED | LVIS_FOCUSED;
  210. SetItemState(0, uflag, uflag);
  211. //Create another rootitem
  212. //block 
  213. {
  214. CItemInfo* lp = new CItemInfo();
  215. lp->SetImage(4);
  216. //add item text
  217. lp->SetItemText(_T("Another Root Item"));
  218. CTreeItem * pRoot = InsertRootItem(lp);
  219. CItemInfo* lpAgent = new CItemInfo();
  220. lpAgent->SetItemText(_T("Bugs: well it's possible"));
  221. lpAgent->SetImage(3);
  222. CTreeItem *pParent2 = InsertItem(pRoot,lpAgent);
  223. CItemInfo* lpRelative = new CItemInfo();
  224. lpRelative->SetItemText("if");
  225. lpRelative->AddSubItemText(_T("You"));
  226. lpRelative->AddSubItemText(_T("find them"));
  227. lpRelative->AddSubItemText(_T("you are"));
  228. lpRelative->AddSubItemText(_T("on your own"));//3 combo goes here
  229. lpRelative->SetCheck(1); //I want this to be checked if LVS_EX_CHECKBOXES
  230. //add another combobox in this row in col 3(4)
  231. lpRelative->SetControlType(lpRelative->CONTROLTYPE::combobox, 3);
  232. CStringList list1;
  233. list1.AddTail("screwed");
  234. list1.AddTail("fucked");
  235. list1.AddTail("lucky");
  236. //set initalized list for combobox
  237. lpRelative->SetListData(3, &list1);
  238. InsertItem(pParent2, lpRelative);
  239. Expand(pRoot, NodeToIndex(pRoot) /*listview index 0*/); 
  240. UINT uflag = LVIS_SELECTED | LVIS_FOCUSED;
  241. SetItemState(0, uflag, uflag);
  242. }
  243. }
  244. //helper function to copy CItemInfo used when drag/drop you must override this this function to suit your own CItemInfo class
  245. CItemInfo* CMySuperGrid::CopyData(CItemInfo* lpSrc)
  246. {
  247. ASSERT(lpSrc!=NULL);
  248. CItemInfo* lpDest = new CItemInfo;
  249. //well okay I put all the copy thing in one function, located in CItemInfo class, 
  250. //so you should check out this function, remember to modify this function each time you add new data to CItemInfo class.
  251. lpDest->CopyObjects(lpSrc);
  252. return lpDest;
  253. }
  254. //override, like red!
  255. COLORREF CMySuperGrid::GetCellRGB()
  256. {
  257. return RGB(192,0,0);
  258. }
  259. //this is my override of GetIcon, override this to set what ever icon suits you
  260. int CMySuperGrid::GetIcon(const CTreeItem* pItem)
  261. {
  262. if(pItem!=NULL)
  263. {
  264. int n = GetData(pItem)->GetImage();
  265. if(n!=-1)
  266. return n;
  267. int iImage = 0;
  268. if(ItemHasChildren(pItem))
  269. {
  270. IsCollapsed(pItem) ? iImage = 1/*close icon*/:iImage = 0;/*open icon*/
  271. }
  272. else
  273. iImage = 2;//doc icon
  274. return iImage;
  275. }
  276. return 0;
  277. }
  278. //override
  279. void CMySuperGrid::OnUpdateListViewItem(CTreeItem* lpItem, LV_ITEM *plvItem)
  280. {
  281. //put some extra validation here 
  282. CString str = (CString)plvItem->pszText;
  283. if(!str.Compare(_T("Bugs: Impossible")))
  284. {
  285. str+=_T(" (selfconfidence allright)");//that's valid enough :