MyListCtrl.cpp
上传用户:jzscgs158
上传日期:2022-05-25
资源大小:8709k
文件大小:33k
源码类别:

百货/超市行业

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "MyListCtrl.h"
  3. #ifdef _DEBUG
  4. #define new DEBUG_NEW
  5. #undef THIS_FILE
  6. static char THIS_FILE[] = __FILE__;
  7. #endif
  8. struct ItemData
  9. {
  10. public:
  11.   ItemData() : arrpsz( NULL ), dwData( NULL ) {}
  12.   LPTSTR* arrpsz;
  13.   DWORD dwData;  
  14. private:
  15.   ItemData( const ItemData& );
  16.   ItemData& operator=( const ItemData& );
  17. };
  18. CMyListCtrl::CMyListCtrl()
  19. : m_iNumColumns( 0 )
  20. , m_iSortColumn( -1 )
  21. , m_bSortAscending( TRUE )
  22. ,blnMenu(TRUE)
  23. ,itemX(-1)
  24. ,itemY(-1)
  25. ,blnAllEdit(TRUE)
  26. ,m_EditStyle(ctr_Edit_DblClick)
  27. {
  28. }
  29. CMyListCtrl::~CMyListCtrl()
  30. {
  31. CboArrayIndex.FreeExtra();
  32. strArrayEditStyle.FreeExtra();
  33. for(int i=0;i<CboArrayData.GetSize();i++)
  34. {
  35. CStringArray *strArray=(CStringArray *)CboArrayData.GetAt(i);
  36. strArray->FreeExtra();
  37. }
  38. CboArrayData.FreeExtra();
  39. NumArrayIndex.FreeExtra();
  40. NumArrayData.FreeExtra();
  41. }
  42. BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
  43. //{{AFX_MSG_MAP(CMyListCtrl)
  44. ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
  45. ON_WM_DESTROY()
  46. ON_WM_RBUTTONDOWN( )
  47. ON_WM_LBUTTONDOWN( )
  48. ON_WM_LBUTTONDBLCLK( )
  49. ON_WM_PARENTNOTIFY()
  50. ON_WM_HSCROLL()
  51. ON_WM_VSCROLL()
  52. ON_COMMAND(ID_MENU_list, OnMenuitemlist)
  53. ON_COMMAND(ID_MENU_icon, OnMenuitemicon)
  54. ON_COMMAND(ID_MENU_smallicon, OnMenuitemsmallicon)
  55. ON_COMMAND(ID_MENU_report, OnMenuitemreport)
  56. ON_COMMAND(ID_MENU_No,OnMenuNo)
  57. ON_COMMAND(ID_MENU_Click,OnMenuClick)
  58. ON_COMMAND(ID_MENU_DblClick,OnMenuDblClick)
  59. //}}AFX_MSG_MAP
  60. END_MESSAGE_MAP()
  61. void CMyListCtrl::PreSubclassWindow()
  62. {  
  63. ctl_EditText.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,ID_EditText);
  64. ctl_EditDateTime.Create(ES_AUTOHSCROLL|WS_CHILD|ES_CENTER|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,ID_EditDateTime);
  65.   ctl_EditComboDown.Create(WS_CHILD|CBS_DROPDOWN |WS_VSCROLL | WS_TABSTOP,CRect(0,0,0,0),this,ID_EditCboDown);
  66.   ctl_EditComboDownList.Create(WS_CHILD|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP,CRect(0,0,0,0),this,ID_EditCboList);
  67. ctl_EditNum.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,ID_EditText);
  68. CFont *ft=GetFont();
  69. ctl_EditComboDown.SetFont(ft,TRUE);
  70. ctl_EditText.SetFont(ft,TRUE);
  71. ctl_EditDateTime.SetFont(ft,TRUE);
  72. ctl_EditNum.SetFont(ft,TRUE);
  73. ctl_EditComboDownList.SetFont(ft,TRUE);
  74. ctl_EditComboDownList.SetExtendedUI(TRUE);
  75. ctl_EditComboDown.SetExtendedUI(TRUE);
  76. // ModifyStyle(0,LVS_OWNERDRAWFIXED);
  77. CListCtrl::PreSubclassWindow();
  78. }
  79. //添加一项
  80. int CMyListCtrl::AddItem(int image)
  81. {
  82. LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ];
  83. for(int i=0;i<m_iNumColumns;i++)
  84. {
  85.   arrpsz[ i ] = new TCHAR[1];
  86.   (void)lstrcpy( arrpsz[ i ], "" );
  87. }
  88. int iIndex=InsertItem(GetItemCount(),"",image);
  89. VERIFY( SetTextArray( iIndex, arrpsz ) );
  90. return iIndex;
  91. }
  92. //设置排列方式
  93. void CMyListCtrl::SetMyStyle(DWORD dwNewStyle)
  94. {
  95. if(itemX>=0&& itemY>=0)
  96. SetEditPos(FALSE,itemX,itemY,FALSE);
  97. DWORD oldStyle;
  98. oldStyle=GetWindowLong(GetSafeHwnd(),GWL_STYLE);
  99. if((oldStyle&LVS_TYPEMASK)!=dwNewStyle)
  100. {
  101. oldStyle&=~LVS_TYPEMASK;
  102. oldStyle|=dwNewStyle;
  103. SetWindowLong(GetSafeHwnd(),GWL_STYLE,oldStyle);
  104. }
  105. }
  106. //返回排列方式
  107. DWORD CMyListCtrl::GetMyStyle()
  108. {
  109. DWORD oldStyle,newStyle;
  110. oldStyle=GetWindowLong(GetSafeHwnd(),GWL_STYLE);
  111. newStyle=oldStyle&LVS_TYPEMASK;
  112. return newStyle;
  113. }
  114. void CMyListCtrl::OnMenuitemlist()
  115. {
  116. SetMyStyle(LVS_LIST);
  117. }
  118. void CMyListCtrl::OnMenuitemicon()
  119. {
  120. SetMyStyle(LVS_ICON);
  121. }
  122. void CMyListCtrl::OnMenuitemreport()
  123. {
  124. SetMyStyle(LVS_REPORT);
  125. }
  126. void CMyListCtrl::OnMenuitemsmallicon()
  127. {
  128. SetMyStyle(LVS_SMALLICON);
  129. }
  130. void CMyListCtrl::OnMenuClick ()
  131. {
  132. m_EditStyle=ctr_Edit_Click;
  133. SetEditPos(FALSE,itemX,itemY,FALSE);
  134. }
  135. void CMyListCtrl::OnMenuDblClick()
  136. {
  137. m_EditStyle=ctr_Edit_DblClick;
  138. SetEditPos(FALSE,itemX,itemY,FALSE);
  139. }
  140. void CMyListCtrl::OnMenuNo()
  141. {
  142. if(m_EditStyle==ctr_Edit_No) return;
  143. m_EditStyle=ctr_Edit_No;
  144. if(!blnAllEdit) return;
  145. if(itemY<0) return;
  146. CString strText;
  147. switch(GetColumnStyle(itemY))
  148. {
  149. case ctr_Edit_CboDownList:
  150. ctl_EditComboDownList.ShowDropDown(FALSE);
  151. ctl_EditComboDownList.GetWindowText(strText);
  152. SetItemText(itemX,itemY,strText);
  153. ctl_EditComboDownList.ShowWindow(SW_HIDE);
  154. break;
  155. case ctr_Edit_CboDown:
  156. ctl_EditComboDown.ShowDropDown(FALSE);
  157. ctl_EditComboDown.GetWindowText(strText);
  158. SetItemText(itemX,itemY,strText);
  159. ctl_EditComboDown.ShowWindow(SW_HIDE);
  160. break;
  161. case ctr_Edit_Text:
  162. ctl_EditText.GetWindowText(strText);
  163. SetItemText(itemX,itemY,strText);
  164. ctl_EditText.ShowWindow(SW_HIDE);
  165. break;
  166. case ctr_Edit_Time:
  167. strText=ctl_EditDateTime.GetDetectText();
  168. SetItemText(itemX,itemY,strText);
  169. ctl_EditDateTime.ShowWindow(SW_HIDE);
  170. break;
  171. case ctr_Edit_Date:
  172. strText=ctl_EditDateTime.GetDetectText();
  173. SetItemText(itemX,itemY,strText);
  174. ctl_EditDateTime.ShowWindow(SW_HIDE);
  175. case ctr_Edit_DateTime:
  176. strText=ctl_EditDateTime.GetDetectText();
  177. SetItemText(itemX,itemY,strText);
  178. ctl_EditDateTime.ShowWindow(SW_HIDE);
  179. break;
  180. case ctr_Edit_Num:
  181. strText=ctl_EditNum.GetText();
  182. SetItemText(itemX,itemY,strText);
  183. ctl_EditNum.ShowWindow(SW_HIDE);
  184. break;
  185. default:
  186. ctl_EditText.ShowWindow(SW_HIDE);
  187. ctl_EditDateTime.ShowWindow(SW_HIDE);
  188. ctl_EditComboDown.ShowWindow(SW_HIDE);
  189. ctl_EditNum.ShowWindow(SW_HIDE);
  190. break;
  191. }
  192. }
  193. //右键单击显示菜单
  194. void CMyListCtrl::OnLButtonDblClk( UINT nFlags, CPoint point )
  195. {
  196. if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
  197. if(m_EditStyle==ctr_Edit_DblClick)
  198. {
  199. int i=itemY;
  200. BOOL bln;
  201. if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
  202. GetItemPos(point);
  203. bln=(i==itemY);
  204. SetEditPos(TRUE,itemX,itemY,bln);
  205. }
  206. CListCtrl::OnLButtonDblClk(nFlags,point);
  207. }
  208. void CMyListCtrl::OnLButtonDown( UINT nFlags, CPoint point )
  209. {
  210. if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
  211. if(m_EditStyle==ctr_Edit_Click)
  212. {
  213. int i=itemY;
  214. BOOL bln;
  215. if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
  216. GetItemPos(point);
  217. bln=(i==itemY);
  218. SetEditPos(TRUE,itemX,itemY,bln); }
  219. CListCtrl::OnLButtonDown(nFlags,point);
  220. }
  221. void CMyListCtrl::GetItemPos(CPoint point)
  222. {
  223. LVHITTESTINFO lvhti;
  224.     lvhti.pt = point;
  225. int nItem = CListCtrl::SubItemHitTest(&lvhti);
  226. if(nItem == -1)
  227.    return;
  228. int nSubItem = lvhti.iSubItem;
  229. itemX=nItem;
  230. itemY=nSubItem;
  231. }
  232. void CMyListCtrl::SetEditPos(BOOL blnShow,int itemX,int itemY,BOOL blnCbo)
  233. {
  234. if(!blnAllEdit) return;
  235. if(itemX<0||itemY<0) return;
  236. if(m_EditStyle==ctr_Edit_No) return;
  237. CString strText;
  238. int i;
  239. if(GetMyStyle()!=LVS_REPORT) return;
  240. if(!blnShow)
  241. {
  242. switch(GetColumnStyle(itemY))
  243. {
  244. case ctr_Edit_CboDownList:
  245. ctl_EditComboDownList.ShowDropDown(FALSE);
  246. ctl_EditComboDownList.GetWindowText(strText);
  247. SetItemText(itemX,itemY,strText);
  248. ctl_EditComboDownList.ShowWindow(SW_HIDE);
  249. break;
  250. case ctr_Edit_CboDown:
  251. ctl_EditComboDown.ShowDropDown(FALSE);
  252. ctl_EditComboDown.GetWindowText(strText);
  253. SetItemText(itemX,itemY,strText);
  254. ctl_EditComboDown.ShowWindow(SW_HIDE);
  255. break;
  256. case ctr_Edit_Text:
  257. ctl_EditText.GetWindowText(strText);
  258. SetItemText(itemX,itemY,strText);
  259. ctl_EditText.ShowWindow(SW_HIDE);
  260. break;
  261. case ctr_Edit_Time:
  262. strText=ctl_EditDateTime.GetDetectText();
  263. SetItemText(itemX,itemY,strText);
  264. ctl_EditDateTime.ShowWindow(SW_HIDE);
  265. break;
  266. case ctr_Edit_Date:
  267. strText=ctl_EditDateTime.GetDetectText();
  268. SetItemText(itemX,itemY,strText);
  269. ctl_EditDateTime.ShowWindow(SW_HIDE);
  270. case ctr_Edit_DateTime:
  271. strText=ctl_EditDateTime.GetDetectText();
  272. SetItemText(itemX,itemY,strText);
  273. ctl_EditDateTime.ShowWindow(SW_HIDE);
  274. break;
  275. case ctr_Edit_Num:
  276. strText=ctl_EditNum.GetText();
  277. SetItemText(itemX,itemY,strText);
  278. ctl_EditNum.ShowWindow(SW_HIDE);
  279. break;
  280. default:
  281. ctl_EditText.ShowWindow(SW_HIDE);
  282. ctl_EditDateTime.ShowWindow(SW_HIDE);
  283. ctl_EditComboDown.ShowWindow(SW_HIDE);
  284. ctl_EditNum.ShowWindow(SW_HIDE);
  285. break;
  286. }
  287. //Invalidate(TRUE);
  288. return;
  289. }
  290. CRect rcCtrl;
  291. strText=GetItemText(itemX,itemY);
  292. CListCtrl::GetSubItemRect(itemX,itemY,LVIR_LABEL,rcCtrl);
  293. switch(GetColumnStyle(itemY))
  294. {
  295. case ctr_Edit_CboDownList:
  296. if(!blnCbo) FillCboData(itemY);
  297. rcCtrl.bottom=rcCtrl.top+150;
  298. i=ctl_EditComboDownList.FindString(0,strText);
  299. if(i>=0) 
  300. ctl_EditComboDownList.SetCurSel(i);
  301. else 
  302. ctl_EditComboDownList.SetCurSel(0);
  303. ctl_EditComboDownList.MoveWindow(rcCtrl,TRUE);
  304. ctl_EditComboDownList.ShowWindow(SW_SHOW);
  305. ::SetFocus(ctl_EditComboDownList.m_hWnd);
  306. break;
  307. case ctr_Edit_CboDown:
  308. if(!blnCbo) FillCboData(itemY);
  309. rcCtrl.bottom=rcCtrl.top+150;
  310. i=ctl_EditComboDown.FindString(0,strText);
  311. if(i>=0) ctl_EditComboDown.SetCurSel(i);
  312. ctl_EditComboDown.SetWindowText(strText);
  313. ctl_EditComboDown.MoveWindow(rcCtrl,TRUE);
  314. ctl_EditComboDown.ShowWindow(SW_SHOW);
  315. ::SetFocus(ctl_EditComboDown.m_hWnd);
  316. break;
  317. case ctr_Edit_Date:
  318. ctl_EditDateTime.SetClassType(edit_date);
  319. ctl_EditDateTime.SetDetectText(strText);
  320. ctl_EditDateTime.MoveWindow(rcCtrl,TRUE);
  321. ctl_EditDateTime.ShowWindow(SW_SHOW);
  322. ::SetFocus(ctl_EditDateTime.m_hWnd);
  323. ctl_EditDateTime.SetSel(0,strText.GetLength(),TRUE);
  324. break;
  325. case ctr_Edit_DateTime:
  326. ctl_EditDateTime.SetClassType(edit_datetime);
  327. ctl_EditDateTime.SetDetectText(strText);
  328. ctl_EditDateTime.MoveWindow(rcCtrl,TRUE);
  329. ctl_EditDateTime.ShowWindow(SW_SHOW);
  330. ::SetFocus(ctl_EditDateTime.m_hWnd);
  331. ctl_EditDateTime.SetSel(0,strText.GetLength(),TRUE);
  332. break;
  333. case ctr_Edit_Time:
  334. ctl_EditDateTime.SetClassType(edit_time);
  335. ctl_EditDateTime.SetDetectText(strText);
  336. ctl_EditDateTime.MoveWindow(rcCtrl,TRUE);
  337. ctl_EditDateTime.ShowWindow(SW_SHOW);
  338. ::SetFocus(ctl_EditDateTime.m_hWnd);
  339. ctl_EditDateTime.SetSel(0,strText.GetLength(),TRUE);
  340. break;
  341. case ctr_Edit_Text:
  342. ctl_EditText.SetWindowText(strText);
  343. ctl_EditText.MoveWindow(rcCtrl,TRUE);
  344. ctl_EditText.ShowWindow(SW_SHOW);
  345. ::SetFocus(ctl_EditText.m_hWnd);
  346. ctl_EditText.SetSel(0,strText.GetLength(),TRUE);
  347. break;
  348. case ctr_Edit_Num:
  349. ctl_EditNum.blnAuto=GetNumEditAuto(itemY);
  350. ctl_EditNum.SetNumType(GetNumEditStyle(itemY)->x,GetNumEditStyle(itemY)->y);
  351. ctl_EditNum.SetText(strText);
  352. ctl_EditNum.MoveWindow(rcCtrl,TRUE);
  353. ctl_EditNum.ShowWindow(SW_SHOW);
  354. ::SetFocus(ctl_EditNum.m_hWnd);
  355. ctl_EditNum.SetSel(0,strText.GetLength(),TRUE);
  356. break;
  357. default:
  358. break;
  359. }
  360. }
  361. void CMyListCtrl::SetItemFont(CFont ft)
  362. {
  363. ctl_EditComboDown.SetFont(&ft,TRUE);
  364. ctl_EditText.SetFont(&ft,TRUE);
  365. ctl_EditDateTime.SetFont(&ft,TRUE);
  366. ctl_EditNum.SetFont(&ft,TRUE);
  367. ctl_EditComboDownList.SetFont(&ft,TRUE);
  368. }
  369. void CMyListCtrl::OnRButtonDown( UINT nFlags, CPoint point )
  370. {
  371. if(!blnMenu) return;
  372. CMenu m_MyRightMenu;
  373. m_MyRightMenu.CreatePopupMenu();
  374. m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_No,"无模式");
  375. m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_Click,"单击模式");
  376. m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_DblClick,"双击模式");
  377. m_MyRightMenu.AppendMenu(MF_SEPARATOR,ID_MENU_sep,"");
  378. m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_icon,"大图标");
  379. m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_smallicon,"小图标");
  380. m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_list,"列表");
  381. m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_report,"详细信息");
  382. DWORD newStyle=GetMyStyle();
  383. switch(newStyle)
  384. {
  385. case LVS_ICON:
  386. m_MyRightMenu.CheckMenuItem(ID_MENU_icon,MF_CHECKED);
  387. break;
  388. case LVS_SMALLICON:
  389. m_MyRightMenu.CheckMenuItem(ID_MENU_smallicon,MF_CHECKED);
  390. break;
  391. case LVS_LIST:
  392. m_MyRightMenu.CheckMenuItem(ID_MENU_list,MF_CHECKED);
  393. break;
  394. case LVS_REPORT:
  395. m_MyRightMenu.CheckMenuItem(ID_MENU_report,MF_CHECKED);
  396. break;
  397. default:
  398. break;
  399. }
  400. ClientToScreen(&point);
  401. m_MyRightMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this,NULL);
  402. m_MyRightMenu.DestroyMenu();
  403. CListCtrl::OnRButtonDown(nFlags,point);
  404. }
  405. //添加单列
  406. int CMyListCtrl::InsertColumnX(CString strName,int nFormat,int iWidth,int intEdit)
  407. {
  408. int i;
  409. i=InsertColumn( m_iNumColumns++, strName, nFormat, iWidth );
  410. if(i!=-1)
  411. {
  412. CString str;
  413. str.Format("%d",intEdit);
  414. strArrayEditStyle.InsertAt(i,str);
  415. if(intEdit==ctr_Edit_CboDown||intEdit==ctr_Edit_CboDownList)
  416. {
  417. CStringArray *strArray=new CStringArray;
  418. str.Format("%d",i);
  419. i=CboArrayIndex.GetSize();
  420. CboArrayIndex.InsertAt(i,str);
  421. CboArrayData.InsertAt(i,strArray);
  422. }
  423. if(intEdit==ctr_Edit_Num)
  424. {
  425. str.Format("%d",i);
  426. i=NumArrayIndex.GetSize();
  427. NumArrayIndex.InsertAt(i,str);
  428. CPoint *pt=new CPoint(10,0);
  429. NumArrayData.InsertAt(i,(CObject *)pt);
  430. str="0";
  431. NumArrayAuto.InsertAt(i,str);
  432. }
  433. }
  434. return i;
  435. }
  436. void CMyListCtrl::AddCboItem(int nItem,CString strText)
  437. {
  438. CStringArray *strArray=GetCboArrayData(nItem);
  439. strArray->Add(strText);
  440. }
  441. void CMyListCtrl::RemoveCboItem(int nitem,CString strText)
  442. {
  443. CStringArray *strArray=GetCboArrayData(nitem);
  444. for(int i=0;i<strArray->GetSize();i++)
  445. {
  446. if(strArray->GetAt(i)==strText)
  447. {
  448. strArray->RemoveAt(i,strText.GetLength());
  449. return;
  450. }
  451. }
  452. }
  453. void CMyListCtrl::SetNumEditAuto(int nitem,BOOL blnAuto)
  454. {
  455. if(GetColumnStyle(nitem)!=ctr_Edit_Num) return;
  456. CString str;
  457. str.Format("%d",nitem);
  458. int i=0;
  459. while(NumArrayIndex.GetAt(i)!=str && i<NumArrayIndex.GetSize())
  460. {
  461. i=i+1;
  462. }
  463. if(i==NumArrayIndex.GetSize() && NumArrayIndex.GetAt(i)!=str) return;
  464. if(blnAuto)
  465. str="1";
  466. else
  467. str="0";
  468. NumArrayAuto.SetAt(i,str);
  469. }
  470. BOOL CMyListCtrl::GetNumEditAuto(int nitem)
  471. {
  472. if(GetColumnStyle(nitem)!=ctr_Edit_Num) return NULL;
  473. CString str;
  474. str.Format("%d",nitem);
  475. int i=0;
  476. while(NumArrayIndex.GetAt(i)!=str && i<NumArrayIndex.GetSize())
  477. {
  478. i=i+1;
  479. }
  480. if(i==NumArrayIndex.GetSize() && NumArrayIndex.GetAt(i)!=str) return NULL;
  481. str=NumArrayAuto.GetAt(i);
  482. BOOL bln;
  483. if(str=="1")
  484. bln=TRUE;
  485. else
  486. bln=FALSE;
  487. return bln;
  488. }
  489. void CMyListCtrl::SetNumEditStyle(int nitem,int intLeft,int intRight)
  490. {
  491. CPoint *pt=GetNumEditStyle(nitem);
  492. pt->x=intLeft;
  493. pt->y=intRight;
  494. }
  495. CPoint *CMyListCtrl::GetNumEditStyle(int nitem)
  496. {
  497. CString str;
  498. str.Format("%d",nitem);
  499. int i=0;
  500. while(NumArrayIndex.GetAt(i)!=str && i<NumArrayIndex.GetSize())
  501. {
  502. i=i+1;
  503. }
  504. if(i==NumArrayIndex.GetSize() && NumArrayIndex.GetAt(i)!=str) return NULL;
  505. CPoint *pt1=(CPoint *)NumArrayData.GetAt(i);
  506. return pt1;
  507. }
  508. void CMyListCtrl::FillCboData(int nitem)
  509. {
  510. //ctl_EditComboDown.DeleteString()
  511. if(GetColumnStyle(nitem)==ctr_Edit_CboDown)
  512. {
  513. ctl_EditComboDown.ShowDropDown(FALSE);
  514. ctl_EditComboDown.ResetContent();
  515. CStringArray *strArry=GetCboArrayData(nitem);
  516. for(int i=0;i<strArry->GetSize();i++)
  517. {
  518. ctl_EditComboDown.AddString(strArry->GetAt(i));
  519. }
  520. }
  521. if(GetColumnStyle(nitem)==ctr_Edit_CboDownList)
  522. {
  523. ctl_EditComboDownList.ShowDropDown(FALSE);
  524. ctl_EditComboDownList.ResetContent();
  525. ctl_EditComboDownList.AddString("");
  526. CStringArray *strArry=GetCboArrayData(nitem);
  527. for(int i=0;i<strArry->GetSize();i++)
  528. {
  529. ctl_EditComboDownList.AddString(strArry->GetAt(i));
  530. }
  531. }
  532. }
  533. CStringArray *CMyListCtrl::GetCboArrayData(int nitem)
  534. {
  535. CString str;
  536. str.Format("%d",nitem);
  537. int i=0;
  538. while(CboArrayIndex.GetAt(i)!=str && i<CboArrayIndex.GetSize())
  539. {
  540. i=i+1;
  541. }
  542. if(i==CboArrayIndex.GetSize() && CboArrayIndex.GetAt(i)!=str) return NULL;
  543. CStringArray *strArray=(CStringArray *)CboArrayData.GetAt(i);
  544. return strArray;
  545. }
  546. //设置单列
  547. void CMyListCtrl::SetColumnStyle(int item,int intEdit)
  548. {
  549. CString str;
  550. str.Format("%d",intEdit);
  551. strArrayEditStyle.SetAt(item,str);
  552. }
  553. //得到单列
  554. int CMyListCtrl::GetColumnStyle(int item)
  555. {
  556. CString str;
  557. str=strArrayEditStyle.GetAt(item);
  558. return(atoi(str));
  559. }
  560. //设置列头
  561. BOOL CMyListCtrl::SetHeader()
  562. {
  563. VERIFY( m_ctlHeader.SubclassWindow( GetHeaderCtrl()->GetSafeHwnd() ) );
  564. m_ctlHeader.SetDefault();
  565. return TRUE;
  566. }
  567. //释放内存
  568. void CMyListCtrl::FreeItemMemory( const int iItem )
  569. {
  570.   ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( iItem ) ); 
  571.   LPTSTR* arrpsz = pid->arrpsz;
  572.   for( int i = 0; i < m_iNumColumns; i++ )
  573.     delete[] arrpsz[ i ];
  574.   delete[] arrpsz;
  575.   delete pid;
  576.   VERIFY( CListCtrl::SetItemData( iItem, NULL ) );
  577. }
  578. //删除单项
  579. BOOL CMyListCtrl::DeleteItem( int iItem )
  580. {
  581.   FreeItemMemory( iItem );
  582.   return CListCtrl::DeleteItem( iItem );
  583. }
  584. //删除单项
  585. BOOL CMyListCtrl::DeleteAllItems()
  586. {
  587.   for( int iItem = 0; iItem < GetItemCount(); iItem ++ )
  588.     FreeItemMemory( iItem );
  589.   
  590.   return CListCtrl::DeleteAllItems();
  591. }
  592. //数字型的判断
  593. bool IsNumber( LPCTSTR pszText )
  594. {
  595.   ASSERT_VALID_STRING(pszText);
  596.   int iDotCount=0;
  597.   for(int i=0;i<lstrlen(pszText);i++){
  598.     if(!_istdigit(pszText[i])){
  599.       if(pszText[i]!='.')
  600.         return false;
  601.       iDotCount++;
  602.       if(iDotCount>1)return false;
  603.     }
  604.   }
  605.   return true;
  606. }
  607. //数字型的比较
  608. int NumberCompare( LPCTSTR pszNumber1, LPCTSTR pszNumber2 )
  609. {
  610.   ASSERT_VALID_STRING(pszNumber1);
  611.   ASSERT_VALID_STRING(pszNumber2);
  612.   const double fNumber1=atof(pszNumber1);
  613.   const double fNumber2=atof(pszNumber2);
  614.   if(fNumber1<fNumber2)
  615.     return -1;
  616.   else if(fNumber1>fNumber2)
  617.     return 1;
  618.   return 0;
  619. }
  620. //时间性的判断
  621. bool IsTime(LPCTSTR pszText)
  622. {
  623.   ASSERT_VALID_STRING( pszText );
  624.   if( lstrlen( pszText ) != 8 )
  625.     return false;
  626.   
  627.   return _istdigit(pszText[0])
  628.     && _istdigit(pszText[1])
  629.     && pszText[2]==_T(':')
  630.     && _istdigit( pszText[ 3 ] )
  631.     && _istdigit( pszText[ 4 ] )
  632.     && pszText[5]==_T(':')
  633.     && _istdigit( pszText[ 6 ] )
  634.     && _istdigit( pszText[ 7 ] );
  635. }
  636. //日期型的判断
  637. bool IsDate( LPCTSTR pszText )
  638. {
  639.   ASSERT_VALID_STRING( pszText );
  640.   if( lstrlen( pszText ) != 10 )
  641.     return false;
  642.   
  643.   return _istdigit(pszText[0])
  644.     && _istdigit(pszText[1])
  645.     && pszText[2]==_T('-')
  646.     && _istdigit( pszText[ 3 ] )
  647.     && _istdigit( pszText[ 4 ] )
  648.     && pszText[5]==_T('-')
  649.     && _istdigit( pszText[ 6 ] )
  650.     && _istdigit( pszText[ 7 ] )
  651.     && _istdigit( pszText[ 8 ] )
  652.     && _istdigit( pszText[ 9 ] );
  653. }
  654. //日期时间型的判断
  655. bool IsDateTime(LPCTSTR pszText)
  656. {
  657.   ASSERT_VALID_STRING( pszText );
  658.   if( lstrlen( pszText ) != 18 )
  659.     return false;
  660.   return _istdigit(pszText[0])
  661.     && _istdigit(pszText[1])
  662.     && pszText[2]==_T(':')
  663.     && _istdigit( pszText[ 3 ] )
  664.     && _istdigit( pszText[ 4 ] )
  665.     && pszText[5]==_T(':')
  666.     && _istdigit( pszText[ 6 ] )
  667.     && _istdigit( pszText[ 7 ] )
  668. && _istdigit(pszText[ 8 ])
  669. && _istdigit(pszText[9])
  670.     && _istdigit(pszText[10])
  671.     && pszText[11]==_T('-')
  672.     && _istdigit( pszText[ 12 ] )
  673.     && _istdigit( pszText[ 13] )
  674.     && pszText[14]==_T('-')
  675.     && _istdigit( pszText[ 15 ] )
  676.     && _istdigit( pszText[ 16 ] )
  677.     && _istdigit( pszText[ 17 ] )
  678.     && _istdigit( pszText[ 18 ] );
  679. }
  680. //日期和时间性的比较
  681. int DateTimeComPare(const CString &strTime1,const CString &strTime2)
  682. {
  683.   const int iHour1=atoi(strTime1.Mid(6, 2));
  684.   const int iHour2=atoi(strTime2.Mid(6, 2));
  685.   if(iHour1<iHour2)
  686.     return -1;
  687.   else if(iHour1>iHour2)
  688.     return 1;
  689.   const int iMin1=atoi(strTime1.Mid(3, 2));
  690.   const int iMin2=atoi(strTime2.Mid(3, 2));
  691.   if(iMin1<iMin2)
  692.     return -1;  
  693.   else if(iMin1>iMin2)
  694.     return 1;
  695.   const int iSec1=atoi(strTime1.Mid(0, 2));
  696.   const int iSec2=atoi(strTime2.Mid(0, 2));
  697.   if(iSec1<iSec2)
  698.     return -1;
  699.   else if(iSec1>iSec2)
  700.     return 1;
  701.   const int iYear1=atoi(strTime1.Mid(15, 4));
  702.   const int iYear2=atoi(strTime2.Mid(15, 4));
  703.   
  704.   if(iYear1<iYear2)
  705.     return -1;
  706.   else if(iYear1>iYear2)
  707.     return 1;
  708.   
  709.   const int iMonth1=atoi(strTime1.Mid(12, 2));
  710.   const int iMonth2=atoi(strTime2.Mid(12, 2));
  711.   
  712.   if(iMonth1<iMonth2)
  713.     return -1;  
  714.   else if(iMonth1>iMonth2)
  715.     return 1;
  716.   
  717.   const int iDay1=atoi(strTime1.Mid(9, 2));
  718.   const int iDay2=atoi(strTime2.Mid(9, 2));
  719.   
  720.   if(iDay1<iDay2)
  721.     return -1;
  722.   else if(iDay1>iDay2)
  723.     return 1;
  724.   return 0;
  725. }
  726. //时间型的比较
  727. int TimeCompare(const CString &strTime1,const CString &strTime2)
  728. {
  729.   const int iHour1=atoi(strTime1.Mid(6, 2));
  730.   const int iHour2=atoi(strTime2.Mid(6, 2));
  731.   
  732.   if(iHour1<iHour2)
  733.     return -1;
  734.   else if(iHour1>iHour2)
  735.     return 1;
  736.   const int iMin1=atoi(strTime1.Mid(3, 2));
  737.   const int iMin2=atoi(strTime2.Mid(3, 2));
  738.   if(iMin1<iMin2)
  739.     return -1;  
  740.   else if(iMin1>iMin2)
  741.     return 1;
  742.   const int iSec1=atoi(strTime1.Mid(0, 2));
  743.   const int iSec2=atoi(strTime2.Mid(0, 2));
  744.   if(iSec1<iSec2)
  745.     return -1;
  746.   else if(iSec1>iSec2)
  747.     return 1;
  748.   return 0;
  749. }
  750. //日期型的比较
  751. int DateCompare( const CString& strDate1, const CString& strDate2 )
  752. {
  753.   const int iYear1=atoi(strDate1.Mid(6, 4));
  754.   const int iYear2=atoi(strDate2.Mid(6, 4));
  755.   
  756.   if(iYear1<iYear2)
  757.     return -1;
  758.   else if(iYear1>iYear2)
  759.     return 1;
  760.   
  761.   const int iMonth1=atoi(strDate1.Mid(3, 2));
  762.   const int iMonth2=atoi(strDate2.Mid(3, 2));
  763.   
  764.   if(iMonth1<iMonth2)
  765.     return -1;  
  766.   else if(iMonth1>iMonth2)
  767.     return 1;
  768.   
  769.   const int iDay1=atoi(strDate1.Mid(0, 2));
  770.   const int iDay2=atoi(strDate2.Mid(0, 2));
  771.   
  772.   if(iDay1<iDay2)
  773.     return -1;
  774.   else if(iDay1>iDay2)
  775.     return 1;
  776.   return 0;
  777. }
  778. int CALLBACK CMyListCtrl::CompareFunction( LPARAM lParam1, LPARAM lParam2, LPARAM lParamData )
  779. {
  780.   CMyListCtrl* pListCtrl = reinterpret_cast<CMyListCtrl*>( lParamData );
  781.   ASSERT( pListCtrl->IsKindOf( RUNTIME_CLASS( CListCtrl ) ) );
  782.   
  783.   ItemData* pid1 = reinterpret_cast<ItemData*>( lParam1 );
  784.   ItemData* pid2 = reinterpret_cast<ItemData*>( lParam2 );
  785.   
  786.   ASSERT( pid1 );
  787.   ASSERT( pid2 );
  788.   
  789.   LPCTSTR pszText1 = pid1->arrpsz[ pListCtrl->m_iSortColumn ];
  790.   LPCTSTR pszText2 = pid2->arrpsz[ pListCtrl->m_iSortColumn ];
  791.   
  792.   ASSERT_VALID_STRING( pszText1 );
  793.   ASSERT_VALID_STRING( pszText2 );
  794.   
  795. if(IsNumber(pszText1))
  796.     return pListCtrl->m_bSortAscending ? NumberCompare( pszText1, pszText2 ) : NumberCompare( pszText2, pszText1 );
  797. else if(IsDate(pszText1))
  798.     return pListCtrl->m_bSortAscending ? DateCompare( pszText1, pszText2 ) : DateCompare( pszText2, pszText1 );
  799. else if(IsTime(pszText1))
  800.     return pListCtrl->m_bSortAscending ? TimeCompare( pszText1, pszText2 ) : TimeCompare( pszText2, pszText1 );
  801. else if(IsDateTime(pszText1))
  802.     return pListCtrl->m_bSortAscending ? DateTimeComPare( pszText1, pszText2 ) : DateTimeComPare( pszText2, pszText1 );
  803.     else
  804. return pListCtrl->m_bSortAscending ? lstrcmp( pszText1, pszText2 ) : lstrcmp( pszText2, pszText1 );
  805. }
  806. void CMyListCtrl::OnColumnClick( NMHDR* pNMHDR, LRESULT* pResult )
  807. {
  808. SetEditPos(FALSE,itemX,itemY,FALSE);
  809. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  810. const int iColumn = pNMListView->iSubItem;
  811. Sort( iColumn, iColumn == m_iSortColumn ? !m_bSortAscending : TRUE );
  812. *pResult = 0;
  813. }
  814. void CMyListCtrl::Sort( int iColumn, BOOL bAscending )
  815. {
  816.   m_iSortColumn = iColumn;
  817.   m_bSortAscending = bAscending;
  818.   m_ctlHeader.SetSortArrow( m_iSortColumn, m_bSortAscending );
  819.   VERIFY( SortItems( CompareFunction, reinterpret_cast<DWORD>( this ) ) );
  820. }
  821. void CMyListCtrl::OnDestroy() 
  822. {
  823.   for( int iItem = 0; iItem < GetItemCount(); iItem ++ )
  824.     FreeItemMemory( iItem );
  825.   
  826.   CListCtrl::OnDestroy();
  827. }
  828. BOOL CMyListCtrl::SetItemText( int nItem, int nSubItem, LPCTSTR lpszText )
  829. {
  830.   if( !CListCtrl::SetItemText( nItem, nSubItem, lpszText ) )
  831.     return FALSE;
  832.   
  833.   LPTSTR* arrpsz = GetTextArray( nItem );
  834.   LPTSTR pszText = arrpsz[ nSubItem ];
  835.   delete[] pszText;
  836.   pszText = new TCHAR[ lstrlen( lpszText ) + 1 ];
  837.   (void)lstrcpy( pszText, lpszText );
  838.   arrpsz[ nSubItem ] = pszText;
  839.   
  840.   return TRUE;
  841. }
  842. BOOL CMyListCtrl::SetItemData( int nItem, DWORD dwData )
  843. {
  844.   if( nItem >= GetItemCount() )
  845.     return FALSE;
  846.   
  847.   ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( nItem ) );
  848.   ASSERT( pid );
  849.   pid->dwData = dwData;
  850.   
  851.   return TRUE;
  852. }
  853. DWORD CMyListCtrl::GetItemData( int nItem ) const
  854. {
  855.   ASSERT( nItem < GetItemCount() );
  856.   
  857.   ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( nItem ) );
  858.   ASSERT( pid );
  859.   return pid->dwData;
  860. }
  861. BOOL CMyListCtrl::SetTextArray( int iItem, LPTSTR* arrpsz )
  862. {
  863.   ASSERT( CListCtrl::GetItemData( iItem ) == NULL );
  864.   ItemData* pid = new ItemData;
  865.   pid->arrpsz = arrpsz;
  866.   return CListCtrl::SetItemData( iItem, reinterpret_cast<DWORD>( pid ) );
  867. }
  868. LPTSTR* CMyListCtrl::GetTextArray( int iItem ) const
  869. {
  870.   ASSERT( iItem < GetItemCount() );
  871.   
  872.   ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( iItem ) );
  873.   return pid->arrpsz;
  874. }
  875. void CMyListCtrl::SetShowMenu(BOOL blnShow)
  876. {
  877. blnMenu=blnShow;
  878. }
  879. BOOL CMyListCtrl::PreTranslateMessage(MSG* pMsg)
  880. {
  881. int i=itemX,j=itemY;
  882. CRect rcCtrl;
  883. if(pMsg->message == WM_KEYDOWN)
  884. {
  885. if(pMsg->wParam == VK_TAB)
  886. {
  887. if((itemY+1)<=m_iNumColumns)
  888. {
  889. SetEditPos(FALSE,i,j,FALSE);
  890. if(FALSE == Key_Ctrl(i,j))
  891.                     Key_Shift(i,j);
  892. CListCtrl::GetSubItemRect(i,j,LVIR_LABEL,rcCtrl); 
  893. if(m_EditStyle==ctr_Edit_Click)
  894. OnLButtonDown(0,CPoint(rcCtrl.left+1,rcCtrl.top+1));
  895. else
  896. OnLButtonDblClk(0,CPoint(rcCtrl.left+1,rcCtrl.top+1));
  897. POSITION pos = CListCtrl::GetFirstSelectedItemPosition();
  898.  if (pos == NULL)
  899.  {
  900.  }
  901.  else
  902.  {
  903.  while (pos)
  904.  {
  905.  int ntpItem = CListCtrl::GetNextSelectedItem(pos);
  906.  CListCtrl::SetItemState(ntpItem,0,LVIS_SELECTED);
  907.  }
  908.  }
  909.  CListCtrl::SetItemState(i,  LVIS_SELECTED,  LVIS_SELECTED);
  910. return TRUE;
  911. }
  912. }
  913. else if(pMsg->wParam == VK_RETURN)
  914. {
  915. short sRet = GetKeyState(VK_CONTROL);
  916. sRet = sRet >>15;
  917. if(sRet == 0) 
  918. {
  919. if(GetColumnStyle(j)!=ctr_Edit_No)
  920. {
  921. SetEditPos(FALSE,i,j,FALSE);
  922. Key_Shift(i,j);
  923. CListCtrl::GetSubItemRect(i,j,LVIR_LABEL,rcCtrl); 
  924. if(m_EditStyle==ctr_Edit_Click)
  925. OnLButtonDown(0,CPoint(rcCtrl.left+1,rcCtrl.top+1));
  926. else
  927. OnLButtonDblClk(0,CPoint(rcCtrl.left+1,rcCtrl.top+1));
  928. }
  929. return TRUE;
  930. }
  931. else
  932. {
  933. if(GetColumnStyle(j)==ctr_Edit_CboDown)
  934. ctl_EditComboDown.ShowDropDown(TRUE);
  935. if(GetColumnStyle(j)==ctr_Edit_CboDownList)
  936. ctl_EditComboDownList.ShowDropDown(TRUE);
  937. return TRUE;
  938. }
  939. }
  940. if(pMsg->wParam == VK_LEFT)
  941. {
  942. short sRet = GetKeyState(VK_CONTROL);
  943. sRet = sRet >>15;
  944. if(sRet!= 0) 
  945. {
  946. switch(GetColumnStyle(j))
  947. {
  948. case ctr_Edit_No:
  949. break;
  950. case ctr_Edit_Text:
  951. ctl_EditText.SetSel(0,0);
  952. break;
  953. case ctr_Edit_Date:
  954. ctl_EditDateTime.SetSel(0,0);
  955. break;
  956. case ctr_Edit_DateTime:
  957. ctl_EditDateTime.SetSel(0,0);
  958. break;
  959. case ctr_Edit_Time:
  960. ctl_EditDateTime.SetSel(0,0);
  961. break;
  962. case ctr_Edit_CboDown:
  963. ctl_EditComboDown.SetEditSel(0,0);
  964. break;
  965. // case ctr_Edit_CboDownList:
  966. // ctl_EditComboDownList.SetEditSel(0,0);
  967. //  break;
  968. case ctr_Edit_Num:
  969. ctl_EditNum.SetSel(0,0);
  970. break;
  971. }
  972. return TRUE;
  973. }
  974. }
  975. if(pMsg->wParam == VK_RIGHT)
  976. {
  977. short sRet = GetKeyState(VK_CONTROL);
  978. sRet = sRet >>15;
  979. if(sRet!= 0) 
  980. {
  981. switch(GetColumnStyle(j))
  982. {
  983. case ctr_Edit_No:
  984. break;
  985. case ctr_Edit_Text:
  986. ctl_EditText.SetSel(-1);
  987. break;
  988. case ctr_Edit_Date:
  989. ctl_EditDateTime.SetSel(-1);
  990. break;
  991. case ctr_Edit_DateTime:
  992. ctl_EditDateTime.SetSel(-1);
  993. break;
  994. case ctr_Edit_Time:
  995. ctl_EditDateTime.SetSel(-1);
  996. break;
  997. case ctr_Edit_Num:
  998. ctl_EditNum.SetSel(-1);
  999. break;
  1000. case ctr_Edit_CboDown:
  1001. CString str;
  1002. ctl_EditComboDown.GetWindowText(str);
  1003. ctl_EditComboDown.SetEditSel(str.GetLength(),str.GetLength());
  1004. break;
  1005. }
  1006. return TRUE;
  1007. }
  1008. }
  1009. if(pMsg->wParam == VK_DOWN)
  1010. {
  1011. CString strText;
  1012. short sRet = GetKeyState(VK_CONTROL);
  1013. sRet = sRet >>15;
  1014. if(sRet!= 0) 
  1015. {
  1016. switch(GetColumnStyle(j))
  1017. {
  1018. case ctr_Edit_No:
  1019. break;
  1020. case ctr_Edit_Text:
  1021. ctl_EditText.GetWindowText(strText);
  1022. ctl_EditText.SetSel(0,strText.GetLength());
  1023. break;
  1024. case ctr_Edit_Date:
  1025. strText=ctl_EditDateTime.GetDetectText();
  1026. ctl_EditDateTime.SetSel(0,strText.GetLength());
  1027. break;
  1028. case ctr_Edit_DateTime:
  1029. strText=ctl_EditDateTime.GetDetectText();
  1030. ctl_EditDateTime.SetSel(0,strText.GetLength());
  1031. break;
  1032. case ctr_Edit_Time:
  1033. strText=ctl_EditDateTime.GetDetectText();
  1034. ctl_EditDateTime.SetSel(0,strText.GetLength());
  1035. break;
  1036. case ctr_Edit_Num:
  1037. strText=ctl_EditNum.GetText();
  1038. ctl_EditNum.SetSel(0,strText.GetLength());
  1039. break;
  1040. case ctr_Edit_CboDown:
  1041. if(ctl_EditComboDown.GetCount()>0)
  1042. ctl_EditComboDown.SetCurSel(ctl_EditComboDown.GetCount()-1);
  1043. break;
  1044. case ctr_Edit_CboDownList:
  1045. if(ctl_EditComboDownList.GetCount()>0)
  1046. ctl_EditComboDownList.SetCurSel(ctl_EditComboDownList.GetCount()-1);
  1047. break;
  1048. default:
  1049. break;
  1050. }
  1051. return TRUE;
  1052. }
  1053. }
  1054. if(pMsg->wParam == VK_UP)
  1055. {
  1056. CString strText;
  1057. short sRet = GetKeyState(VK_CONTROL);
  1058. sRet = sRet >>15;
  1059. if(sRet!= 0) 
  1060. {
  1061. switch(GetColumnStyle(j))
  1062. {
  1063. case ctr_Edit_No:
  1064. break;
  1065. case ctr_Edit_Text:
  1066. ctl_EditText.GetWindowText(strText);
  1067. ctl_EditText.SetSel(0,strText.GetLength());
  1068. break;
  1069. case ctr_Edit_Date:
  1070. strText=ctl_EditDateTime.GetDetectText();
  1071. ctl_EditDateTime.SetSel(0,strText.GetLength());
  1072. break;
  1073. case ctr_Edit_DateTime:
  1074. strText=ctl_EditDateTime.GetDetectText();
  1075. ctl_EditDateTime.SetSel(0,strText.GetLength());
  1076. break;
  1077. case ctr_Edit_Time:
  1078. strText=ctl_EditDateTime.GetDetectText();
  1079. ctl_EditDateTime.SetSel(0,strText.GetLength());
  1080. break;
  1081. case ctr_Edit_Num:
  1082. strText=ctl_EditNum.GetText();
  1083. ctl_EditNum.SetSel(0,strText.GetLength());
  1084. break;
  1085. case ctr_Edit_CboDown:
  1086. if(ctl_EditComboDown.GetCount()>0)
  1087. ctl_EditComboDown.SetCurSel(0);
  1088. break;
  1089. case ctr_Edit_CboDownList:
  1090. if(ctl_EditComboDownList.GetCount()>0)
  1091. ctl_EditComboDownList.SetCurSel(0);
  1092. break;
  1093. default:
  1094. break;
  1095. }
  1096. return TRUE;
  1097. }
  1098. }
  1099. }
  1100. return CListCtrl::PreTranslateMessage(pMsg);
  1101. }
  1102. void CMyListCtrl::OnParentNotify(UINT message, LPARAM lParam) 
  1103. {
  1104. CListCtrl::OnParentNotify(message, lParam);
  1105. //////////////////////////////////////////////////////////////////////////
  1106. CHeaderCtrl* pHeaderCtrl = CListCtrl::GetHeaderCtrl();
  1107. if(pHeaderCtrl == NULL)
  1108. return;
  1109. CRect rcHeader;
  1110. pHeaderCtrl->GetWindowRect(rcHeader);
  1111. ScreenToClient(rcHeader);
  1112. //The x coordinate is in the low-order word and the y coordinate is in the high-order word.
  1113. CPoint pt;
  1114. pt.x = (int)LOWORD(lParam);
  1115. pt.y = (int)HIWORD(lParam);
  1116. if(rcHeader.PtInRect(pt) && message == WM_LBUTTONDOWN)
  1117. {
  1118. ctl_EditComboDown.ShowWindow(SW_HIDE);
  1119. ctl_EditDateTime.ShowWindow(SW_HIDE);
  1120. ctl_EditText.ShowWindow(SW_HIDE);
  1121. ctl_EditNum.ShowWindow(SW_HIDE);
  1122. }
  1123. }
  1124. BOOL CMyListCtrl::Key_Shift(int& nItem,int& nSub)
  1125. {
  1126. int nItemCount = CListCtrl::GetItemCount();
  1127. CHeaderCtrl* pHeader = CListCtrl::GetHeaderCtrl();
  1128. if(pHeader == NULL)
  1129. return FALSE;
  1130. short sRet = GetKeyState(VK_SHIFT);
  1131. int nSubcCount = pHeader->GetItemCount();
  1132. sRet = sRet >>15;
  1133. if(sRet == 0)
  1134. {
  1135. nSub += 1;
  1136. if(nSub >= nSubcCount)
  1137. {
  1138. if(nItem == nItemCount-1)
  1139. {
  1140. nItem = 0;
  1141. nSub  = 0;
  1142. }
  1143. else
  1144. {
  1145. nSub = 0;
  1146. nItem += 1;
  1147. }
  1148. }
  1149. if(nItem >= nItemCount)
  1150. nItem = nItemCount-1;
  1151. return FALSE;
  1152. }
  1153. else
  1154. {
  1155. nSub -= 1;
  1156. if(nSub < 0)
  1157. {
  1158. nSub = nSubcCount -1;
  1159. nItem --;
  1160. }
  1161. if(nItem < 0)
  1162. nItem = nItemCount-1;
  1163. return TRUE;
  1164. }
  1165. return FALSE;
  1166. }
  1167. BOOL CMyListCtrl::Key_Ctrl(int& nItem,int &nSub)
  1168. {
  1169.     short sRet = GetKeyState(VK_CONTROL);
  1170. sRet = sRet >>15;
  1171. int nItemCount = CListCtrl::GetItemCount();
  1172. if(sRet == 0)
  1173. {
  1174. }
  1175. else
  1176. {
  1177. nItem = nItem >=nItemCount-1? 0:nItem+=1;
  1178. return TRUE;
  1179. }
  1180. return FALSE;
  1181. }
  1182. void CMyListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  1183. {
  1184. SetEditPos(FALSE,itemX,itemY,FALSE);
  1185. CListCtrl::OnHScroll(nSBCode,nPos,pScrollBar);
  1186. }
  1187. void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  1188. {
  1189. SetEditPos(FALSE,itemX,itemY,FALSE);
  1190. CListCtrl::OnVScroll(nSBCode,nPos,pScrollBar);
  1191. }
  1192. void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  1193. {
  1194.     if (!lpDrawItemStruct) return;
  1195. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  1196. CRect rcItem;
  1197.   CFont ft;
  1198. ft.CreateFont(10,10,0,0,
  1199. FW_NORMAL,FALSE,FALSE,FALSE,
  1200. ANSI_CHARSET,
  1201. OUT_DEFAULT_PRECIS,
  1202. CLIP_DEFAULT_PRECIS,
  1203. DEFAULT_QUALITY,
  1204. DEFAULT_PITCH|FF_MODERN,
  1205. "MS Sans Serif");
  1206. GetSubItemRect(lpDrawItemStruct->itemID,0,LVIR_LABEL,rcItem);
  1207. CString str;
  1208. str.Format("%d-----%d",lpDrawItemStruct->itemID,0);
  1209. pDC->SelectObject(&ft);
  1210. pDC->SetTextColor(RGB(255,0,0));
  1211. pDC->TextOut(rcItem.left,rcItem.top,str);
  1212. }