VS2017下新建项目的一些问题和解决方法,自己慢慢摸索的。希望有所帮助!

幻泪风痕 2019-03-01 11:58:23
新建项目

在创建界面时要注意视图类的选择,将视图类的基类设置为FromView即框架视图,否则视图类没有关联界面不能添加控件。

执行报错
RC2135file not found: MFCOffice.tlb
原因文件名包含了不可识别字符,如:汉字、特殊符号等;
解决办法:
双击报错,将报错名修改为指定的文件名。我预先设置的是MFC_Office.tlb修改后问题解决。
如果你不知道可以点击:“调试>>属性>>MIDL>>输出>>类型库” 查看文件名。

stdafx.h文件是很重要的头文件,需要定义全局变量、定义全局常量、定义全局函数等,都是在这里完成。另外包含自定义头文件也是在这里完成。他本身自动包含了常用必要的标准头文件。
定义全局常量:
如:
#define MY_MSG1 WM_USER+1//定义一个自己的消息,放在预编译头文件中供全局使用
定义结构体:
如:
typedef struct 窗口位置大小
{
int 屏幕高, 屏幕宽, 窗口x, 窗口y, 窗口高, 窗口宽;
};
定义全局变量、函数:
如果直接在stdafx.h文件中定义,由于所有的源文件都必须包含stdafx.h他,将导致反复重定义报错。
//extern以表示变量或者函数的定义在别的文件中。防止全局变量重复定义报错。
如:
extern HMODULE 主程序实例句柄;
等于在头文件中申明了将在别处定义,对应的我们就在stdafx.cpp源文件中进行定义。
如:
HMODULE 主程序实例句柄 
Resources.h//资源头文件定义各资源ID
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 由 HelloWindow.rc 使用
//
#define IDR_MAINFRAME 128//图标资源ID
#define IDM_ABOUTBOX 0x0010//
#define IDD_ABOUTBOX 100//关于对话框ID
#define IDP_OLE_INIT_FAILED 100
#define IDS_ABOUTBOX 101
#define IDD_HELLOWINDOW_DIALOG 102//主对话框ID
#define IDP_SOCKETS_INIT_FAILED 103

// 新对象的下一组默认值
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE 129 //下一个资源ID(插入的一些对话框、图片、图标等)
#define _APS_NEXT_CONTROL_VALUE 1000 //下一个控件ID(各种控件ID)
#define _APS_NEXT_SYMED_VALUE 101 //状态栏、工具栏上所用控件与标签
#define _APS_NEXT_COMMAND_VALUE 32771 //下一个命令ID(主菜单、弹出菜单等)
#endif
#endif

添加资源:
1、将资源先复制到res文件夹中//这么做资源文件可以很好的隔离出来,也方便调用
2、打开资源视图,找到对应需要添加的资源。右键>>添加资源(A)>>选择添加的对应类型>>导入>>选择对应文件确认



MFC程序
由于没有main函数需要通过声明对象形式进入函数体的循环中,对应的就是XXXApp(应用程序类)进入他定义的程序入口。
例如:
// 唯一的 CMFCOfficeApp 对象
CMFCOfficeApp theApp;
1)应用程序类 XXXApp
InitInstance()//程序的入口地址包含以下工作:① class CDocTemplate;// 文档创建模板。 ② CSingleDocTemplate; // SDI支持。 ③class CMultiDocTemplate; // MDI支持。

// 注册应用程序的文档模板。 文档模板
// 将用作文档、框架窗口和视图之间的连接
CMultiDocTemplate* pDocTemplate;//注册关联用指针
pDocTemplate = new CMultiDocTemplate(//新建加载关联,并用注册指针指向关联
IDR_MFCOfficeTYPE,
RUNTIME_CLASS(CMFCOfficeDoc),
RUNTIME_CLASS(CChildFrame), // 自定义MDI子框架
RUNTIME_CLASS(CMFCOfficeView));
if (!pDocTemplate)//判断是否加资成功
return FALSE;
AddDocTemplate(pDocTemplate);//向应用程序维护的可用文档模板列表中追加文档模板。
可以建立多个视图模板,新建Dialog资源:右键Dialog添加资源,点击Dialog前加号选择IDD_FORMVIEW新建。

