侯捷先生《深入浅出MFC》一书已经成书十余年了,当时用的还是VC6.0,而现在大多数人用的都是从VS2010到VS2015这些版本。今年刚毕业的我进入公司学习使用MFC,就是用的VS2012.与侯捷先生《深入浅出MFC》书中的东西相比,有了不小的变化,现在我来说说自己这两天改写“Hello, MFC”代码的心得。

首先我完全按书上的打代码,一堆错误,然后我一句一句在网上找,改正后,成了下面代码:

resource.h:
//resource.h
#define IDM_ABOUT 100\n

hello.rc:
//hello.rc
#include "Resource.h"
#include "afxres.h"

JJHouRIcon             ICON DISCARDABLE "JJHOUR.ico"
AFX_IDI_STD_FRAME      ICON DISCARDABLE "JJHOUR.ico"

MainMenu MENU DISCARDABLE
{
POPUP "&Help"
{
MENUITEM "&About HelloMFC...", IDM_ABOUT
}
}

AboutBox DIALOG DISCARDABLE 34, 22, 147, 55
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About Hello"
{
ICON            "JJHouRIcon",IDC_STATIC,11,17,18,20
LTEXT           "Hello MFC 4.0",IDC_STATIC,40,10,52,8
LTEXT           "Copyright 1996 Top Studio",IDC_STATIC,40,25,100,8
LTEXT           "J.J.Hou",IDC_STATIC,40,40,100,8
DEFPUSHBUTTON   "OK",IDOK,105,7,32,14,WS_GROUP
}

stdafx.h:
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
#include <afxwin.h>         // MFC 核心组件和标准组件
#include <afxext.h>         // MFC 扩展
#include <afxdisp.h>

stdafx.cpp :
// stdafx.cpp : 只包括标准包含文件的源文件
// MFCApplication2.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息

#include "stdafx.h"

Hello.h:
class CMyWinAPP : public CWinApp
{
public:
BOOL InitInstance();
};

//----------------------------------------------------------------
class CMyFrameWnd : public CFrameWnd
{
public:
CMyFrameWnd();
afx_msg void OnPaint();
afx_msg void OnAbout();

private:
DECLARE_MESSAGE_MAP()
static VOID CALLBACK LineDDACallback(int,int,LPARAM);
};

Hello.cpp:
#include "stdafx.h"
#include "Hello.h"
#include "Resource.h"

CMyWinAPP theApp;  //application object

//----------------------------------------------------------------
// CMyWinAPP's member
//----------------------------------------------------------------
BOOL CMyWinAPP::InitInstance()
{
m_pMainWnd = new CMyFrameWnd();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
//----------------------------------------------------------------
// CMyFrameWnd'smember
//----------------------------------------------------------------
CMyFrameWnd::CMyFrameWnd()
{
Create(NULL, _T("Hello MFC"), WS_OVERLAPPEDWINDOW, rectDefault,
NULL, _T("MainMenu"));  //"MainMenu"定义于RC档
}
//----------------------------------------------------------------
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_COMMAND(IDM_ABOUT,OnAbout)
ON_WM_PAINT()
END_MESSAGE_MAP()
//----------------------------------------------------------------
void CMyFrameWnd::OnPaint()
{
CPaintDC dc(this);
CRect rect;

GetClientRect(rect);

dc.SetTextAlign(TA_BOTTOM | TA_CENTER);

::LineDDA(rect.right/2, 0, rect.right/2, rect.bottom/2,
(LINEDDAPROC) LineDDACallback, (LPARAM) (LPVOID) &dc);
}
//----------------------------------------------------------------
VOID CALLBACK CMyFrameWnd::LineDDACallback(int x, int y, LPARAM lpdc)
{
WCHAR szText[] =L"Hello, MFC";
    ((CDC*)lpdc)->TextOutW(x,y,szText,sizeof(szText)-1);
for(int i=1; i<50000; i++);  //纯粹是为了延迟下降速度,以利观察
}
//----------------------------------------------------------------
void CMyFrameWnd::OnAbout()
{
CDialog about(_T("AboutBox"), this);  //"AboutBox"定义于RC档
about.DoModal();
}

调试结果如下:

1>------ 已启动生成: 项目: MFCApplication2, 配置: Debug Win32 ------
1>  Hello.cpp
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27): error C2017: 非法的转义序列
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27): error C2146: 语法错误: 缺少“}”(在标识符“n”的前面)
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27): error C2146: 语法错误: 缺少“;”(在标识符“n”的前面)
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27): error C2065: “n”: 未声明的标识符
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27): error C3867: “CMyFrameWnd::OnAbout”: 函数调用缺少参数列表;请使用“&CMyFrameWnd::OnAbout”创建指向成员的指针
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27): error C2059: 语法错误:“,”
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(28): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(28): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(28): error C2059: 语法错误:“,”
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29): error C2059: 语法错误:“}”
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29): error C2653: “TheBaseClass”: 不是类或命名空间名称
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29): error C2065: “GetThisMessageMap”: 未声明的标识符
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29): error C2065: “_messageEntries”: 未声明的标识符
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29): error C2059: 语法错误:“return”
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(32): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>c:\users\john\documents\visual studio 2012\projects\mfcapplication2\mfcapplication2\hello.cpp(32): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

