视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MFC点点滴滴列表框使用listcontrol(总结2)(编辑ListCon
2020-11-09 15:30:21 责编:小采
文档


本文全面介绍了如何编辑List Control里面的任何子项 介绍 内容有点多,译出来也没多大意思,大致就是说一个VC程序员会常常碰到List Control,List Control有很多方法可以显示数据,可List Control里默认的没有编辑功能,故在此智短文里,那个牛叉的人教你怎

本文全面介绍了如何编辑List Control里面的任何子项

介绍

内容有点多,译出来也没多大意思,大致就是说一个VC程序员会常常碰到List Control,List Control有很多方法可以显示数据,可List Control里默认的没有编辑功能,故在此智短文里,那个牛叉的人教你怎么实现这个功能。这篇文章是基于VC MFC滴,用别的功具的娃们当然也可以看看,呵呵,不多说,先实现图上ok exit两个按钮:

void CMultipleColumnsDlg::OK()

{

CDialog::EndDialog (0); // Add this line

}

void CMultipleColumnsDlg::OnExit()

{

CDialog::EndDialog (0); // Add this line

}

接下来添加一个ListCtrl控件,记得把ListCtrl的style设置成Report,这个是为了实现我们要多行显示的功能

然后增加一个文本框Edit Box去掉它的Border style属性

增加一个InsertItems() 成员函数,用来写入ListControl的显示内容

void CMultipleColumnsDlg::InsertItems()

{

HWND hWnd = ::GetDlgItem(m_hWnd, IDC_LIST1);

// Set the LVCOLUMN structure with the required

// column information

LVCOLUMN list;

list.mask = LVCF_TEXT |LVCF_WIDTH|

LVCF_FMT |LVCF_SUBITEM;

list.fmt = LVCFMT_LEFT;

list.cx = 50;

list.pszText = "S.No";

list.iSubItem = 0;

//Inserts the column

::SendMessage(hWnd,LVM_INSERTCOLUMN,

(WPARAM)0,(WPARAM)&list);

list.cx = 100;

list.pszText = "Name";

list.iSubItem = 1;

::SendMessage(hWnd ,LVM_INSERTCOLUMN,

(WPARAM)1,(WPARAM)&list);

list.cx = 100;

list.pszText = "Address";

list.iSubItem = 2;

::SendMessage(hWnd ,LVM_INSERTCOLUMN,

(WPARAM)1,(WPARAM)&list);

list.cx = 100;

list.pszText = "Country";

list.iSubItem = 2;

::SendMessage(hWnd ,LVM_INSERTCOLUMN,

(WPARAM)1,(WPARAM)&list);

// Inserts first Row with four columns 插入行

SetCell(hWnd,"1",0,0);

SetCell(hWnd,"Prabhakar",0,1);

SetCell(hWnd,"Hyderabad",0,2);

SetCell(hWnd,"India",0,3);

// Inserts second Row with four columns .

SetCell(hWnd,"2",1,0);

SetCell(hWnd,"Uday",1,1);

SetCell(hWnd,"Chennai",1,2);

SetCell(hWnd,"India",1,3);

}

自定义的SetCell( ) 函数,用来实现插入数据用的

void CMultipleColumnsDlg::SetCell(HWND hWnd1,

CString value, int nRow, int nCol)

{

TCHAR szString [256];

wsprintf(szString,value ,0);

//Fill the LVITEM structure with the

//values given as parameters.

LVITEM lvItem;

lvItem.mask = LVIF_TEXT;

lvItem.iItem = nRow;

lvItem.pszText = szString;

lvItem.iSubItem = nCol;

if(nCol >0)

//set the value of listItem

::SendMessage(hWnd1,LVM_SETITEM,

(WPARAM)0,(WPARAM)&lvItem);

else

//Insert the value into List

ListView_InsertItem(hWnd1,&lvItem);

}

//通过行和列得到项目里面的数据

CString CMultipleColumnsDlg::GetItemText(

HWND hWnd, int nItem, int nSubItem) const

{

LVITEM lvi;

memset(&lvi, 0, sizeof(LVITEM));

lvi.iSubItem = nSubItem;

CString str;

int nLen = 128;

int nRes;

do

{

nLen *= 2;

lvi.cchTextMax = nLen;

lvi.pszText = str.GetBufferSetLength(nLen);

nRes = (int)::SendMessage(hWnd,

LVM_GETITEMTEXT, (WPARAM)nItem,

(LPARAM)&lvi);

str.ReleaseBuffer();

return str;

}

}

//为窗口类添加两个成员变量:

int nItem, nSubItem;

用Class wizard 添加 NM_CLICK 响应,当用户点击任何位置时,就会对应出现一个Edit Box,并可以修改数据

void CMultipleColumnsDlg::OnClickList(

NMHDR* pNMHDR, LRESULT* pResult)

{

Invalidate();

HWND hWnd1 = ::GetDlgItem (m_hWnd,IDC_LIST1);

LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR;

RECT rect;

//get the row number

nItem = temp->iItem;

//get the column number

nSubItem = temp->iSubItem;

if(nSubItem == 0 || nSubItem == -1 || nItem == -1)

return ;

//Retrieve the text of the selected subItem

//from the list

CString str = GetItemText(hWnd1,nItem ,

nSubItem);

RECT rect1,rect2;

// this macro is used to retrieve the Rectanle

// of the selected SubItem

ListView_GetSubItemRect(hWnd1,temp->iItem,

temp->iSubItem,LVIR_BOUNDS,&rect);

//Get the Rectange of the listControl

::GetWindowRect(temp->hdr.hwndFrom,&rect1);

//Get the Rectange of the Dialog

::GetWindowRect(m_hWnd,&rect2);

int x=rect1.left-rect2.left;

int y=rect1.top-rect2.top;

if(nItem != -1)

::SetWindowPos(::GetDlgItem(m_hWnd,IDC_EDIT1),

HWND_TOP,rect.left+x,rect.top+4,

rect.right-rect.left - 3,

rect.bottom-rect.top -1,NULL);

::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_SHOW);

::SetFocus(::GetDlgItem(m_hWnd,IDC_EDIT1));

//Draw a Rectangle around the SubItem

::Rectangle(::GetDC(temp->hdr.hwndFrom),

rect.left,rect.top-1,rect.right,rect.bottom);

//Set the listItem text in the EditBox

::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT1),str);

*pResult = 0;

}

To handle the ENTER key we need to write the virtual function OnOk (响应ENTER键)

afx_msg void OnOK();

In MultipleColumnsDlg.cpp write the following code.

// This function handles the ENTER key

void CMultipleColumnsDlg::OnOK()

{

CWnd* pwndCtrl = GetFocus();

// get the control ID which is

// presently having the focus

int ctrl_ID = pwndCtrl->GetDlgCtrlID();

CString str;

switch (ctrl_ID)

{ //if the control is the EditBox

case IDC_EDIT1:

//get the text from the EditBox

GetDlgItemText(IDC_EDIT1,str);

//set the value in the listContorl with the

//specified Item & SubItem values

SetCell(::GetDlgItem (m_hWnd,IDC_LIST1),

str,nItem,nSubItem);

::SendDlgItemMessage(m_hWnd,IDC_EDIT1,

WM_KILLFOCUS,0,0);

::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),

SW_HIDE);

break;

default:

break;

}

}

最后一步在OnInitDialog 中设置List Control的样式

ListView_SetExtendedListViewStyle(::GetDlgItem

(m_hWnd,IDC_LIST1),LVS_EX_FULLROWSELECT |

LVS_EX_GRIDLINES);

InsertItems();

::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);

下载本文
显示全文
专题