接上(三)
6.7.1主框架搭建
VC++实现的QQ主窗口抽屉菜单效果,应该说是一个面板吧,可以展开和折叠起来,Outlook 中也有类似的界面,和OICQ 的主界面非常相似。
视图的切分
1)通过AppWizard 生成单文档单视图的应用程序SecMngAdmin
2)添加外部文件.h.cpp
将文件GFXGROUPEDIT.CPP GFXGROUPEDIT.H
GFXOUTBARCTRL.CPP GFXOUTBARCTRL.H
GFXPOPUPMENU.CPP GFXPOPUPMENU.H
gfxPub.h, GFXSPLITTERWND.CPP GFXSPLITTERWND.H 拷贝到项目工程目录下,然后再通过vc编译器,添加现有文件功能,添加到项目中。
编译上述文件,发现失败如下:
3)添加外部光标文件
在资源文件中引入3 个光标文件,表示鼠标进行不同操作时光标的形状,其ID 分别为IDC_HANDLECUR、IDC_DRAGGING 和IDC_NODRAGGING。
4)在resource.h中添加控件消息宏定义
把在Resource.h文件加入如下代码,定义控件的消息
#define ID_GFX_SMALLICON 50000
#define ID_GFX_LARGEICON 50001
#define ID_GFX_RENAMEITEM 50002
#define ID_GFX_REMOVEITEM 50003
#define ID_GFX_GROUPICON 50004
#define ID_GFX_FONTCICON 50005
#define ID_GFX_BACKCICON 50006
典型错误1
//DWORD dwVersion = ::GetVersion(); DWORD dwVersion = 4; BOOL bWin4 = (BYTE)dwVersion >= 4; bNotWin4 = 1 - bWin4; // for convenience m_upBorder = 8; bWhiteLine = true; |
错误 1 error C4996: 'GetVersion': 被声明为已否决 d:\users\qiaojn\documents\visual studio 2013\projects\mysecadmin_1\mysecadmin_1\gfxsplitterwnd.cpp 45 1 MySecAdmin_1 |
典型错误2
典型错误3
找不到 资源视图
项目菜单之下
5)在CMainFrame中添加视图切分功能
a)在MainFrm.h中,包含相应头文件,添加对象变量定义
添加
#include "GfxSplitterWnd.h"
#include "GfxOutBarCtrl.h"
// 特性
public:
CGfxSplitterWnd wndSplitter;
CGfxOutBarCtrl wndBar;
CImageList imaLarge, imaSmall;
CTreeCtrl wndTree;
b)添加重载 OnCreateClient 函数
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)方法
使用类向导:
函数重写如下:
定义放在 CMainFrame::OnCreateClient函数之前 static UINT nImages[] = { IDI_ICON_SET, IDI_ICON_USER, IDI_ICON_OP_LOG, IDI_ICON_LOG, IDI_ICON_REQ, IDI_ICON_RE, IDI_ICON_REPORT, }; 下面是虚函数重写 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: 在此添加专用代码和/或调用基类 if (!wndSplitter.CreateStatic(this, 1, 2)) return false; if (!wndSplitter.CreateView(0, 1,RUNTIME_CLASS(CFormBackground), CSize(0,0), pContext)) return false; //pContext->m_pNewViewClass RUNTIME_CLASS(CFormUserManager) CFormUserManager DWORD dwf = CGfxOutBarCtrl::fDragItems| CGfxOutBarCtrl::fEditGroups| CGfxOutBarCtrl::fEditItems| CGfxOutBarCtrl::fRemoveGroups| CGfxOutBarCtrl::fRemoveItems| CGfxOutBarCtrl::fAddGroups| CGfxOutBarCtrl::fAnimation; wndBar.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), &wndSplitter, wndSplitter.IdFromRowCol(0, 0), dwf); wndBar.SetOwner(this); imaLarge.Create(32, 32, true, 2, 1); HICON hIcon; for (int i=0; i<7; ++i) { hIcon= AfxGetApp()->LoadIcon (nImages[i]); imaLarge.Add (hIcon); } wndBar.SetImageList(&imaLarge, CGfxOutBarCtrl::fLargeIcon); wndBar.SetImageList(&imaSmall, CGfxOutBarCtrl::fSmallIcon); wndTree.Create(WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS, CRect(0,0,0,0), &wndBar, 1010); wndTree.SetImageList(&imaSmall, TVSIL_NORMAL); wndBar.SetAnimationTickCount(20); wndBar.SetAnimSelHighlight(200); wndBar.AddFolder("SecMngServer配置管理", 0); wndBar.AddFolder("SecMngAdmin网点管理", 1); wndBar.AddFolder("人员管理", 2); wndBar.AddFolder("设备管理", 3); //wndBar.AddFolder("CA人员操作查询", 4); wndBar.InsertItem(0, 0, "SecMngServer配置", 0, 0); wndBar.InsertItem(0, 1, "网点信息管理", 1, 0); wndBar.InsertItem(0, 2, "后台业务管理", 4, 0); // wndBar.InsertItem(0, 3, "后台交易查询", 5, 0); // wndBar.InsertItem(1, 0, "前台体系管理", 6, 0); wndBar.InsertItem(1, 1, "前台业务管理", 4, 0); wndBar.InsertItem(1, 2, "前台交易查询", 3, 0); wndBar.InsertItem(2, 0, "创建人员", 3, 0); wndBar.InsertItem(2, 1, "冻结人员", 4, 0); wndBar.InsertItem(2, 2, "解冻", 2, 0); wndBar.InsertItem(2, 3, "注销人员", 1, 0); wndBar.InsertItem(3, 0, "创建设备", 5, 0); wndBar.InsertItem(3, 1, "注销管理", 4, 0); wndBar.SetSelFolder(0); CRect r; GetClientRect(&r); int w1 = r.Width()/5; int w2 = r.Width()/4; wndSplitter.SetColumnInfo( 0, w1, 0 ); wndSplitter.SetColumnInfo( 1, w2, 0 ); wndSplitter.RecalcLayout(); return true; //return CFrameWndEx::OnCreateClient(lpcs, pContext); } |
c)编译源代码,出现如下问题。解决资源没有引入问题
d) 03ico目录下,引入ico文件
log.ico
op_log.ico
re.ico
report.ico
req.ico
set.ico
user.ico 导入到项目中,在资源试图中,做属性配置
e)添加 CFormBackground 类
创建 Dialog 资源 IDD_FORMBACKGROUND_FORM ,并为其创建资源类 CFormBackground, 方法步骤如下:
在 CFormBackground 类重载虚函数
void CFormBackground::OnDraw(CDC* pDC) { // TODO: 在此添加专用代码和/或调用基类 CRect clientRect; GetClientRect(&clientRect); for(int k = 13 ;k< 18;k++) //绘图示例—显示位图 { CBrush* pTempBrush = NULL; CBrush OrigBrush; OrigBrush.FromHandle((HBRUSH)pTempBrush); CRect rc; GetClientRect(&rc); //ScreenToClient(&rc); try { CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP_BACK); CBrush brush(&bmp); pTempBrush = (CBrush*)pDC->SelectObject(brush); pDC->Rectangle(rc.left,rc.top, rc.Width(), rc.Height()); pDC->SelectObject(&OrigBrush); break; } catch(CResourceException* e) { e->ReportError(); e->Delete(); } } CRect rect; GetClientRect(&rect); CRect rect2; GetClientRect(&rect2); CFont font ; font.CreatePointFont(340, _T("Arial")); CString string = "欢迎使用KeyMngServer管理终端"; pDC->SelectObject(&font); pDC->SetBkMode(TRANSPARENT); rect.OffsetRect(6, -90); //背影 pDC->SetTextColor( RGB(192, 192, 192)); pDC->DrawText(string, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER); rect2.OffsetRect(0, -100); pDC->SetTextColor( RGB(0, 0, 0)); pDC->DrawText(string, &rect2, DT_SINGLELINE|DT_CENTER|DT_VCENTER); } |
注意1:父类.class CFormBackground : public CFormView
注意2:CFormBackground 类资源的属性
Border属性配置成None
Style属性配置成child
注意3:在MainFrom头文件中添加 #include "FormBackground.h"
运行完毕以后显示一下画面
现在点击左边的图像节点,还不能做视图的切换。
视图的切换
1)CMainFrame类中添加视图切换自定义消息
在MainFrame.h中添加自定义消息声明
protected:
DECLARE_MESSAGE_MAP()
afx_msg long OnOutbarNotify(WPARAM wParam, LPARAM lParam);
在MainFrame.cpp中添加自定义消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
… …
ON_MESSAGE(WM_OUTBAR_NOTIFY, OnOutbarNotify)
……
END_MESSAGE_MAP()
在MainFrame.cpp中添加消息映射函数的实现
long CMainFrame::OnOutbarNotify(WPARAM wParam, LPARAM lParam) { switch (wParam) { case NM_OB_ITEMCLICK: { int index = (int) lParam; CString cText, cs1; cText = wndBar.GetItemText(index); CCreateContext Context; if (cText==_T("SecMngServer配置")) { Context.m_pNewViewClass = RUNTIME_CLASS(CCfgView); Context.m_pCurrentFrame = this; Context.m_pLastView = (CView *)wndSplitter.GetPane(0,1); wndSplitter.DeleteView(0,1); wndSplitter.CreateView(0,1,RUNTIME_CLASS(CCfgView),CSize(500,0),&Context); CCfgView *pNewView=(CCfgView *)wndSplitter.GetPane(0,1); wndSplitter.RecalcLayout(); pNewView->OnInitialUpdate(); wndSplitter.SetActivePane(0,1); //IsHisKeyRecovry=0; }
else if (cText==_T("网点信息管理")) { Context.m_pNewViewClass = RUNTIME_CLASS(CDlgNetInfo); Context.m_pCurrentFrame = this; Context.m_pLastView = (CView *)wndSplitter.GetPane(0,1); wndSplitter.DeleteView(0,1); wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDlgNetInfo),CSize(500,0),&Context); CDlgNetInfo *pNewView=(CDlgNetInfo *)wndSplitter.GetPane(0,1); wndSplitter.RecalcLayout(); pNewView->OnInitialUpdate(); wndSplitter.SetActivePane(0,1); }
else if (cText==_T("后台业务管理")) { //AfxMessageBox(cText); Context.m_pNewViewClass = RUNTIME_CLASS(CSysAll); Context.m_pCurrentFrame = this; Context.m_pLastView = (CView *)wndSplitter.GetPane(0,1); wndSplitter.DeleteView(0,1); wndSplitter.CreateView(0,1,RUNTIME_CLASS(CSysAll),CSize(500,0),&Context); CSysAll *pNewView=(CSysAll *)wndSplitter.GetPane(0,1); wndSplitter.RecalcLayout(); pNewView->OnInitialUpdate(); wndSplitter.SetActivePane(0,1); } } return 0;
case NM_OB_ONLABELENDEDIT: // cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited item // return 1 to do the change and 0 to cancel it { /* if(IsLoginOutFlag == 1) { AfxMessageBox("人员已登出,请重新登录CA人员以进行相应操作。"); return 1; } */ OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam; TRACE2("Editing item %d, new text:%s\n", pOI->index, pOI->cText); } return 1; case NM_OB_ONGROUPENDEDIT: // cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited folder // return 1 to do the change and 0 to cancel it { /* if(IsLoginOutFlag == 1) { AfxMessageBox("人员已登出,请重新登录人员以进行相应操作。"); return 1; } */ OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam; TRACE2("Editing folder %d, new text:%s\n", pOI->index, pOI->cText); } return 1; case NM_OB_DRAGITEM: // cast the lParam to an OUTBAR_INFO * struct; it will contain info about the dragged items // return 1 to do the change and 0 to cancel it { /* if(IsLoginOutFlag == 1) { AfxMessageBox("人员已登出,请重新登录人员以进行相应操作。"); return 1; }*/ OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam; TRACE2("Drag item %d at position %d\n", pOI->iDragFrom, pOI->iDragTo); } return 1; } return 0; } |
编译源码发现出错,看一下原因。
CCfgView
1>e:\01_work\23_项目\secmng\secmng\mainfrm.cpp(334): error C2653: “CCfgView”: 不是类或命名空间名称
1>e:\01_work\23_项目\secmng\secmng\mainfrm.cpp(338): error C2653: “CCfgView”: 不是类或命名空间名称
1>e:\01_work\23_项目\secmng\secmng\mainfrm.cpp(339): error C2065: “CCfgView”: 未声明的标识符
1>e:\01_work\23_项目\secmng\secmng\mainfrm.cpp(339): error C2065: “pNewView”: 未声明的标识符
1>e:\01_work\23_项目\secmng\secmng\mainfrm.cpp(339): error C2065: “CCfgView”: 未声明的标识符
只不过是少了几个类而已。
2)添加视图切换类
为CCfgView类添加Dialog资源(id可以命名:IDD_DIALOG_CFG)
为 CDlgNetInfo类添加Dialog资源(id可以命名:IDD_DIALOG_NETMNG)
为 COpTranView类添加Dialog资源(id可以命名:IDD_DIALOG_TRAN)
为 CSysAll类添加Dialog资源(id可以命名:IDD_DIALOG_SYSALL)
以CCfgView类添加为例,关键步骤如下
在CCfgView类中,重写OnInitialUpdate函数
6.7.2多标签页创建
多标签页在项目开发中,是一个经典界面。样例如下:
步骤如下
- 添加源码文件
TabSheet.h、TabSheet.cpp到项目中
2)创建对话框资源、创建类
-
- 创建视图类 CSysAll,关联的对话框资源为:IDD_DIALOG_SYSALL
- 创建视图类CDlgTab1, CDlgTab2 CDlgTab3分别关联资源IDD_DIALOG_TAB1、IDD_DIALOG_TAB2、IDD_DIALOG_TAB3
以CSysAll类创建为例,过程参考下图步骤。
- 重载CSysALL类的OnInitialUpdate()方法
过程参考下图
void CSysAll::OnialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: 在此添加专用代码和/或调用基类
m_myTab.AddPage(_T("创建共享内存"), &m_dlgTab1, IDD_DIALOG1);
m_myTab.AddPage(_T("修改共享内存"), &m_dlgTab2, IDD_DIALOG2);
m_myTab.AddPage(_T("删除共享内存"), &m_dlgTab3, IDD_DIALOG3);
m_myTab.Show();
}
3)在CSysAll类中添加标签页成员变量,包含相应头文件
public:
CDlgTab1 m_dlgTab1;
CDlgTab2 m_dlgTab2;
CDlgTab3 m_dlgTab3;
//CTabCtrl m_myTab 手工替换代码如下:
CTabSheet m_myTab;
4)在CSysAll类中添加CTabSheet类成员变量
1 创建Tab资源
2 在CSysAll类中,添加成员变量
//CTabCtrl m_myTab; 手工的,把类升级成如下类:
CTabSheet m_myTab; 利用类向导工具
- 把CTabSheet的.h .cpp文件源码添加到项目文件中
过程参考下图:
5)在CSysAll类中添加WM_PAINT消息
过程如下:
代码如下
void CSysAll::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect, rect1;
this->GetClientRect(&rect);
m_myTab.GetClientRect(&rect1);
if ( (rect1.Width() < rect.Width()) )
m_myTab.MoveWindow(rect, FALSE);
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CFormView::OnPaint()
}
6.7.3 SecMngAdmin初始化
Admin读配置文件
若配置文件存在,则读取参数
若配置文件不存在, 则弹出对话框 让用户录入配置信息
6.7.4 SecMngAdmin配置参数
数据库的增删改查
odbc连接和关闭数据库
int CsecmngApp::NewOdbc_Connet() { CDatabase myDB; CString strCon; strCon.Format("DSN=%s;UID=%s;PWD=%s", g_dbSource, g_dbUse, g_dbpw); g_pDB = &myDB; //这样操作速度快 TRY { if( ! g_pDB->OpenEx(strCon, CDatabase::noOdbcDialog)) { AfxMessageBox("创建一条到数据源的连接发生错误, 请检查数据源配置是否正确! "); return -1; } } CATCH_ALL(e) { e->ReportError(); //打印异常 return -1; } END_CATCH_ALL return 0; } |
|
TRY
{
}
CATCH_ALL(e)
{
e->ReportError();
return -1;
}
END_CATCH_ALL
通过odbc驱动自动生成记录类
用记录类定义的变量,可以直接把内容写入到数据库中
Odbc打开表查询和多次查询
void CCfgView::OnInitialUpdate() { CFormView::OnInitialUpdate(); CSECMNGSRVCFG srvCfgSet(g_pDB); TRY { //"select * from SECMNG.SRVCFG where 'key = secmng_server_ip2'" srvCfgSet.m_strFilter.Format("key = '%s'", "secmng_server_ip"); if (!srvCfgSet.Open(CRecordset::snapshot, NULL, CRecordset::none)) { g_pDB->Rollback(); MessageBox( "打开ca.smSrvCfg表失败!", "数据库操作", MB_MODEMASK); return ; } if (!srvCfgSet.IsEOF()) // 有记录 { srvCfgSet.m_VALUDE.TrimRight(); srvCfgSet.m_VALUDE.TrimLeft(); m_strSvrIP = srvCfgSet.m_VALUDE; } Else // 无记录 { m_strSvrIP = ""; } srvCfgSet.m_strFilter.Format("key = '%s'", "secmng_server_port"); srvCfgSet.Requery(); if (!srvCfgSet.IsEOF()) { srvCfgSet.m_VALUDE.TrimRight(); srvCfgSet.m_VALUDE.TrimLeft(); m_strSvrPORT = srvCfgSet.m_VALUDE; } else { m_strSvrPORT = ""; } //查询 最大网点个数 srvCfgSet.m_strFilter.Format("key = '%s'", "secmng_server_maxnetnum"); srvCfgSet.Requery(); if (!srvCfgSet.IsEOF()) { srvCfgSet.m_VALUDE.TrimRight(); srvCfgSet.m_VALUDE.TrimLeft(); m_strSvrMaxNode = srvCfgSet.m_VALUDE; } else { m_strSvrMaxNode = "空值"; } srvCfgSet.Close(); UpdateData(FALSE); //把变量的值 传给 界面 } CATCH_ALL(e) { e->ReportError(); if(srvCfgSet.IsOpen()) { srvCfgSet.Close(); } } END_CATCH_ALL } |
odbc新增和修改、事物
//1 若表中记录已经存在,则修改;
//2 若表中记录不存在,则新增
void CCfgView::OnBnClickedButtonSvrcfg() { int dbtag = 0; UpdateData(TRUE); //界面的值传给变量 if (m_strSvrIP.IsEmpty()) { MessageBox( "IP地址为空", "服务器配置错误", MB_MODEMASK); return ; } if (m_strSvrPORT.IsEmpty()) { MessageBox( "端口为空", "服务器配置错误", MB_MODEMASK); return ; } if (m_strSvrMaxNode.IsEmpty()) { MessageBox( "最大网点数为空", "服务器配置错误", MB_MODEMASK); return ; } g_pDB->BeginTrans(); // wangbaoming CSECMNGSRVCFG srvCfgSet(g_pDB); TRY { srvCfgSet.m_strFilter.Format("key = '%s'", "secmng_server_ip"); if (!srvCfgSet.Open(CRecordset::snapshot, NULL, CRecordset::none)) { g_pDB->Rollback(); MessageBox( "打开ca.smSrvCfg表失败!", "数据库操作", MB_MODEMASK); return ; } if (!srvCfgSet.IsEOF()) // 有 { srvCfgSet.Edit(); srvCfgSet.m_VALUDE = m_strSvrIP; srvCfgSet.Update(); } Else // 无 { srvCfgSet.AddNew(); srvCfgSet.m_KEY = "secmng_server_ip"; srvCfgSet.m_VALUDE = m_strSvrIP; srvCfgSet.Update(); } //端口 srvCfgSet.m_strFilter.Format("key = '%s'", "secmng_server_port"); srvCfgSet.Requery(); if (!srvCfgSet.IsEOF()) { srvCfgSet.Edit(); srvCfgSet.m_VALUDE = m_strSvrPORT; srvCfgSet.AddNew(); } else { srvCfgSet.AddNew(); srvCfgSet.m_KEY = "secmng_server_port"; srvCfgSet.m_VALUDE = m_strSvrPORT; srvCfgSet.Update(); } //查询 最大网点个数 srvCfgSet.m_strFilter.Format("key = '%s'", "secmng_server_maxnetnum"); srvCfgSet.Requery(); if (!srvCfgSet.IsEOF()) { srvCfgSet.Edit(); m_strSvrMaxNode = srvCfgSet.m_VALUDE; srvCfgSet.Update(); } else { srvCfgSet.AddNew(); srvCfgSet.m_KEY = "secmng_server_maxnetnum"; srvCfgSet.m_VALUDE = m_strSvrMaxNode; srvCfgSet.Update(); } srvCfgSet.Close(); } CATCH_ALL(e) { dbtag = 1; e->ReportError(); if(srvCfgSet.IsOpen()) { srvCfgSet.Close(); } } END_CATCH_ALL if (dbtag == 1) { g_pDB->Rollback(); MessageBox( "保存SecMngServer配置信息失败", "数据库操作", MB_MODEMASK); return ; } else { g_pDB->CommitTrans(); //提交事务 MessageBox( "保存SecMngServer配置信息成功", "数据库操作", MB_MODEMASK); } return ; } |
6.7.5 SecMngAdmin网点信息管理
网点信息管理界面设计
CListCtrl属性配置 report属性
时间变量类型选择
CListCtrl控件的初始化
void CDlgNetInfo::OnInitialUpdate() { CFormView::OnInitialUpdate(); // TODO: 在此添加控件通知处理程序代码 HIMAGELIST hList = ImageList_Create(16, 16, ILC_COLOR8 | ILC_MASK, 8, 1); m_imageList.Attach(hList); CBitmap cBmp; cBmp.LoadBitmap(IDB_BITMAP_SECNODE); m_imageList.Add(&cBmp, RGB(255, 0, 255)); cBmp.DeleteObject(); m_listSecNode.SetImageList(&m_imageList, LVSIL_SMALL); DWORD dwExStyle = ListView_GetExtendedListViewStyle(m_listSecNode.m_hWnd); dwExStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES ; ListView_SetExtendedListViewStyle(m_listSecNode.m_hWnd,dwExStyle); CRect rect; //msdn m_listSecNode.GetClientRect(&rect); int nColInterval = rect.Width()/5; m_listSecNode.SetRedraw(FALSE); m_listSecNode.InsertColumn(0, "网点编号", LVCFMT_LEFT, nColInterval); m_listSecNode.InsertColumn(1, "网点名称", LVCFMT_LEFT, nColInterval); m_listSecNode.InsertColumn(2, "网点创建时间", LVCFMT_LEFT, nColInterval); m_listSecNode.InsertColumn(3, "网点状态", LVCFMT_LEFT, nColInterval); m_listSecNode.InsertColumn(4, "网点授权码", LVCFMT_LEFT, rect.Width()-4*nColInterval); m_listSecNode.SetRedraw(TRUE); // TODO: 在此添加专用代码和/或调用基类 } |
CListCtrl控件中插入简单数据
int CDlgNetInfo::DbInitListSecNode(CString &ID, CString &Name, CTime &time, int state, int authcode) { CString strTime; LVITEM lvi; lvi.mask = LVIF_IMAGE | LVIF_TEXT; lvi.iItem = 0; //在第几行上插入数据 始终头插法 lvi.iImage = 4; //插入第0列数据 lvi.iSubItem = 0; // Set subitem 0 lvi.pszText = (LPTSTR)(LPCTSTR)ID; m_listSecNode.InsertItem(&lvi); 插入第1列数据 lvi.iSubItem = 1; // Set subitem 1 lvi.pszText = (LPTSTR)(LPCTSTR)Name; m_listSecNode.SetItem(&lvi); //插入第2列数据 strTime = time.Format("%Y-%m-%d %H:%M:%S"); lvi.iSubItem = 2; // Set subitem 2 lvi.pszText = (LPTSTR)(LPCTSTR)strTime; m_listSecNode.SetItem(&lvi); //插入第3列数据 lvi.iSubItem = 3; // Set subitem 3 if (state == 1) { lvi.pszText = "禁用"; } else { lvi.pszText = "正常"; } m_listSecNode.SetItem(&lvi); //插入第4列数据 lvi.iSubItem = 4; // Set subitem 4 //CString strAuthcode(authcode) ; char buf[100]; sprintf(buf, "%d", authcode); lvi.pszText = buf; m_listSecNode.SetItem(&lvi); return 0; } |
CListCtl控件中插入数据库数据
通过odbc驱动生成网点管理记录类
void CDlgNetInfo::OnBnClickedButtonSearchSecinfo()
{
int dbtag = 0;
CWnd *myWnd = NULL;
CButton *But = NULL;
int rv = 0, tag = 0;//表示没有检索到记录
int dbTag = 0; //数据库操作是否失败0成功
CString strFilter ;
UpdateData(true); //把界面的值 传给 变量
myWnd = (CWnd *)GetDlgItem(IDC_CHECK_TIME);
But = (CButton *)myWnd;
if (But->GetCheck() == BST_CHECKED)
{
CTime sqlTime1(m_dateBegin.GetYear(), m_dateBegin.GetMonth(), m_dateBegin.GetDay(),
0, 0, 0);
CTime sqlTime2(m_dateEnd.GetYear(), m_dateEnd.GetMonth(), m_dateEnd.GetDay(),
23, 59, 59);
if (sqlTime1 >= sqlTime2)
{
MessageBox( "开始时间不能大于结束时间!", "时间查询", MB_MODEMASK);
return ;
}
//m_strFilter
CSECMNGSECNODE rsetMngSecNode(g_pDB);
TRY
{
if (!rsetMngSecNode.Open(CRecordset::snapshot, NULL, CRecordset::none ))
{
MessageBox( "打开CSECMNGSECNODE表失败!", "数据库操作", MB_MODEMASK);
return ;
}
m_listSecNode.DeleteAllItems(); //删除视图 所有行
m_listSecNode.SetRedraw(FALSE); //禁止刷新视图,避免重复插入条目时,闪屏
while (!rsetMngSecNode.IsEOF())
{
if (!(rsetMngSecNode.m_CREATETIME>=sqlTime1 &&
rsetMngSecNode.m_CREATETIME<=sqlTime2))
{
rsetMngSecNode.MoveNext();
continue;
}
rsetMngSecNode.m_ID.TrimLeft(); rsetMngSecNode.m_ID.TrimRight();
rsetMngSecNode.m_NAME.TrimLeft();rsetMngSecNode.m_NAME.TrimRight();
rsetMngSecNode.m_NODEDESC.TrimLeft();rsetMngSecNode.m_NODEDESC.TrimRight();
tag = 1; //有记录
DbInitListSecNode(rsetMngSecNode.m_ID,
rsetMngSecNode.m_NAME, rsetMngSecNode.m_CREATETIME,
rsetMngSecNode.m_STATE, rsetMngSecNode.m_AUTHCODE);
rsetMngSecNode.MoveNext();
}
m_listSecNode.SetRedraw(TRUE);
rsetMngSecNode.Close();
}
CATCH_ALL (e)
{
dbTag = 1;
e->ReportError();
if (rsetMngSecNode.IsOpen())
{
rsetMngSecNode.Close();
}
}
END_CATCH_ALL
if (dbTag == 1)
{
MessageBox( "检索数据库失败!", "数据库操作", MB_MODEMASK);
return ;
}
if (tag == 0)
{
MessageBox( "没有检索到符合条件的记录!", "数据库操作", MB_MODEMASK);
return ;
}
return ;
}
//编号
myWnd = (CWnd *)GetDlgItem(IDC_CHECK_NODEID);
But = (CButton *)myWnd;
if (But->GetCheck() == BST_CHECKED)
{
m_strNodeID.TrimLeft(); m_strNodeID.TrimRight();
if (m_strNodeID== "")
{
MessageBox( "网点编号不能为空", "网点信息检索", MB_MODEMASK);
return ;
}
if (m_strNodeID.GetLength() != 4)
{
MessageBox( "网点编号长度必须是4", "网点信息检索", MB_MODEMASK);
return ;
}
CSECMNGSECNODE rsetMngSecNode(g_pDB);
TRY
{
rsetMngSecNode.m_strFilter.Format("id='%s'", m_strNodeID);
if (!rsetMngSecNode.Open(CRecordset::snapshot, NULL, CRecordset::none))
{
MessageBox( "打开 网点信息表 失败!", "数据库操作", MB_MODEMASK);
return ;
}
//删除记录
if (rsetMngSecNode.IsEOF())
{
MessageBox( "没有检索到符合条件的记录!", "数据库操作", MB_MODEMASK);
rsetMngSecNode.Close();
return;
}
rsetMngSecNode.m_ID.TrimLeft(); rsetMngSecNode.m_ID.TrimRight();
rsetMngSecNode.m_NAME.TrimLeft();rsetMngSecNode.m_NAME.TrimRight();
rsetMngSecNode.m_NODEDESC.TrimLeft();rsetMngSecNode.m_NODEDESC.TrimRight();
m_listSecNode.DeleteAllItems(); //删除视图
DbInitListSecNode(rsetMngSecNode.m_ID, rsetMngSecNode.m_NAME, rsetMngSecNode.m_CREATETIME,
rsetMngSecNode.m_STATE, rsetMngSecNode.m_AUTHCODE);
rsetMngSecNode.Close();
}
CATCH_ALL(e)
{
dbTag = 1;
e->ReportError();
if (rsetMngSecNode.IsOpen())
{
rsetMngSecNode.Close();
}
}
END_CATCH_ALL
if (dbTag == 1)
{
MessageBox( "检索数据库失败!", "数据库操作", MB_MODEMASK);
return ;
}
return ;
}
// name
myWnd = (CWnd *)GetDlgItem(IDC_CHECK_NODENAME);
But = (CButton *)myWnd;
if (But->GetCheck() == BST_CHECKED)
{
m_strNodeName.TrimLeft(); m_strNodeName.TrimRight();
if (m_strNodeName== "")
{
MessageBox( "网点名称不能为空", "网点信息检索", MB_MODEMASK);
return ;
}
CSECMNGSECNODE rsetMngSecNode(g_pDB);
TRY
{
rsetMngSecNode.m_strFilter.Format("name='%s'", m_strNodeName);
if (!rsetMngSecNode.Open(CRecordset::snapshot, NULL, CRecordset::none))
{
MessageBox( "打开 网点信息表 失败!", "数据库操作", MB_MODEMASK);
return ;
}
//删除记录
if (rsetMngSecNode.IsEOF())
{
MessageBox( "没有检索到符合条件的记录!", "数据库操作", MB_MODEMASK);
rsetMngSecNode.Close();
return;
}
rsetMngSecNode.m_ID.TrimLeft(); rsetMngSecNode.m_ID.TrimRight();
rsetMngSecNode.m_NAME.TrimLeft();rsetMngSecNode.m_NAME.TrimRight();
rsetMngSecNode.m_NODEDESC.TrimLeft();rsetMngSecNode.m_NODEDESC.TrimRight();
m_listSecNode.DeleteAllItems(); //删除视图
DbInitListSecNode(rsetMngSecNode.m_ID, rsetMngSecNode.m_NAME, rsetMngSecNode.m_CREATETIME,
rsetMngSecNode.m_STATE, rsetMngSecNode.m_AUTHCODE);
rsetMngSecNode.Close();
}
CATCH_ALL(e)
{
dbTag = 1;
e->ReportError();
if (rsetMngSecNode.IsOpen())
{
rsetMngSecNode.Close();
}
}
END_CATCH_ALL
if (dbTag == 1)
{
MessageBox( "检索数据库失败!", "数据库操作", MB_MODEMASK);
return ;
}
return ;
}
}
CListCtl控件中的删除选中条目
思路:从界面上删除记录,从数据库中删除记录(事物)
//判断1条 多条记录;
从界面中找到网点编号,根据网点编号,从数据库中删除网点记录
从界面中删除显示。
void CDlgNetInfo::OnBnClickedButton5() { // TODO: 在此添加控件通知处理程序代码 int dbTag = 0; CString strTmp, strID, strFilter; //用户输入 异常判断 POSITION pos = m_listSecNode.GetFirstSelectedItemPosition(); if (pos == NULL) { MessageBox( "没有选中的项目, 请你先选中其中的一条记录!", "删除网点信息", MB_MODEMASK); return ; } int selCont = m_listSecNode.GetSelectedCount(); if (selCont >1 ) { MessageBox( "你选中了多行记录, 请你选中其中的一条记录!", "删除网点信息", MB_MODEMASK); return ; } int nItem = m_listSecNode.GetNextSelectedItem(pos); //得到选中行 strTmp = m_listSecNode.GetItemText(nItem, 3); if (strTmp == "已经使用") //wangbaoming { MessageBox( "该网点已经使用,不能被删除!", "删除网点信息", MB_MODEMASK); return ; } strID = m_listSecNode.GetItemText(nItem, 0); if (strID == "") { MessageBox( "该网点编号不能为空!", "删除网点信息", MB_MODEMASK); return ; } strTmp.Format("是否要删除编号为【%s】的网点信息吗?", strID); if (AfxMessageBox(strTmp,MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2) == IDNO) { return ; } strFilter.Format("id = '%s' ", strID); g_pDB->BeginTrans(); CSECMNGSECNODE rsetMngSecNode(g_pDB); TRY { rsetMngSecNode.m_strFilter = strFilter; if (!rsetMngSecNode.Open(CRecordset::snapshot, NULL, CRecordset::none)) { g_pDB->Rollback(); MessageBox( "打开网点信息表失败!", "数据库操作", MB_MODEMASK); return ; } //删除记录 if (!rsetMngSecNode.IsEOF()) { rsetMngSecNode.Delete(); } else { MessageBox( "没有检索到符合条件的记录!", "数据库操作", MB_MODEMASK); dbTag = 1; } rsetMngSecNode.Close(); } CATCH_ALL(e) { dbTag = 1; e->ReportError(); if (rsetMngSecNode.IsOpen()) { rsetMngSecNode.Close(); } } END_CATCH_ALL if (dbTag == 1) { g_pDB->Rollback(); MessageBox( "检索数据库失败!", "数据库操作", MB_MODEMASK); return ; } else { g_pDB->CommitTrans(); } //删除视图 m_listSecNode.DeleteItem(nItem); MessageBox( "删除网点信息成功!", "数据库操作", MB_MODEMASK); return ; } |
6.8Win SecClient客户端系统设计与实现
Win SecMngClient子系统_界面设计
界面设计及界面基本编码
Win SecMngClient子系统_集成组件
移植统一报文编解码组件
移植共享内存组件
移植统一数据传输组件
Win SecMngClient子系统_业务移植
初始化
客户端密钥协商/密钥校验模型linux到win移植
SecMngClient子系统的Win和Linux共享内存机制
常见问题:动态库release和debug版本
缺失msvcr120.dll动态库问题,原因是因为: 使用的动态库不是release版本的.
6.9外联接口组件设计与实现
消息加解密接口
文件加解密接口