数据安全传输基础设施平台(四)

接上(三)

        

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多标签页创建

多标签页在项目开发中,是一个经典界面。样例如下:

 

步骤如下

  1. 添加源码文件

TabSheet.h、TabSheet.cpp到项目中  

2)创建对话框资源、创建类

    1. 创建视图类 CSysAll,关联的对话框资源为:IDD_DIALOG_SYSALL
    2. 创建视图类CDlgTab1, CDlgTab2 CDlgTab3分别关联资源IDD_DIALOG_TAB1、IDD_DIALOG_TAB2、IDD_DIALOG_TAB3

以CSysAll类创建为例,过程参考下图步骤。

 

  1. 重载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; 利用类向导工具

 

  1. 把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外联接口组件设计与实现

消息加解密接口

文件加解密接口

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/260034.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

案例077:基于微信小程序的停车场管理系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

vite与webpack?

vite对比react-areate-app 1、构建速度 2、打包速度 3、打包文件体积

杰发科技AC7840——在Eclipse环境下使用Jlink调试

序 杰发给的代码里面已经做代码相关配置&#xff0c;搭建好eclipse环境即可运行&#xff0c;搭建步骤还是比较简单的。 参考文章 如何使用Eclipse搭配JLink来调试HelloWold应用程序&#xff1f;-电子发烧友网 软件链接 杰发科技Eclipse的sample代码里面的doc文章&#xff…

本地使用 docker 运行OpenSearch + Dashboard + IK 分词插件

准备基础镜像 注意一定要拉取和当前 IK 分词插件版本一致的 OpenSearch 镜像: https://github.com/aparo/opensearch-analysis-ik/releases 写这篇文章的时候 IK 最新版本 2.11.0, 而 dockerhub 上 OpenSearch 最新版是 2.11.1 如果版本不匹配的话是不能用的, 小版本号对不上…

加密后的数据该如何支持模糊查询

加密后的数据该如何支持模糊查询 在日常工作中&#xff0c;我们经常会有一些模糊查询的条件&#xff0c;比如说按照手机号模糊查询&#xff0c;或者是身份证号码。正常情况下我们可以使用 select * from user where mobile like %123% 来模糊查询&#xff0c;但是这种方式是…

实战案例:缓存不一致问题的解决(redis+本地缓存caffine)

一.问题引入 目前在写项目的时候&#xff0c;在B端查看文章&#xff0c;A端修改文章。为了增加效率&#xff0c;以及防止堆内存溢出&#xff0c;在B端选择本地缓存文章的方案。但是目前出现了A端对文章修改之后&#xff0c;B端读的还是旧数据&#xff0c;出现了缓存不一致的问…

【算法与数据结构】1005、LeetCode K 次取反后最大化的数组和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题允许某个下标的数字多次翻转&#xff0c;因此思路比较简单。首先&#xff0c;我们要求最大和&…

【【迭代七次的CORDIC算法-Verilog实现】】

迭代七次的CORDIC算法-Verilog实现求解正弦余弦函数 COEDIC.v module CORDIC #(parameter DATA_WIDTH 4d8 , // we set data widthparameter PIPELINE 4d8)(input clk ,input …

vivado 关于时钟

关于时钟 在数字设计中&#xff0c;时钟代表了从寄存器可靠传输数据的时间基准注册。AMD Vivado™集成设计环境&#xff08;IDE&#xff09;计时引擎使用时钟计算时序路径要求并通过以下方式报告设计时序裕度的特性松弛计算的方法有关更多信息&#xff0c;请参阅Vivado Design…

什么是数据仪表板?数据可视化仪表盘怎么制作?

在数据经济时代&#xff0c;分析数据是每个企业做出最佳决策的关键。但是&#xff0c;手动分析和解释大量数据是不可行的。数据可视化对于分析数据中存在的各种有价值信息至关重要&#xff0c;包括可见趋势和隐藏趋势等。仪表盘显示可视化趋势和信息&#xff0c;例如 KPI、趋势…

Everything 搜索

正则表达式Regex 首先需要开启 Everything 工具在&#xff08;字符串&#xff09;查找时&#xff0c;对正则表达式功能的支持&#xff1a; 需要在【菜单栏】⇒ 【Search】⇒ 勾选【Enable Regex】 查看Everything 支持的语法:

c语言:求算数平均数|练习题

一、题目 输入3个数&#xff0c;求这三个数的算术平均数 二、代码图片【带注释】 三、源代码【带注释】 #include <stdio.h> #include<math.h> //输入正整数a、b、c的值&#xff0c; //求其算术平均值,并保留两个小数位输出 int pass0;//定义一个开关&#xff0c;…

solidity 重入漏洞

目录 1. 重入漏洞的原理 2. 重入漏洞的场景 2.1 msg.sender.call 转账 2.2 修饰器中调用地址可控的函数 1. 重入漏洞的原理 重入漏洞产生的条件&#xff1a; 合约之间可以进行相互间的外部调用 恶意合约 B 调用了合约 A 中的 public funcA 函数&#xff0c;在函数 funcA…

关于“Python”的核心知识点整理大全32

目录 12.6.4 调整飞船的速度 settings.py ship.py alien_invasion.py 12.6.5 限制飞船的活动范围 ship.py 12.6.6 重构 check_events() game_functions.py 12.7 简单回顾 12.7.1 alien_invasion.py 12.7.2 settings.py 12.7.3 game_functions.py 12.7.4 ship.py …

数据分析基础之《numpy(6)—合并与分割》

了解即可&#xff0c;用panads 一、作用 实现数据的切分和合并&#xff0c;将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […

maven限制内存使用峰值/最大内存

前言 通过设置虚拟机的内存大小&#xff0c;达到限制maven内存使用峰值的效果 方法1&#xff1a;修改mvn脚本 找到mvn脚本在MAVEN_OPTS参数值添加-Xms、-Xmx参数&#xff1a;MAVEN_OPTS"$MAVEN_OPTS -Xms512m -Xmx512m"效果图 windows系统下修改MAVEN_OPTS参数 …

java8实战 lambda表达式、函数式接口、方法引用双冒号(中)

前言 书接上文&#xff0c;上一篇博客讲到了lambda表达式的应用场景&#xff0c;本篇接着将java8实战第三章的总结。建议读者先看第一篇博客 其他函数式接口例子 上一篇有讲到Java API也有其他的函数式接口&#xff0c;书里也举了2个例子&#xff0c;一个是java.util.functi…

重温经典struts1之自定义转换器及注册的两种方式(Servlet,PlugIn)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 Struts的ActionServlet接收用户在浏览器发送的请求&#xff0c;并将用户输入的数据&#xff0c;按照FormBean中定义的数据类型&#xff0c;赋值给FormBean中每个变量&a…

SOME/IP SubscriberEventGroup

1 SOME/IP SubscriberEventGroup SubscriberEventGroup是SOME/IP中的一种服务发现和注册的消息类型,它用于让服务使用者订阅服务提供者的事件组。 事件组是一种将服务的方法和字段分组的方式,它可以让服务使用者只接收感兴趣的数据,而不是所有的数据。 SubscriberEventGrou…

w13渗透测试实战之https账号密码捕抓

此次实验需要配合arp欺骗,不知道arp欺骗的&#xff0c;可以查看这篇w13渗透测试实战之ARP欺骗攻击&#xff08;ARP断网攻击&#xff09; 一、实验环境 攻击机&#xff1a;linux Kali 靶机&#xff1a;window 7 网络环境&#xff1a;虚拟机NAT 网关&#xff1a;192.168.89.2实…