MFC 的List Control控件实现可编辑
时间:2010-11-05 来源:°ι 、曲 终
输入完成,点击空白处:
在这里,响应List Control的双击事件:
void CAddInstanceDlg::OnNMDblclkList3(NMHDR * pNMHDR, LRESULT * pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR); LVHITTESTINFO info; info.pt = pNMItemActivate -> ptAction; if (listControl.SubItemHitTest( & info) != - 1 ) { hitRow = info.iItem; hitCol = info.iSubItem; if (editItem.m_hWnd == NULL) // editItem为一输入框控件, { RECT rect; rect.left = 0 ; rect.top = 0 ; rect.bottom = 15 ; rect.right = 200 ; editItem .Create(WS_CHILD | ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this , 101 ); editItem.SetFont( this -> GetFont(), FALSE); } CRect rect; listControl.GetSubItemRect(info.iItem, info.iSubItem, LVIR_BOUNDS, rect); rect.top += 12 ; rect.left += 13 ; rect.right += 13 ; rect.bottom += 12 ; editItem.SetWindowText(listControl.GetItemText( info .iItem, info .iSubItem)); editItem.MoveWindow( & rect, TRUE); editItem.ShowWindow( 1 ); editItem.SetFocus(); } * pResult = 0 ; }
这里比较诡异的是我用Visual Studio 2008自动生成的事件响应函数的第一行居然出错,google之后第一个就是微软关于这个自动生成代码错误的修正。
在这个代码里面先得到鼠标双击的位置,判断是否击中了单元格,击中就调用Edit Control ,大小就是选中的单元 格,至于为什么rect要+12啊+13什么的,那是因为他出来的输入框跟单元格没对齐,导致很丑。最后再给这个Edit Control 一 个焦点,就可以直接输入了。
另外,为了能使输入之后有所反应,我们还要做一个鼠标的单击事件响应函数。
void CAddInstanceDlg::OnNMClickList3(NMHDR * pNMHDR, LRESULT * pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR); if (editItem.m_hWnd != NULL) { editItem.ShowWindow( 0 ); if (hitRow != - 1 ) { CString text; editItem.GetWindowText(text); listControl.SetItemText(hitRow, hitCol, text); } } hitCol = hitRow = - 1 ; * pResult = 0 ; }
相关阅读 更多 +