右键添加类,输入类名。目前VS2017及VS2019均没有将FromView类列入基类下拉选项中,这里就先用默认基类选项创建文件即可。之后手动改写。

打开String Table找到“IDR_文件名TYPE”可以他的定义:
“\nMFCOffice\nMFCOffice\n\n\nMFCOffice.Document\nMFCOffice.Document”
仿照他新建一个“IDR_MyFormViewTYPE”并为他定义:
“\n我的视图\n创建自定义视图\n\n\nMFCOffice.Document\nMFCOffice.Document”

回到源程序里加一段程序
pDocTemplate = new CMultiDocTemplate(//新建加载关联,并用注册指针指向关联
IDR_MyFormViewTYPE,
RUNTIME_CLASS(CMFCOfficeDoc),
RUNTIME_CLASS(CChildFrame), // 自定义MDI子框架
RUNTIME_CLASS(我的视图));
if (!pDocTemplate)//判断是否加资成功
return FALSE;
AddDocTemplate(pDocTemplate);//向应用程序维护的可用文档模板列表中追加文档模板。

调试运行弹出下框,就可以选择自己定义的新框架视图了。

// 创建主 MDI 框架窗口
CMainFrame* pMainFrame = new CMainFrame;//建立框架指针,指向框架
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))//让框架指针“pMainFrame”根据共享支援ID“IDR_MAINFRAME”,加资框架;并判断是否成功。
{
delete pMainFrame;
return FALSE;
}
m_pMainWnd = pMainFrame

在InitInstance()中,有一个命令行的执行过程,当命令行上没有参数时,函数ParseCommandLine(cmdInfo)会将CCommandLineInfo::m_nShellCommand成员置为CCommandLineInfo::FileNew,这将导致ProcessShellCommand调用CWinApp::OnFileNew成员函数。这里我们要防止程序在开始时调用OnFileNew。
// 分析标准 shell 命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;//不自动创建视图
ParseCommandLine(cmdInfo);

pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);//显示窗口
pMainFrame->UpdateWindow();//更新窗口
在函数里可以将常用的关于程序自身的信息获取和定义一下。

出现了(“error C4996: 'getpid':The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name:”) 的报错
调试>>属性>>C/C++>>预处理器>>预处理器定义>>编辑

添加内容:
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_DEPRECATE

ExitInstance()//当接收到WM_QUIT消息后就会ExitInstance
2)框架类 CMainFrame
//成员初始化
CMainFrame::CMainFrame() noexcept
//创建窗口前
PreCreateWindow(CREATESTRUCT& cs)//获取及修改窗口属性
CREATESTRUCT成员:
LPVOID lpCreateParams;
HINSTANCE hInstance; //应用程序的实例句柄
HMENU hMenu; //窗口菜单句柄
HWND hwndParent; //父窗口句柄
int cy; //指定新窗口的高度,以像素为单位
int cx; //指定新窗口的宽度,以像素为单位
int y; //指定新窗口的左上角x坐标
int x; //指定新窗口的左上角y坐标
LONG style; //指定新窗口的类型(风格)
LPCTSTR lpszName; //指定新窗口的名称
LPCTSTR lpszClass; //指定新窗口类的名称
DWORD dwExStyle; //指定新窗口扩展风格。
修改属性报错(“error MSB8011: 未能注册输出。请尝试启用“逐用户重定向”,或者使用提升的权限从命令提示符处注册该组件”)
工程属性-> 链接器->常规->注册输出 ,将此项选择否。

//窗口创建后
OnCreate(LPCREATESTRUCT lpCreateStruct)//触发WM_CREATE,是WM_CREATE,消息的处理函数

添加虚函数修改窗口原件:图标、标题、鼠标。
打开类视图选择对应类右键选择类向导,选择虚函数输入OnUpdateFrameTitle,并双击添加OnUpdateFrameTitle初始化函数,添加需要的初始化操作。

