ComboListCtrl2.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. // ComboBoxListCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ComboListCtrl2.h"
  5. #include <windowsx.h>
  6. #include "ylgl.h"
  7. #include "ChooseReason.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #define IDC_ComboBox 0X01
  14. #define PROPERTY_ITEM 0x02
  15. #define PROPERTY_SUB 0x03
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CComboBoxListCtrl2
  18. extern CFont g_listctrlfont;
  19. CComboBoxListCtrl2::CComboBoxListCtrl2()
  20. {
  21. m_ComboBox.m_hWnd = NULL;
  22. m_bNeedSel=0;
  23. }
  24. CComboBoxListCtrl2::~CComboBoxListCtrl2()
  25. {
  26. }
  27. BEGIN_MESSAGE_MAP(CComboBoxListCtrl2, CListCtrl)
  28. //{{AFX_MSG_MAP(CComboBoxListCtrl2)
  29. ON_WM_LBUTTONDBLCLK()
  30. ON_WM_PARENTNOTIFY()
  31. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdrawList)
  32. //}}AFX_MSG_MAP
  33. ON_MESSAGE(WM_USER_ComboBox_END,OnComboBoxEnd)
  34. ON_MESSAGE(WM_USER_EDIT_END,OnEditEnd)
  35. END_MESSAGE_MAP()
  36. #undef SubclassWindow
  37. void CComboBoxListCtrl2::PreSubclassWindow()
  38. {
  39. // the list control must have the report style.
  40. ASSERT( GetStyle() & LVS_REPORT );
  41. CListCtrl::PreSubclassWindow();
  42. VERIFY( m_ctlHeader.SubclassWindow( GetHeaderCtrl()->GetSafeHwnd() ) );
  43. }
  44. void CComboBoxListCtrl2::OnCustomdrawList ( NMHDR* pNMHDR, LRESULT* pResult )
  45. {
  46. NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
  47. // Take the default processing unless we set this to something else below.
  48. *pResult = 0;
  49. // First thing - check the draw stage. If it's the control's prepaint
  50. // stage, then tell Windows we want messages for every item.
  51. if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
  52. {
  53. *pResult = CDRF_NOTIFYITEMDRAW;
  54. }
  55. else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
  56. {
  57. // This is the prepaint stage for an item. Here's where we set the
  58. // item's text color. Our return value will tell Windows to draw the
  59. // item itself, but it will use the new color we set here.
  60. // We'll cycle the colors through red, green, and light blue.
  61. COLORREF crText;
  62. int pos=pLVCD->nmcd.dwItemSpec;
  63. if(pos%2)
  64. {
  65. pLVCD->clrTextBk = g_gridcol1;
  66. }
  67. else
  68. {
  69. pLVCD->clrTextBk = g_gridcol2;
  70. }
  71. // Tell Windows to paint the control itself.
  72. *pResult = CDRF_DODEFAULT;
  73. }
  74. }
  75. void CComboBoxListCtrl2::OnLButtonDblClk(UINT nFlags, CPoint point)
  76. {
  77. CRect rcCtrl;
  78. LVHITTESTINFO lvhti;
  79. lvhti.pt = point;
  80. int nItem = CListCtrl::SubItemHitTest(&lvhti);
  81. if(nItem == -1)
  82. return;
  83. int nSubItem = lvhti.iSubItem;
  84. CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcCtrl);
  85. #if 0 // Jeff.delete;
  86. if(nSubItem==3 || nSubItem==5)
  87. #else // Jeff.add ;
  88. if(nSubItem==3 || nSubItem==5 || nSubItem == 7)
  89. #endif
  90. {
  91. rcCtrl.top -=4;
  92. rcCtrl.bottom +=200;
  93. ShowComboBox(TRUE,nItem,nSubItem,rcCtrl);
  94. }
  95. else if(nSubItem==0 ||nSubItem==1 || nSubItem==2)
  96. {
  97. ShowEdit(TRUE,nItem,nSubItem,rcCtrl);
  98. }
  99. CListCtrl::OnLButtonDblClk(nFlags, point);
  100. }
  101. void CComboBoxListCtrl2::ShowComboBox(BOOL bShow,int nItem,int nIndex,CRect rcCtrl)
  102. {
  103. if(m_ComboBox.m_hWnd == NULL)
  104. {
  105. m_ComboBox.Create(CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,CRect(0,0,0,0),this,IDC_ComboBox);
  106. // m_ComboBox.Create(WS_VSCROLL|WS_CHILD|CBS_DROPDOWNLIST,CRect(0,0,0,0),this,IDC_ComboBox);
  107. m_ComboBox.ShowWindow(SW_HIDE);
  108. }
  109. if(bShow == TRUE)
  110. {
  111. CString strItem = CListCtrl::GetItemText(nItem,nIndex);
  112. m_ComboBox.MoveWindow(rcCtrl);
  113. m_ComboBox.ShowWindow(SW_SHOW);
  114. ::SetFocus(m_ComboBox.GetSafeHwnd());
  115. m_ComboBox.ResetContent ();
  116. if(nIndex==3)
  117. {
  118. m_ComboBox.AddString ("");
  119. for(int i=0; i<g_List1array.GetSize (); i++)
  120. m_ComboBox.AddString ("已发"+g_List1array.ElementAt (i).ElementAt (1));
  121. }
  122. #if 0
  123. else if(nIndex==5)
  124. {
  125. m_ComboBox.AddString ("OK");
  126. m_ComboBox.AddString ("");
  127. }
  128. #else // Jeff.添加返工及返工日期;
  129. else if ( nIndex == 5 )
  130. {
  131. m_ComboBox.AddString("返工");
  132. m_ComboBox.AddString("");
  133. m_ComboBox.AddString(strItem);
  134. m_bNeedSel=1;
  135. }
  136. else if ( nIndex == 7)
  137. {
  138. m_ComboBox.AddString("OK");
  139. m_ComboBox.AddString("");
  140. }
  141. #endif
  142. m_ComboBox.SetCurSel (m_ComboBox.FindString (0, strItem));
  143. m_ComboBox.SetCtrlData(MAKEWPARAM(nIndex,nItem));
  144. }
  145. else
  146. m_ComboBox.ShowWindow(SW_HIDE);
  147. }
  148. void CComboBoxListCtrl2::ShowEdit(BOOL bShow,int nItem,int nIndex,CRect rcCtrl)
  149. {
  150. if(m_edit.m_hWnd == NULL)
  151. {
  152. m_edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,101);
  153. m_edit.ShowWindow(SW_HIDE);
  154. CFont tpFont;
  155. tpFont.CreateStockObject(DEFAULT_GUI_FONT);
  156. m_edit.SetFont(&tpFont);
  157. tpFont.DeleteObject();
  158. }
  159. if(bShow == TRUE)
  160. {
  161. CString strItem = CListCtrl::GetItemText(nItem,nIndex);
  162. m_edit.MoveWindow(rcCtrl);
  163. m_edit.ShowWindow(SW_SHOW);
  164. m_edit.SetWindowText(strItem);
  165. ::SetFocus(m_edit.GetSafeHwnd());
  166. m_edit.SetSel(-1);
  167. m_edit.SetCtrlData(MAKEWPARAM(nIndex,nItem));
  168. }
  169. else
  170. m_edit.ShowWindow(SW_HIDE);
  171. }
  172. #ifdef VC60
  173. void CComboBoxListCtrl2::OnEditEnd(WPARAM wParam,LPARAM lParam)
  174. {
  175. if(wParam == TRUE)
  176. {
  177. CString strText(_T(""));
  178. m_edit.GetWindowText(strText);
  179. DWORD dwData = m_edit.GetCtrlData();
  180. int nItem= dwData>>16;
  181. int nIndex = dwData&0x0000ffff;
  182. CListCtrl::SetItemText(nItem,nIndex,strText);
  183. }
  184. else
  185. {
  186. }
  187. if(lParam == FALSE)
  188. m_edit.ShowWindow(SW_HIDE);
  189. }
  190. void CComboBoxListCtrl2::OnComboBoxEnd(WPARAM wParam,LPARAM lParam)
  191. {
  192. if(wParam == TRUE)
  193. {
  194. CString strText(_T(""));
  195. int pos=m_ComboBox.GetCurSel ();
  196. if(pos!=-1)
  197. {
  198. m_ComboBox.GetLBText (pos, strText);
  199. DWORD dwData = m_ComboBox.GetCtrlData();
  200. int nItem= dwData>>16;
  201. int nIndex = dwData&0x0000ffff;
  202. CListCtrl::SetItemText(nItem,nIndex,strText);
  203. if(nIndex==3 && strText.IsEmpty ())
  204. {
  205. SetItemText(nItem,4,"");
  206. SetItemText(nItem,5,"");
  207. SetItemText(nItem,6,"");
  208. SetItemText(nItem,7,""); // Jeff.add;
  209. SetItemText(nItem,8,""); // Jeff.add;
  210. }
  211. else if(nIndex==3)
  212. {
  213. SetItemText(nItem,4,g_date);
  214. }
  215. else if(nIndex==5 && strText.IsEmpty ())
  216. {
  217. SetItemText(nItem,6,"");
  218. }
  219. #if 0
  220. else if(nIndex==5)
  221. {
  222. SetItemText(nItem,6,g_date);
  223. }
  224. #else
  225. else if ( nIndex == 5 )
  226. {
  227. if(strText.Find("返工")!=-1 && m_bNeedSel)
  228. {
  229. m_bNeedSel=0;
  230. CChooseReason dlg;
  231. if(dlg.DoModal() == IDOK)
  232. {
  233. SetItemText( nItem, 5,"返工/("+dlg.sRet+")");
  234. m_ComboBox.SetCurSel(-1);
  235. }
  236. SetItemText(nItem,6,g_date);
  237. }
  238. else if( strText == "") // Jeff.add.若选择回空,则清空日期;
  239. {
  240. SetItemText(nItem,6,"");
  241. }
  242. }
  243. else if ( nIndex = 7 )
  244. {
  245. if ( strText == "OK")
  246. SetItemText(nItem,8,g_date);
  247. else
  248. SetItemText(nItem,8,"");
  249. }
  250. #endif
  251. }
  252. }
  253. else
  254. {
  255. }
  256. if(lParam == FALSE)
  257. m_ComboBox.ShowWindow(SW_HIDE);
  258. }
  259. #else
  260. LRESULT CComboBoxListCtrl2::OnEditEnd(WPARAM wParam,LPARAM lParam)
  261. {
  262. if(wParam == TRUE)
  263. {
  264. CString strText(_T(""));
  265. m_edit.GetWindowText(strText);
  266. DWORD dwData = m_edit.GetCtrlData();
  267. int nItem= dwData>>16;
  268. int nIndex = dwData&0x0000ffff;
  269. CListCtrl::SetItemText(nItem,nIndex,strText);
  270. }
  271. else
  272. {
  273. }
  274. if(lParam == FALSE)
  275. m_edit.ShowWindow(SW_HIDE);
  276. return 0;
  277. }
  278. LRESULT CComboBoxListCtrl2::OnComboBoxEnd(WPARAM wParam,LPARAM lParam)
  279. {
  280. if(wParam == TRUE)
  281. {
  282. CString strText(_T(""));
  283. int pos=m_ComboBox.GetCurSel ();
  284. if(pos!=-1)
  285. {
  286. m_ComboBox.GetLBText (pos, strText);
  287. DWORD dwData = m_ComboBox.GetCtrlData();
  288. int nItem= dwData>>16;
  289. int nIndex = dwData&0x0000ffff;
  290. CListCtrl::SetItemText(nItem,nIndex,strText);
  291. if(nIndex==3 && strText.IsEmpty ())
  292. {
  293. SetItemText(nItem,4,"");
  294. SetItemText(nItem,5,"");
  295. SetItemText(nItem,6,"");
  296. SetItemText(nItem,7,""); // Jeff.add;
  297. SetItemText(nItem,8,""); // Jeff.add;
  298. }
  299. else if(nIndex==3)
  300. {
  301. SetItemText(nItem,4,g_date);
  302. }
  303. else if(nIndex==5 && strText.IsEmpty ())
  304. {
  305. SetItemText(nItem,6,"");
  306. }
  307. #if 0
  308. else if(nIndex==5)
  309. {
  310. SetItemText(nItem,6,g_date);
  311. }
  312. #else
  313. else if ( nIndex == 5 )
  314. {
  315. if(strText.Find("返工")!=-1 && m_bNeedSel)
  316. {
  317. m_bNeedSel=0;
  318. CChooseReason dlg;
  319. if(dlg.DoModal() == IDOK)
  320. {
  321. SetItemText( nItem, 5,"返工/("+dlg.sRet+")");
  322. m_ComboBox.SetCurSel(-1);
  323. }
  324. SetItemText(nItem,6,g_date);
  325. }
  326. else if( strText == "") // Jeff.add.若选择回空,则清空日期;
  327. {
  328. SetItemText(nItem,6,"");
  329. }
  330. }
  331. else if ( nIndex = 7 )
  332. {
  333. if ( strText == "OK")
  334. SetItemText(nItem,8,g_date);
  335. else
  336. SetItemText(nItem,8,"");
  337. }
  338. #endif
  339. }
  340. }
  341. else
  342. {
  343. }
  344. if(lParam == FALSE)
  345. m_ComboBox.ShowWindow(SW_HIDE);
  346. return 0;
  347. }
  348. #endif
  349. void CComboBoxListCtrl2::OnParentNotify(UINT message, LPARAM lParam)
  350. {
  351. CListCtrl::OnParentNotify(message, lParam);
  352. //////////////////////////////////////////////////////////////////////////
  353. CHeaderCtrl* pHeaderCtrl = CListCtrl::GetHeaderCtrl();
  354. if(pHeaderCtrl == NULL)
  355. return;
  356. CRect rcHeader;
  357. pHeaderCtrl->GetWindowRect(rcHeader);
  358. ScreenToClient(rcHeader);
  359. //The x coordinate is in the low-order word and the y coordinate is in the high-order word.
  360. CPoint pt;
  361. pt.x = GET_X_LPARAM(lParam);
  362. pt.y = GET_Y_LPARAM(lParam);
  363. if(rcHeader.PtInRect(pt) && message == WM_LBUTTONDOWN)
  364. {
  365. if(m_ComboBox.m_hWnd != NULL)
  366. {
  367. DWORD dwStyle = m_ComboBox.GetStyle();
  368. if((dwStyle&WS_VISIBLE) == WS_VISIBLE)
  369. {
  370. m_ComboBox.ShowWindow(SW_HIDE);
  371. }
  372. }
  373. }
  374. }
  375. BOOL CComboBoxListCtrl2::PreTranslateMessage(MSG* pMsg)
  376. {
  377. if(0)//pMsg->message == WM_KEYDOWN)
  378. {
  379. if(pMsg->wParam == VK_TAB && m_ComboBox.m_hWnd!= NULL)
  380. {
  381. DWORD dwStyle = m_ComboBox.GetStyle();
  382. if((dwStyle&WS_VISIBLE) == WS_VISIBLE)
  383. {
  384. OnComboBoxEnd(TRUE,TRUE);
  385. CRect rcCtrl;
  386. int nItem;
  387. int nSub;
  388. if(FALSE == Key_Ctrl(nItem,nSub))
  389. Key_Shift(nItem,nSub);
  390. CListCtrl::GetSubItemRect(nItem,nSub,LVIR_LABEL,rcCtrl);
  391. CPoint pt(rcCtrl.left+1,rcCtrl.top+1);
  392. OnLButtonDblClk(0,pt);
  393. POSITION pos = CListCtrl::GetFirstSelectedItemPosition();
  394. if (pos == NULL)
  395. {
  396. }
  397. else
  398. {
  399. while (pos)
  400. {
  401. int ntpItem = CListCtrl::GetNextSelectedItem(pos);
  402. CListCtrl::SetItemState(ntpItem,0,LVIS_SELECTED);
  403. }
  404. }
  405. CListCtrl::SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
  406. return TRUE;
  407. }
  408. }
  409. }
  410. return CListCtrl::PreTranslateMessage(pMsg);
  411. }
  412. BOOL CComboBoxListCtrl2::Key_Shift(int& nItem,int& nSub)
  413. {
  414. int nItemCount = CListCtrl::GetItemCount();
  415. DWORD dwData = m_ComboBox.GetCtrlData();
  416. nItem= dwData>>16;
  417. nSub = dwData&0x0000ffff;
  418. CHeaderCtrl* pHeader = CListCtrl::GetHeaderCtrl();
  419. if(pHeader == NULL)
  420. return FALSE;
  421. short sRet = GetKeyState(VK_SHIFT);
  422. int nSubcCount = pHeader->GetItemCount();
  423. sRet = sRet >>15;
  424. if(sRet == 0)
  425. {
  426. nSub += 1;
  427. if(nSub >= nSubcCount)
  428. {
  429. if(nItem == nItemCount-1)
  430. {
  431. nItem = 0;
  432. nSub = 0;
  433. }
  434. else
  435. {
  436. nSub = 0;
  437. nItem += 1;
  438. }
  439. }
  440. if(nItem >= nItemCount)
  441. nItem = nItemCount-1;
  442. return FALSE;
  443. }
  444. else
  445. {
  446. nSub -= 1;
  447. if(nSub < 0)
  448. {
  449. nSub = nSubcCount -1;
  450. nItem --;
  451. }
  452. if(nItem < 0)
  453. nItem = nItemCount-1;
  454. return TRUE;
  455. }
  456. return FALSE;
  457. }
  458. BOOL CComboBoxListCtrl2::Key_Ctrl(int& nItem,int &nSub)
  459. {
  460. short sRet = GetKeyState(VK_CONTROL);
  461. DWORD dwData = m_ComboBox.GetCtrlData();
  462. nItem= dwData>>16;
  463. nSub = dwData&0x0000ffff;
  464. sRet = sRet >>15;
  465. int nItemCount = CListCtrl::GetItemCount();
  466. if(sRet == 0)
  467. {
  468. }
  469. else
  470. {
  471. nItem = nItem >=nItemCount-1? 0:nItem+=1;
  472. return TRUE;
  473. }
  474. return FALSE;
  475. }
  476. //////////////////////////////////////////////////////////////////////////
  477. //////////////////////////////////////////////////////////////////////////
  478. //////////////////////////////////////////////////////////////////////////
  479. CListCtrlComboBox2::CListCtrlComboBox2()
  480. {
  481. }
  482. CListCtrlComboBox2::~CListCtrlComboBox2()
  483. {
  484. }
  485. BEGIN_MESSAGE_MAP(CListCtrlComboBox2, CComboBox)
  486. //{{AFX_MSG_MAP(CListCtrlComboBox2)
  487. ON_WM_KILLFOCUS()
  488. ON_WM_SETFOCUS()
  489. ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseup)
  490. //}}AFX_MSG_MAP
  491. END_MESSAGE_MAP()
  492. /////////////////////////////////////////////////////////////////////////////
  493. // CListCtrlComboBox2 message handlers
  494. void CListCtrlComboBox2::SetCtrlData(DWORD dwData)
  495. {
  496. m_dwData = dwData;
  497. }
  498. DWORD CListCtrlComboBox2::GetCtrlData()
  499. {
  500. return m_dwData;
  501. }
  502. void CListCtrlComboBox2::OnKillFocus(CWnd* pNewWnd)
  503. {
  504. CComboBox::OnKillFocus(pNewWnd);
  505. CWnd* pParent = this->GetParent();
  506. ::PostMessage(pParent->GetSafeHwnd(),WM_USER_ComboBox_END,m_bExchange,0);
  507. }
  508. BOOL CListCtrlComboBox2::PreTranslateMessage(MSG* pMsg)
  509. {
  510. if(pMsg->message == WM_KEYDOWN)
  511. {
  512. if(pMsg->wParam == VK_RETURN)
  513. {
  514. CWnd* pParent = this->GetParent();
  515. m_bExchange = TRUE;
  516. ::PostMessage(pParent->GetSafeHwnd(),WM_USER_ComboBox_END,m_bExchange,0);
  517. }
  518. else if(pMsg->wParam == VK_ESCAPE)
  519. {
  520. CWnd* pParent = this->GetParent();
  521. m_bExchange = FALSE;
  522. ::PostMessage(pParent->GetSafeHwnd(),WM_USER_ComboBox_END,m_bExchange,0);
  523. }
  524. }
  525. return CComboBox::PreTranslateMessage(pMsg);
  526. }
  527. void CListCtrlComboBox2::OnSetFocus(CWnd* pOldWnd)
  528. {
  529. CComboBox::OnSetFocus(pOldWnd);
  530. m_bExchange = TRUE;
  531. }
  532. void CComboBoxListCtrl2::InitStyle()
  533. {
  534. SetFont (&g_listctrlfont);
  535. SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP);
  536. }
  537. void CListCtrlComboBox2::OnCloseup()
  538. {
  539. // TODO: Add your control notification handler code here
  540. CWnd* pParent = this->GetParent();
  541. ::PostMessage(pParent->GetSafeHwnd(),WM_USER_ComboBox_END,m_bExchange,0);
  542. }