实现效果如下所示
1. 定义两个类,一个类作为视图左半部分,另一个类作为视图的右半部分
这两个类分别继承CTreeView和CListView
2. 添加一个数据库源,连接药品的数据库
3.在文档类中,第一个该数据库集的变量,并通过公有函数提供外部访问接口
private:
CmedicineSet pMedicSet;
public:
CmedicineSet *GetMedicSet();
CmedicineSet* CMedicAdmin_1Doc::GetMedicSet(){
return &pMedicSet;
}
4. 拆分窗口
在框架类中定义拆分窗口变量
private:
CSplitterWnd m_sWnd;
在框架类中重写onCreateClient函数
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
m_sWnd.CreateStatic(this, 1, 2);
//创建视图
/*第一个参数和第二个参数:视图放的位置
第三个参数:窗口中放置的类
第四个参数:视图的大小*/
m_sWnd.CreateView(0, 0, RUNTIME_CLASS(CUserTreeView), CSize(230, 600), pContext);
m_sWnd.CreateView(0, 1, RUNTIME_CLASS(CMedicListView), CSize(720, 600), pContext);
return TRUE;
//return CFrameWnd::OnCreateClient(lpcs, pContext);
}
5. 实现视图右半部分的展示药品功能
重写CMedicListView中的OnInitialUpdate()函数
void CMedicListView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
// TODO: 在此添加专用代码和/或调用基类
CMedicAdmin_1Doc *pDoc = (CMedicAdmin_1Doc *)GetDocument();
CmedicineSet *pMedicSet = pDoc->GetMedicSet();
if (pMedicSet->IsOpen() == false){
pMedicSet->Open();
}
pMedicSet->Requery();
//获取列表视图的列表视图控件
CListCtrl &listCtrl = this->GetListCtrl();
//设置列表视图控件的风格
listCtrl.SetExtendedStyle(listCtrl.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
//设置模式
listCtrl.ModifyStyle(0, LVS_REPORT);
//设置表头
CString head[] = {
TEXT("药品代号"), TEXT("药品名称"), TEXT("药品类别"),
TEXT("库存数目"), TEXT("出厂公司"), TEXT("产地"),
TEXT("出厂时间"), TEXT("保质期(月)"), TEXT("单价(元)")
};
int headsize = sizeof(head) / sizeof(head[0]);
for (int i = 0; i < headsize; i++){
//设置表头
listCtrl.InsertColumn(i, head[i], LVCFMT_LEFT, 100);
}
int count = pMedicSet->GetRecordCount();
for (int i = 0; i < headsize; i++){
//设置行数据
//药品代号
listCtrl.InsertItem(i, pMedicSet->m_id);
//设置列数据
int j = 1;
//药品名称
listCtrl.SetItemText(i, j++, pMedicSet->m_name);
//药品类别
listCtrl.SetItemText(i, j++, pMedicSet->m_classification);
//库存数目
CString str;
str.Format(TEXT("%d"), pMedicSet->m_number);
listCtrl.SetItemText(i, j++, str);
//出厂公司
listCtrl.SetItemText(i, j++, pMedicSet->m_produceCompany);
//产地
listCtrl.SetItemText(i, j++, pMedicSet->m_producePlace);
//出厂时间
str = pMedicSet->m_produceDate.Format(TEXT("%Y-%m-%d"));
listCtrl.SetItemText(i, j++, str);
//保质期(月)
str.Format(TEXT("%d"), pMedicSet->m_quelityAssurance);
listCtrl.SetItemText(i, j++, str);
//单价(元)
str.Format(TEXT("%d"), pMedicSet->m_unitPrice);
listCtrl.SetItemText(i, j, str);
pMedicSet->MoveNext();
}
}
6. 实现视图左半部分用户的展示
加载图片
在CUerTreeView中定义一个CImageList变量
CImageList imageList;
重写CUerTreeView的OnlnitialUpdate()函数
void CUerTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
// TODO: 在此添加专用代码和/或调用基类
// TODO: 在此添加专用代码和/或调用基类
CMedicAdmin_1Doc *pDoc = (CMedicAdmin_1Doc *)GetDocument();
//获取数据集指针
CuserSet *pUserSet = pDoc->GetUserSet();
if (pUserSet->IsOpen() == false){
pUserSet->Open();
}
//获取视图关联的树控件
CTreeCtrl &treeCtrl = this->GetTreeCtrl();
//设置树控件的风格
treeCtrl.ModifyStyle(NULL, WS_VISIBLE | WS_TABSTOP | WS_CHILD | WS_BORDER | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | TVS_DISABLEDRAGDROP);
HICON icon[3];
icon[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
icon[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
icon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
//加载图片
m_imageList.Create(30, 30, ILC_COLOR32, 3, 3);
for (int i = 0; i < 3; i++){
m_imageList.Add(icon[i]);
}
//给树控件设置图像列表
treeCtrl.SetImageList(&m_imageList, TVSIL_NORMAL);
CString type[3] = { TEXT("管理员"), TEXT("医生"), TEXT("售药员") };
for (int i = 0; i < 3; i++){
//创建节点
HTREEITEM Root = treeCtrl.InsertItem(type[i], 0, 0, NULL);
//创建管理员的子节点
CString sql;
sql.Format(TEXT("classification = '%s'"), type[i]);
pUserSet->m_strFilter = sql;
pUserSet->Requery();
while (pUserSet->IsEOF() == false){
CString str;
str.Format(TEXT("%s(%s)"), pUserSet->m_name, pUserSet->m_account);
treeCtrl.InsertItem(str, 1, 1, Root);
pUserSet->MoveNext();
}
}
}