C++ MFC学习 (六)
由于微软在VS2013 及之后不建议再使用 C/C++ 的传统库函数
scanf,strcpy,sprintf 等,所以直接使用这些库函数会提示 C4996 错误
VS建议采用带 _S的函数,如: scanf_s, strcpy_s , 但这些不是标准 C/C++ 函数。要想继续使用此函数,需要添加 _CRT_SECURE_NO_WARNINGS 这个预定义
添加方法:在项目 -> 属性 -> C/C++ ->预处理器 -> 预处理器定义中添加 _CRT_SECURE_NO_WARNINGS
设置窗体的图标,需要在MainFram文件下的OnCreate 函数添加,响应创建的消息
//设置窗体图标 参数; 窗口句柄 读取ICon文件 SetClassLong(m_hWnd, GCL_HICON, (LONG)AfxGetApp()->LoadIconW(IDI_ICON_WIN));
窗体标题分为两部分, 左侧和右侧
设置左侧,即销售管理系统 时,在对应的Doc文件中的OnNewDocument() 函数中添加
//设置标题 左侧 SetTitle(TEXT("销售管理系统"));
设置右侧,即V 1.0.0 时,在MainFram文件的初始化函数中添加
//设置标题 右侧标题 SetTitle(TEXT("V 1.0.0"));
设置窗口的位置和大小,在MainFram的初始化函数中
//设置窗口的位置和大小 CWnd::MoveWindow 函数 MoveWindow(0, 0, 800, 500); //设置居中显示 CenterWindow();
文件处理:
对文件进行处理时,可添加 设计文件处理类 CInfoFile
退出当前对话框 可使用 OnClose() 函数 退出整个程序可使用 exit(0)
添加需要继承MFC的类时,在创建时,选择MFC类
拆分窗口时,可通过 CSplitterWnd 类 在MainFram.h 中声明CSplitterWnd 对象
1 //静态拆分窗口 1行2列 m_spliter.CreateStatic this代表当前窗口 2 m_spliter.CreateStatic(this, 1, 2); 3 4 //创建视图:CSplitterWnd::CreateView 5 /* 6 0,0 :表示放在第0行第0列的位置 7 RUNTIME_CLASS(CSelectView) : 表示使用CSelectView这个类 8 CSize(250,500): 指定视图宽度和高度 9 pContext : 为OnCreateClient的最后一个形参 10 */ 11 m_spliter.CreateView(0, 0, RUNTIME_CLASS(CSelectView), CSize(250, 500), pContext); 12 13 /* 14 0,1 :表示放在第0行第1列的位置 15 RUNTIME_CLASS(CDisplayView) : 表示使用CSelectView这个类 16 CSize(250,500): 指定视图宽度和高度 17 pContext : 为OnCreateClient的最后一个形参 18 */ 19 m_spliter.CreateView(0, 1, RUNTIME_CLASS(CDispalyView), CSize(600, 500), pContext);
如下图所示:
普通View类 重写OnInitUpdate函数,来初始化一些显示
未放置Tree Ctrl 控件,可使用 GetTreeCtrl 获取一个 用一个TreeCtrl 的指针接收即可
MainFram 分屏 实现界面挂载
声明自定义消息,需要将自定义消息写到分界宏中,
1. 使用 PostMessage 发送消息
1 //CWind::PostMessage 将一个信息放入窗口的消息队列 2 //AfxGetMainWnd() 框架窗口对象的指针 3 //AfxGetMainWnd()->GetSafewnd() 获取返回窗口的句柄 4 //NM_A 发送自定义消息 5 //(WPARAM)NM_A 指定了附加的消息信息 6 //(LPARAM)0 指定了附加的消息信息,
2. 在MainFram 的 OnMyChange 中接收消息
下面为挂载代码
1 CCreateContext Context; 2 3 //挂载界面 4 Context.m_pNewViewClass = RUNTIME_CLASS(CUserDlg); //将上下文的变量 设置为需要显示的窗口的类 5 Context.m_pCurrentFrame = this; //获取当前主窗体 6 Context.m_pLastView = (CFormView *)m_spliter.GetPane(0, 1); //获取分割后的右侧窗体 7 m_spliter.DeleteView(0, 1); //删除现在的右侧界面 8 m_spliter.CreateView(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 500), &Context); //创建一个新的右侧界面 9 10 CUserDlg *pNewView = (CUserDlg *)m_spliter.GetPane(0, 1); //获取新分割后的右侧窗体 11 m_spliter.RecalcLayout(); // 重新布局 12 pNewView->OnInitialUpdate(); // 将CUserDlg的窗体初始化 13 m_spliter.SetActivePane(0, 1); //激活新建的右侧窗体