说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

我使用CListCtrl的REPORT风格,怎样对报表中的数据进行编辑?

编辑:说三道四文库 发布时间:2018-02-21 11:29
HTML文档下载 WORD文档下载 PDF文档下载
我使用CListCtrl的REPORT风格,但我要对数据进行编辑,如:输入数据,修改数据,
怎么做了?
给你的ListCtrl添加LVS_EDITLABELS的属性就可以了!!
给你一些代码,先看看,然后就可以按自己的意思在列表控件的指定位置中嵌入你所需的控件:

//
void CCListCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
*pResult = 0;
//
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  if(pNMListView->iSubItem == -1)
return;
if( GetFocus() != this) 
  SetFocus();

ItemControl(pNMListView->iItem,pNMListView->iSubItem);
}

//
void CCListCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
{
LV_DISPINFO *plvDispInfo = (LV_DISPINFO*)pNMHDR;
  LV_ITEM *plvItem = &plvDispInfo->item;

if( plvItem->iItem != -1 &&  // valid item
plvItem->pszText ) // valid text
{
SetItemText( plvItem->iItem, plvItem->iSubItem, plvItem->pszText);

// this will invoke an ItemChanged handler in parent
if ( plvItem->iSubItem != 0 )
{
char szText[0x10+1];
GetItemText( plvItem->iItem, 0, szText, 0x10);
SetItemText( plvItem->iItem, 0, szText);
}
}
*pResult = 0;
}


void CCListCtrl::ItemControl(int nItem, int nSubItem)
{
int nControlType = GetColumnControlType(nSubItem);
  switch(nControlType)
  {
  case LC_ECT_NONE:
  break;
  case LC_ECT_EDIT:
  EditItem (nItem, nSubItem);
  break;
  case LC_ECT_COMB:
  ComboItem(nItem, nSubItem);
  break;
  default:
break;
  }
}

CEdit * CCListCtrl::EditItem(int nItem, int nSubItem)
{
CRect rect;
int offset = 0;
if(!EnsureVisible(nItem, TRUE))

return NULL;
}

GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
// Now scroll if we need to expose the column
CRect rcClient;
GetClientRect(rcClient);
if( offset + rect.left < 0 || offset + rect.left > rcClient.right )
{
CSize size(offset + rect.left,0);
Scroll(size);
rect.left -= size.cx;
}
rect.left += offset;
rect.right = rect.left + GetColumnWidth(nSubItem);
if(rect.right > rcClient.right) 
   rect.right = rcClient.right;

// Get Column alignment
LV_COLUMN lvcol;
lvcol.mask = LVCF_FMT;
GetColumn(nSubItem, &lvcol);

DWORD dwStyle;
if((lvcol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_LEFT)
dwStyle = ES_LEFT;
else if((lvcol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_RIGHT)
dwStyle = ES_RIGHT;
else 
dwStyle = ES_CENTER;


dwStyle |=WS_BORDER|WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL;
m_pEdit = new CEditItem(nItem, nSubItem, GetItemText(nItem, nSubItem));

#define IDC_EDITCTRL 0x1234
m_pEdit->Create(dwStyle, rect, this, IDC_EDITCTRL);
// pEdit->ModifyStyleEx(0,WS_EX_CLIENTEDGE);
//funny thing happend here, uncomment this, 
//and then edit an item, 
//enter a long text so that the ES_AUTOHSCROLL comes to rescue
//yes that's look funny, ???.
return m_pEdit;
}

CComboBox * CCListCtrl::ComboItem(int nItem, int nSubItem)
{
#define IDC_COMBOBOXINLISTVIEW 0x1235

CString strFind = GetItemText(nItem, nSubItem);

//basic code start
CRect rect;
int offset = 0;
// Make sure that the item is visible
if( !EnsureVisible(nItem, TRUE)) 
return NULL;

GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
// Now scroll if we need to expose the column
CRect rcClient;
GetClientRect(rcClient);
if( offset + rect.left < 0 || offset + rect.left > rcClient.right )
{
CSize size;
size.cx = offset + rect.left;
size.cy = 0;
Scroll(size);
rect.left -= size.cx;
}

rect.left += offset;
rect.right = rect.left + GetColumnWidth(nSubItem);
if(rect.right > rcClient.right) 
   rect.right = rcClient.right;
//basic code end

rect.bottom += 10 * rect.Height();//dropdown area

DWORD dwStyle =  WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL|CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL;
m_pList = new CComboItem(nItem, nSubItem, &m_strList);
m_pList->Create(dwStyle, rect, this, IDC_COMBOBOXINLISTVIEW);
m_pList->ModifyStyleEx(0,WS_EX_CLIENTEDGE);//can we tell at all

m_pList->ShowDropDown();
m_pList->SelectString(-1, strFind.GetBuffer(1));
// The returned pointer should not be saved
return m_pList;
}
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