日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 侯捷《深入浅出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中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。