CVSListBox类的扩展使用
2013-5-2 flyfish
一 在资源窗口中,选中资源右键-》资源包括-》输入如下代码
#ifndef_AFXDLL
#include"afxribbon.rc"
#endif
二 新建一个基于对话框的项目
将工具箱中的MFCVSListBox Control直接拖到窗口中
利用向导为该控件绑定一个变量
CVSListBox m_List_ctlMain
向导自动添加头文件
#include"afxvslistbox.h"
三 增加输入规则
1 删除时,先弹出提示对话框,询问用户是否删除
2 在新建和编辑List中的内容时,检查是否存在重复内容
在微软提供的例子中重写关于按钮的消息
class CCustomEditListBox :public CVSListBox
{
virtual void OnBrowse()
{
int nSel = GetSelItem();
MessageBox(_T("Browse item..."));
if (nSel == GetCount()) // New item
{
nSel = AddItem(_T("New text"));
SelectItem(nSel);
}
else
{
SetItemText(nSel, _T("Updated text"));
}
}
};
头文件和实现文件放在一个文件中
根据微软提供的例子按照这种写法进行仿写
类的继承关系
class CVSListBox :public CVSListBoxBase
class CVSListBoxBase :public CStatic
在CVSListBoxBase类中有
virtual BOOL OnBeforeRemoveItem(int/*iItem*/) { returnTRUE; }
新建一个继承自CVSListBox的类CCustomEditListBox
以下代码实现删除时,先弹出提示对话框,询问用户是否删除
class CCustomEditListBox:public CVSListBox
{
protected:
BOOL OnBeforeRemoveItem(intnItem)
{
CString strText = GetItemText(nItem);
CString strPrompt=_T("");
strPrompt.Format(_T("确定要删除【%s】吗?"),strText);
if ( MessageBox(strPrompt,_T("提示"),MB_ICONQUESTION|MB_OKCANCEL)==IDOK)
{
return TRUE;
}
return FALSE;
}
};
以下代码实现在新建和编辑List中的内容时,检查是否存在重复内容
class CCustomEditListBox :public CVSListBox
{
boolIsExist(CString strText)
{
for (int i=0;i<GetCount();i++)
{
CString strContent=GetItemText(i);
if (strContent == strText )
{
return true;//已经存在
}
}
return false;
}
voidSetItemText(int iIndex, const CString& strText)
{
if (IsExist(strText))
{
CString strPrompt=_T("");
strPrompt.Format(_T("【%s】已经存在"),strText);
AfxMessageBox(strPrompt);
EditItem(iIndex);
m_wndEdit.SetWindowText(strText);
m_wndEdit.SetSel(0,-1);//全选
// m_wndEdit.SetSel(-1);//光标处于文字的末端
return;
}
if (GetSafeHwnd() == NULL || m_pWndList ==NULL)
{
ASSERT(FALSE);
return;
}
ASSERT_VALID(m_pWndList);
m_pWndList->SetItemText(iIndex,0,strText);
}
};
代码中使用CVSListBox类中的成员变量
CListCtrl* m_pWndList;
CVSListBoxEditCtrl m_wndEdit;
还可以重写其他事件
virtualvoid OnAfterAddItem(int/*iItem*/) {}
virtualvoid OnAfterRenameItem(int/*iItem*/) {}
virtualvoid OnAfterMoveItemUp(int/*iItem*/) {}
virtualvoid OnAfterMoveItemDown(int/*iItem*/) {}
如需其他功能例如多列,输入掩码,只允许输入数字等等功能就需要对CListCtrl和CVSListBoxEditCtrl 进行扩展。