void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
{
// TODO: 在此添加专用代码和/或调用基类
主窗口标题 = _T("自定义标题");
SetWindowText(主窗口标题);
CMDIFrameWndEx::OnUpdateFrameTitle(bAddToTitle);
}

3)视图类 XXXCView
OnDraw(CDC* /*pDC*/)//绘图,功能与OnPaint()一致,OnPaint()实际是调用OnDraw(CDC* /*pDC*/)当你添加了OnPaint()那么在OnDraw(CDC* /*pDC*/)中写的函数就会被屏蔽。


添加事件对程序的修改,系统自动:①在视图类头文件中写入DECLARE_MESSAGE_MAP()申明②在视图类源文件中写入BEGIN_MESSAGE_MAP(XXXView, CView)和END_MESSAGE_MAP(),并在之间插入对应事件宏如“ON_CBN_SELCHANGE(IDC_COMBO_COM_NUM, &串口通讯窗口::切换串口号)”,③在视图类定义头文件中public:下自动插入声明afx_msg void xxx();函数申明,④在视图类源文件中插入XXXView::xxx(){}处理函数。
具体处理在写在处理函数中即可。


定时器添加,
在初始化函数中写入
SetTimer(定时器ID,时间间隔,处理函数); //打开定时器,定时器ID是自己定义的用于区分定时,间隔时间单位是ms表示多少ms后进入处理函数,处理函数如是NULL则使用标准时间处理事件函数
插入定时器处理函数
ON_WM_TIMER()///标准时间处理事件函数宏,处理函数为OnTimer(UINT_PTR nIDEvent)
afx_msg void OnTimer(UINT_PTR nIDEvent); //标准时间处理事件函数,添加步骤与普通加事件的添加类似。当时间到达定时器的定时时间nIDEvent就会等于该定时器的定时器ID。
结束定时器
KillTimer(定时器ID);



4)文档类 XXXDoc
编程过程中很少编辑文档类,他是由MFC与编写好的。
BOOL CMFCOfficeDoc::DeleteContents()//新建视图时调用先执行,做一些释放资源的操作
BOOL CMFCOfficeDoc::OnNewDocument()//新建视图时调用再执行,后新建
void CMFCOfficeDoc::Serialize(CArchive& ar)//保存和打开文件时调用执行,并可以向文件内读写相应信息

事件消息在视图类中添加并处理,因为视图类是覆盖在框架之上的,消息无法被框架捕捉。
事件消息的添加步骤:①打开类视图(点击主菜单中视图中的类视图),②在类视图中点击XXXView右键属性,③点击 图标,④选择要添加的事件点击后方白色区域添加事件。
...全文
495 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2019-03-03
  • 打赏
  • 举报
回复
个人觉得MFC有点过时了,图形用户界面(GUI)编程可以学习C++ Builder,架构先进(和C#一样拖控件),入门比较容易。

  C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面,利用可视的组件/控件像“搭积木”一样,以“所见即所得”的方式搭建应用程序的界面,这也是C++ Builder这个名字中Builder的概念。这样,只需要用C++语言编写业务逻辑代码,类似于DOS下文本界面编程,只要专注于实现业务逻辑功能就可以了,代码非常简洁。数据的输入和表现,都在图形用户界面,非常直观、易用。这就是RAD开发(Rapid Application Development,快速应用程序开发)。

书籍推荐:
《C++Builder 6程序设计教程(第二版)》 (陆卫忠,刘文亮 等编著 /2011-04-01 /科学出版社)(当当网)
《C++Builder 6编程实例精解》(赵明现),PDF,是数字版的,非扫描版的,里面还有一个俄罗斯方块游戏的完整实现。
《精彩C++Builder 6程序设计》(台湾 吴逸贤),里面有10几个简单小游戏的实现,可以自己看懂以后再重写,才是自己掌握的。
《C++ Builder 5高级编程实例精解》(刘滨 编著)都是较大的实用的程序。

C++ Builder书籍下载:
https://pan.baidu.com/s/13n9hxwVj9ai1p5L2rQC83Q

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