错误在ON_COMMAND(IDM_ABOUT,OnAbout)
ON_WM_PAINT()
END_MESSAGE_MAP()

用//注释掉ON_COMMAND(IDM_ABOUT,OnAbout)
出现结果

注释掉
ON_COMMAND(IDM_ABOUT,OnAbout)
ON_WM_PAINT()
两行,那干脆就不出字了
把这三行连之上那行一起注释掉,就出新错误了

错误为:

resource.h:
//resource.h
#define IDM_ABOUT 100\n
多了个\n所以什么都不做直接调试会出错

用sizeof(szText)-1显示"Hello, MFC"是宽字符,有22个字符,而“Hello, MFC”本身只有10个字符,剩下的12个字符随机取一些东西,所以是乱码。。。改成wcslen(szText)就好

for(int i=1; i<50000; i++);  减缓下降速度不好用,要改成::Sleep(100);才好。。。

所以最后代码应该是:

resource.h:
//resource.h
#define IDM_ABOUT 100

hello.rc:
//hello.rc
#include "Resource.h"
#include "afxres.h"

JJHouRIcon             ICON DISCARDABLE "JJHOUR.ico"
AFX_IDI_STD_FRAME      ICON DISCARDABLE "JJHOUR.ico"

MainMenu MENU DISCARDABLE
{
POPUP "&Help"
{
MENUITEM "&About HelloMFC...", IDM_ABOUT
}
}

AboutBox DIALOG DISCARDABLE 34, 22, 147, 55
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About Hello"
{
ICON            "JJHouRIcon",IDC_STATIC,11,17,18,20
LTEXT           "Hello MFC 4.0",IDC_STATIC,40,10,52,8
LTEXT           "Copyright 1996 Top Studio",IDC_STATIC,40,25,100,8
LTEXT           "J.J.Hou",IDC_STATIC,40,40,100,8
DEFPUSHBUTTON   "OK",IDOK,105,7,32,14,WS_GROUP
}

stdafx.h:
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
#include <afxwin.h>         // MFC 核心组件和标准组件
#include <afxext.h>         // MFC 扩展
#include <afxdisp.h>

stdafx.cpp :
// stdafx.cpp : 只包括标准包含文件的源文件
// MFCApplication2.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息

#include "stdafx.h"

Hello.h:
class CMyWinAPP : public CWinApp
{
public:
BOOL InitInstance();
};

//----------------------------------------------------------------
class CMyFrameWnd : public CFrameWnd
{
public:
CMyFrameWnd();
afx_msg void OnPaint();
afx_msg void OnAbout();

private:
DECLARE_MESSAGE_MAP()
static VOID CALLBACK LineDDACallback(int,int,LPARAM);
};

Hello.cpp:
#include "stdafx.h"
#include "Hello.h"
#include "Resource.h"

CMyWinAPP theApp;  //application object

