侯捷《深入浅出MFC》中“Hello, MFC”如何改写到VS2012中
侯捷先生《深入淺出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中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作65:导航栏使用
- 下一篇: 工作135:引用当前组件下面的方法是混入