安全传输平台项目——配置管理终端-框架搭建-初始化
在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。
10-安全传输平台项目-第09天(配置管理终端-框架搭建-初始化)
一、复习
1、复习数据库写入
2、复习框架导入
》创建MFC项目:
主函数(类似于main)在SecMngAdmin0325.cpp中。
界面部分在MainFrm.cpp中,需要在其中添加启动的样式:
1)切换到“类视图”,在“CMainFrame”右键选择“类向导”,选择“类向导”,点击“虚函数”,点击“OnCreateClient”,点击“应用”,点击“确定”。
然后在其中添加代码:
>CMainFrame::OnCreateClient重写代码如下:
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); }
2)在MainFrm.h中,包含相应头文件,添加对象变量定义
添加
#include "GfxSplitterWnd.h" #include "GfxOutBarCtrl.h"
然后在class CMainFrame: public CFrameWnd中添加声明:
// 特性 public: CGfxSplitterWnd wndSplitter; CGfxOutBarCtrl wndBar; CImageList imaLarge, imaSmall; CTreeCtrl wndTree;
3)这时编译运行,只剩两个错误:
先解决第二个错误:
在 CMainFrame::OnCreateClient函数之前添加定义nImages:
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, };
然后添加7张图片:
ico目录下有(log.ico、op_log.ico、re.ico、report.ico、req.ico、set.ico、user.ico)7个ico图片放入项目的文件夹的下一级res目录下;然后打开“资源视图”,在“secmngAdmin411.rc”右键“添加资源”,点击“导入”,选择这7个ico文件,点击“打开”(这时多了一个Icon目录,里面有这7个文件),右键“属性”进行设置ID:
其ID 更改:IDC_ICON7(人图标)更改为:IDI_ICON_USER;
IDC_ICON6更改为:IDI_ICON_SET;
IDC_ICON5更改为:IDI_ICON_REQ;
IDC_ICON4更改为:IDI_ICON_REPORT;
IDC_ICON3更改为:IDI_ICON_RE;
IDC_ICON2更改为:IDI_ICON_OP_LOG;
IDC_ICON1更改为:IDI_ICON_LOG;
注意,每步更改后,点击“都保存”,会弹出警告-修改影响多处,点击“是”。
4)这时编译运行,只剩1个错误:
打开“资源视图”,添加“Dialog”:
在资源视图左侧“Dialog”处右键“插入Dialog”,然后删除“确定”和“取消”按钮,修改对话框的ID(在“IDD_DIALOG1”右键“属性”进行修改ID为:IDD_FORMBACKGROUND_FORM);
点击对话框,修改属性:修改Border属性“外框对话框”配置成None;Style属性“Popup”配置成child
点击对话框,右键“添加类”(或者“双击”),然后输入类名:CFormBackground,基类选择: CFormView
然后,包含类对象:在MainFrom头文件中添加 #include "FormBackground.h"
最后点击“运行”,会弹出:
二、安全传输平台项目——配置管理终端-框架搭建-初始化
1、重画背景onDrow
1)切换到“类视图”,选择“CFormBackground”,右键点击“类向导”,选择“虚函数”:
然后在其中添加代码:
>CFormBackground::OnDraw重写代码如下:(注意:函数注释掉的参数pDC打开!)
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); }
2)bmp目录下有(background.bmp)1个bmp图片放入项目的文件夹的下一级res目录下;然后打开“资源视图”,在“secmngAdmin411.rc”右键“添加资源”,点击“导入”,选择这1个bmp文件,点击“打开”(这时多了一个Bitmap目录,里面有这7个文件),右键“属性”进行设置ID:
其ID 更改:IDB_BITMAP1更改为:IDB_BITMAP_BACK;
最后点击“运行”,会弹出:
2、界面切换-CCfgView
CMainFrame类中添加视图切换自定义消息:
1)在MainFrame.h中添加自定义消息声明:
// 生成的消息映射函数 protected: DECLARE_MESSAGE_MAP() afx_msg long OnOutbarNotify(WPARAM wParam, LPARAM lParam);//声明
2)在MainFrame.cpp中添加自定义消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
… …
ON_MESSAGE(WM_OUTBAR_NOTIFY, OnOutbarNotify) // 注意不能添加分号!!!
……
END_MESSAGE_MAP()
3)在MainFrame.cpp中添加消息映射函数的实现
long CMainFrame::OnOutbarNotify(WPARAM wParam, LPARAM lParam) { switch (wParam) { case NM_OB_ITEMCLICK: // cast the lParam to an integer to get the clicked item { 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; }
4)打开“资源视图”,添加“Dialog”:
(1)在资源视图左侧“Dialog”处右键“插入Dialog”,然后删除“确定”和“取消”按钮,修改对话框的ID(在“IDD_DIALOG2”右键“属性”进行修改ID为:IDD_DIALOG_CFG);
(2)点击对话框,修改属性:修改Border属性“外框对话框”配置成None;Style属性“Popup”配置成child;
(3)点击对话框,右键“添加类”,然后输入类名:CCfgView,基类选择: CFormView
(4)然后,包含类对象:在MainFrom头文件中添加 #include "CfgView.h"
(5)在IDD_DIALOG_CFG的Dialog中添加:
3、界面切换-网点信息管理界面NetInfo
(1)在资源视图左侧“Dialog”处右键“插入Dialog”,然后删除“确定”和“取消”按钮,修改对话框的ID(在“IDD_DIALOG3”右键“属性”进行修改ID为:IDD_DIALOG_NETMNG);
(2)点击对话框,修改属性:修改Border属性“外框对话框”配置成None;Style属性“Popup”配置成child;
(3)点击对话框,右键“添加类”,然后输入类名:CDlgNetInfo,基类选择: CFormView
(4)然后,包含类对象:在MainFrom头文件中添加 #include "DlgNetInfo.h"
(5)在IDD_DIALOG_CFG的Dialog中添加:
同理,
为COpTranView类添加Dialog资源(id可以命名:IDD_DIALOG_TRAN)
为CSysAll类添加Dialog资源(id可以命名:IDD_DIALOG_SYSALL)
4、多态知识回顾
面向对象:继承(子类可以使用父类的变量和函数)、多态、封装(功能相近和相似的代码集成)
多态:
1)父类指针指向子类对象;2)继承;3)虚函数重写
练习:
class parent { public: virtual void print() { printf("I am parent.\n"); } } class child:public parent { public: virtual void print() { printf("I am child.\n"); } } void howToPrint(parent *p) { p->print(); } int main() { parent p1; child c1; howToPrint(&p1); howToPrint(&c1);//多态 }
多态实现的原理:1)每个类对象有一个vptr指针,指向虚函数表首地址;2)虚函数表
5、多态分析和开源源码走读
为什么重写了OnCreateClient函数,可以实现左侧的样式?
》项目中的多态分析:
6、小结:
》对接开源框架相关:
1)创建MFC项目;
2)导入开源文件 9个(.cpp .h);
3)CString --> const char * 在项目上右键--> 属性 --> 字符集:使用unicode字符集 --> 使用多字节字符集;
VS2013:如果,上述操作不生效。使用管理员身份运行:vc_mbcsmfc.exe
4)导入.cur图片资源 --> MFC项目资源目录res中;
5)“资源视图”标签,任意一个目录上 右键“添加资源”-->“导入”选择res中的.cur 文件(3个)添加到项目中。
6)根据错误提示,修改ID;
7)添加消息宏定义 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
8)给CMainFrame类 重写父类的 onCreateClient() 虚函数;
9)添加代码实现 QQ 抽屉效果:(1)视图的切分;(2)视图的切换;
10)添加类对应头文件 --MainFrame.h
#include "GfxSplitterWnd.h" #include "GfxOutBarCtrl.h"
11)添加类变量 --MainFram.h
public: CGfxSplitterWnd wndSplitter; CGfxOutBarCtrl wndBar; CImageList imaLarge, imaSmall; CTreeCtrl wndTree;
12)添加控件Dialog
在“资源视图”的“Dialog”目录上右击,添加一个新的Dialog
修改ID、修改Dialog属性 Border --> None、修改 Style属性 Popup -->child
13)给Dialog添加类CFormBackground
继承自CFormView 类
#include "FormBackground.h" 添加到 MainFrame.cpp或MainFrame.h
14)onCreateClient() 函数实现之前 nImages 数组
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, };
15)导入.ico图片到项目res目录中
一次修改ID(7个)
16)添加背景图片
给CFormBackground 重写onDraw函数 -->用到bmp 图片资源
在函数内部添加代码。
导入 background.bmp图片
修改ID
17)完成视图切换功能
(1)添加消息声明
afx_msg long OnOutbarNotify(WPARAM wParam, LPARAM lParam);
(2)注册消息映射
ON_MESSAGE(WM_OUTBAR_NOTIFY, OnOutbarNotify)
(3)对应消息声明添加实现。-->MainFram.cpp
在函数内部添加代码。
18)添加控件Dialog
(1)在“资源视图”的“Dialog”目录上右击,添加一个新的Dialog
修改ID、修改Dialog属性 Border --> None、修改 Style属性 Popup -->child
给Dialog添加类CCfgView
#include "CfgView.h" 添加到MainFram.cpp 或 MainFram.h
【可选】在Dialog中添加控件
(2)在“资源视图”的“Dialog”目录上右击,添加一个新的Dialog
修改ID、修改Dialog属性 Border --> None、修改 Style属性 Popup -->child
给Dialog添加类CDlgNetInfo
#include "DlgNetInfo.h" 添加到MainFram.cpp 或 MainFram.h
【可选】在Dialog中添加控件
7、管理终端功能简析
8、初始化-获取配置文件路径
9、创建对话框
10、弹窗供用户输入信息
11、将用户录入数据保存ini文件
12、全局变量赋值及取消按钮
13、测试连接数据库
14、总结
在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。