侯捷《深入浅出MFC》中“Hello, MFC”如何改写到VS2012中
侯捷先生《深入淺出MFC》一書已經(jīng)成書十余年了,當(dāng)時(shí)用的還是VC6.0,而現(xiàn)在大多數(shù)人用的都是從VS2010到VS2015這些版本。今年剛畢業(yè)的我進(jìn)入公司學(xué)習(xí)使用MFC,就是用的VS2012.與侯捷先生《深入淺出MFC》書中的東西相比,有了不小的變化,現(xiàn)在我來說說自己這兩天改寫“Hello, MFC”代碼的心得。
首先我完全按書上的打代碼,一堆錯(cuò)誤,然后我一句一句在網(wǎng)上找,改正后,成了下面代碼:
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?:?標(biāo)準(zhǔn)系統(tǒng)包含文件的包含文件,
//?或是經(jīng)常使用但不常更改的
//?特定于項(xiàng)目的包含文件
#include?<afxwin.h>?????????//?MFC?核心組件和標(biāo)準(zhǔn)組件
#include?<afxext.h>?????????//?MFC?擴(kuò)展
#include?<afxdisp.h>?????
stdafx.cpp?:
//?stdafx.cpp?:?只包括標(biāo)準(zhǔn)包含文件的源文件
//?MFCApplication2.pch?將作為預(yù)編譯頭
//?stdafx.obj?將包含預(yù)編譯類型信息
#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();
}
調(diào)試結(jié)果如下:
1>------?已啟動(dòng)生成:?項(xiàng)目:?MFCApplication2,?配置:?Debug?Win32?------
1>??Hello.cpp
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27):?error?C2017:?非法的轉(zhuǎn)義序列
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27):?error?C2146:?語法錯(cuò)誤:?缺少“}”(在標(biāo)識(shí)符“n”的前面)
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27):?error?C2146:?語法錯(cuò)誤:?缺少“;”(在標(biāo)識(shí)符“n”的前面)
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27):?error?C2065:?“n”:?未聲明的標(biāo)識(shí)符
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27):?error?C3867:?“CMyFrameWnd::OnAbout”:?函數(shù)調(diào)用缺少參數(shù)列表;請(qǐng)使用“&CMyFrameWnd::OnAbout”創(chuàng)建指向成員的指針
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27):?error?C2143:?語法錯(cuò)誤?:?缺少“;”(在“}”的前面)
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(27):?error?C2059:?語法錯(cuò)誤:“,”
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(28):?error?C2143:?語法錯(cuò)誤?:?缺少“;”(在“{”的前面)
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(28):?error?C2447:?“{”:?缺少函數(shù)標(biāo)題(是否是老式的形式表?)
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(28):?error?C2059:?語法錯(cuò)誤:“,”
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29):?error?C2143:?語法錯(cuò)誤?:?缺少“;”(在“{”的前面)
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29):?error?C2447:?“{”:?缺少函數(shù)標(biāo)題(是否是老式的形式表?)
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29):?error?C2059:?語法錯(cuò)誤:“}”
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”:?未聲明的標(biāo)識(shí)符
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29):?error?C2065:?“_messageEntries”:?未聲明的標(biāo)識(shí)符
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(29):?error?C2059:?語法錯(cuò)誤:“return”
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(32):?error?C2143:?語法錯(cuò)誤?:?缺少“;”(在“{”的前面)
1>c:\users\john\documents\visual?studio?2012\projects\mfcapplication2\mfcapplication2\hello.cpp(32):?error?C2447:?“{”:?缺少函數(shù)標(biāo)題(是否是老式的形式表?)
==========?生成:?成功?0?個(gè),失敗?1?個(gè),最新?0?個(gè),跳過?0?個(gè)?==========
錯(cuò)誤在ON_COMMAND(IDM_ABOUT,OnAbout)
ON_WM_PAINT()
END_MESSAGE_MAP()
用//注釋掉ON_COMMAND(IDM_ABOUT,OnAbout)
出現(xiàn)結(jié)果
注釋掉
ON_COMMAND(IDM_ABOUT,OnAbout)
ON_WM_PAINT()
兩行,那干脆就不出字了
把這三行連之上那行一起注釋掉,就出新錯(cuò)誤了
錯(cuò)誤為:
resource.h:
//resource.h
#define?IDM_ABOUT?100\n
多了個(gè)\n所以什么都不做直接調(diào)試會(huì)出錯(cuò)
用sizeof(szText)-1顯示"Hello,?MFC"是寬字符,有22個(gè)字符,而“Hello,?MFC”本身只有10個(gè)字符,剩下的12個(gè)字符隨機(jī)取一些東西,所以是亂碼。。。改成wcslen(szText)就好
for(int?i=1;?i<50000;?i++);??減緩下降速度不好用,要改成::Sleep(100);才好。。。
所以最后代碼應(yīng)該是:
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?:?標(biāo)準(zhǔn)系統(tǒng)包含文件的包含文件,
//?或是經(jīng)常使用但不常更改的
//?特定于項(xiàng)目的包含文件
#include?<afxwin.h>?????????//?MFC?核心組件和標(biāo)準(zhǔn)組件
#include?<afxext.h>?????????//?MFC?擴(kuò)展
#include?<afxdisp.h>?????
stdafx.cpp?:
//?stdafx.cpp?:?只包括標(biāo)準(zhǔn)包含文件的源文件
//?MFCApplication2.pch?將作為預(yù)編譯頭
//?stdafx.obj?將包含預(yù)編譯類型信息
#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();
}
這個(gè)程序我糾結(jié)了好久,總算是成功了。
總結(jié)
以上是生活随笔為你收集整理的侯捷《深入浅出MFC》中“Hello, MFC”如何改写到VS2012中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作65:导航栏使用
- 下一篇: 工作135:引用当前组件下面的方法是混入