//----------------------------------------------------------------
// CMyWinAPP's member
//----------------------------------------------------------------
BOOL CMyWinAPP::InitInstance()
{
m_pMainWnd = new CMyFrameWnd();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
//----------------------------------------------------------------
// CMyFrameWnd'smember
//----------------------------------------------------------------
CMyFrameWnd::CMyFrameWnd()
{
Create(NULL, _T("Hello MFC"), WS_OVERLAPPEDWINDOW, rectDefault,
NULL, _T("MainMenu"));  //"MainMenu"定义于RC档
}
//----------------------------------------------------------------
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_COMMAND(IDM_ABOUT,OnAbout)
ON_WM_PAINT()
END_MESSAGE_MAP()
//----------------------------------------------------------------
void CMyFrameWnd::OnPaint()
{
CPaintDC dc(this);
CRect rect;

GetClientRect(rect);

dc.SetTextAlign(TA_BOTTOM | TA_CENTER);

::LineDDA(rect.right/2, 0, rect.right/2, rect.bottom/2,
(LINEDDAPROC) LineDDACallback, (LPARAM) (LPVOID) &dc);
}
//----------------------------------------------------------------
VOID CALLBACK CMyFrameWnd::LineDDACallback(int x, int y, LPARAM lpdc)
{
WCHAR szText[] =L"Hello, MFC";
    ((CDC*)lpdc)->TextOutW(x,y,szText,wcslen(szText));
    ::Sleep(100);

//for(int i=1; i<50000; i++);  //纯粹是为了延迟下降速度,以利观察
}
//----------------------------------------------------------------
void CMyFrameWnd::OnAbout()
{
CDialog about(_T("AboutBox"), this);  //"AboutBox"定义于RC档
about.DoModal();
}

这个程序我纠结了好久,总算是成功了。

侯捷《深入浅出MFC》中“Hello, MFC”如何改写到VS2012中相关推荐

  1. 借到侯捷译的《Java编程思想》 窃喜中...

    本来想借本C#方面的书,或许是现在C#比较火吧,翻遍图书馆,只看到寥寥数本,而且不大和我的心意,最后感谢上帝感谢安拉找到一本还算差不多的. 也许我rp比较好吧.没打算借Java来着,第一眼就看到了一本 ...

  2. C++ 面向对象笔记——侯捷老师(一)

    此笔记为侯捷老师的C++面向对象课程笔记,在开篇中,老师首先讲C++的类,并将类分为两种基本类型: 1.类的成员不带指针的类.以复数类为例,讲解类的基本知识. 类的基本构成:成员变量和成员函数.构造函 ...

  3. 你心目中最难忘的侯捷老师的文章有哪些???

    作者:武龙飞 链接:https://www.zhihu.com/question/30354267/answer/47765817 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  4. Visual C++ 2010中更换MFC对话框默认图标

    1.菜单栏的"文件"->新建->项目->选择左侧 "Visual C++" 下的 "MFC"项->在右边选择&quo ...

  5. 在共享DLL中使用MFC 和在静态库中使用MFC的区别

    win7:vc6: 使用VS2008,在项目属性中有一项MFC的使用,有三种设置:   1.使用标准Windows库  2.在共享DLL中使用MFC   3.在静态库中使用MFC  第一种顾名思义. ...

  6. 非MFC工程中使用MFC库

    需求说明 C++工程的类型有很多,从VS(或VC)可以看到常见的有:Win32 Console Application.MFC Application.Win32 Project等.在创建MFC工程时 ...

  7. mfc 创建线程函数AfxBeginThread,线程中访问mfc控件

    转字http://blog.csdn.net/guomsh/article/details/10377993 1. C++ 中如何定义线程函数 有两种方法:a. 定义线程函数为全局函数    b. 定 ...

  8. 深入浅出话VC++(2)——MFC的本质

    一.引言 上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序.MFC(Microsoft Foundation Clas ...

  9. console中应用MFC类的方法

    1.添加#include <afx.h>或者<afxwin.h> 这时会报错 1>c:\program files\microsoft visual studio 8\v ...

  10. MFC的使用——在共享DLL中使用MFC、在静态库中使用MFC

    前言 我们在使用Microsoft Visual Studio软件(也就是我们常常说的VS)时,其中项目属性中有一项叫做"MFC的使用",里面包含有不同的设置,会影响我们所编写的程 ...

最新文章

  1. Cell封面:王二涛组在丛枝菌根共生“自我调节”研究中取得重大进展(视频+漫画解读)...
  2. 一个页面多个swiper问题解决
  3. Linux内核中max()宏的奥妙何在?(一)
  4. Android开发 ShapeDrawable详解
  5. 网络安全:堡垒机相关知识介绍
  6. 可扩展多线程异步Socket服务器框架EMTASS 2.0 续
  7. Java 文件下载,文件名乱码问题解决。
  8. 实验第七节——用户chaincode相关操作
  9. iptv原版固件_永久免费看IPTV,有了这固件可看高清流畅稳定直播
  10. 程序员前景一片灰暗?网友:不行找个班上吧
  11. linux通过ip查询域名,无法通过ip地址查找对应的域名
  12. The Byzantine Generals Problem拜占庭将军问题理解
  13. 根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角
  14. Pyecharts亚马逊订单可视化
  15. MIST浏览器不能连接私有链
  16. 软件测试测试用例—用户注册界面
  17. win10运行安卓模拟器蓝屏崩溃
  18. 【netron】模型可视化工具netron
  19. 什么是Ordinal Classification?
  20. 桌面文件不见了怎么恢复?

热门文章

  1. 学习记录542@阿里云OCR身份证识别具体实现
  2. SpringBoot:使用Caffeine实现缓存
  3. Unity基础——碰撞体
  4. Unity基础知识结构总结
  5. UT(XCAP) 参数说明
  6. MCGS_嵌入版7.2软件的下载与安装
  7. PYTHON前端几个框架的比较
  8. 学习笔记-Map集合的遍历
  9. Diamond3.5软件的使用--(2)新建工程并生成可烧录文件
  10. 富士驱动器ALPHA5手动JOG运行操作