當前位置:首頁 » 操作系統 » mfc程序設計源碼

mfc程序設計源碼

發布時間: 2022-04-26 01:34:39

⑴ MFC程序它的全部源代碼在哪裡找

6.0的
D:\Program Files\Microsoft Visual Studio\VC98\MFC
2003的
D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc

可能安裝目錄不同,位置也不同,你可以進高度模式進去看源文件,
2003也可以在classView中看到

⑵ 求MFC畫圖程序源代碼

已發送,請查看,找了四個類似你要求的,有簡單又復雜,簡單的容易很快學會,復雜的暫時學不會可以以後再慢慢研究

⑶ 【急求】mfc 實現串口編程的源代碼

1.建立項目:打開VC++6.0,建立一個基於對話框的MFC應用程序SCommTest(與我源代碼一致,等會你會方便一點);
2.在項目中插入MSComm控制項 選擇Project菜單下Add To Project子菜單中的 Components and Controls…選項,在彈出的對話框中雙擊Registered ActiveX Controls項(稍等一會,這個過程較慢),則所有注冊過的ActiveX控制項出現在列表框中。 選擇Microsoft Communications Control, version 6.0,,單擊Insert按鈕將它插入到我們的Project中來,接受預設的選項。(如果你在控制項列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安裝VC6時沒有把ActiveX一項選上,重新安裝VC6,選上ActiveX就可以了),
這時在ClassView視窗中就可以看到CMSComm類了,(注意:此類在ClassWizard中看不到,重構clw文件也一樣),並且在控制項工具欄Controls中出現了電話圖標(如圖1所示),現在要做的是用滑鼠將此圖標拖到對話框中,程序運行後,這個圖標是看不到的。
3.利用ClassWizard定義CMSComm類控制對象 打開ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類,為IDC_MSCOMM1添加控制變數:m_ctrlComm,這時你可以看一看,在對話框頭文件中自動加入了//{{AFX_INCLUDES() #i nclude "mscomm.h" //}}AFX_INCLUDES (這時運行程序,如果有錯,那就再從頭開始)。
4.在對話框中添加控制項 向主對話框中添加兩個編輯框,一個用於接收顯示數據ID為IDC_EDIT_RXDATA,另一個用於輸入發送數據,ID為IDC_EDIT_TXDATA,再添加一個按鈕,功能是按一次就把發送編輯框中的內容發送一次,將其ID設為IDC_BUTTON_MANUALSEND。別忘記了將接收編輯框的Properties->Styles中把Miltiline和Vertical Scroll屬性選上,發送編輯框若你想輸入多行文字,也可選上Miltiline。
再打開ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類, 為IDC_EDIT_RXDATA添加CString變數m_strRXData, 為IDC_EDIT_TXDATA添加CString變數m_strTXData。說明: m_strRXData和m_strTXData分別用來放入接收和發送的字元數據。
5.添加串口事件消息處理函數OnComm() 打開ClassWizard->Message Maps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對話框中將函數名改為OnComm,(好記而已)OK。
這個函數是用來處理串口消息事件的,如每當串口接收到數據,就會產生一個串口接收數據緩沖區中有字元的消息事件,我們剛才添加的函數就會執行,我們在OnComm()函數加入相應的處理代碼就能實現自已想要的功能了。請你在函數中加入如下代碼:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設置BYTE數組 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值為2表示接收緩沖區內有字元
{ ////////以下你可以根據自己的通信協議加入處理代碼
variant_inp=m_ctrlComm.GetInput(); //讀緩沖區
safearray_inp=variant_inp; //VARIANT型變數轉換為ColeSafeArray型變數
len=safearray_inp.GetOneDimSize(); //得到有效數據長度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數組
for(k=0;k<len;k++) //將數組轉換為Cstring型變數
{
BYTE bt=*(char*)(rxdata+k); //字元型
strtemp.Format("%c",bt); //將字元送入臨時變數strtemp存放
m_strRXData+=strtemp; //加入接收編輯框對應字元串
}
}
UpdateData(FALSE); //更新編輯框內容
}

到目前為止還不能在接收編輯框中看到數據,因為我們還沒有打開串口,但運行程序不應該有任何錯誤,不然,你肯定哪兒沒看仔細,因為我是打開VC6對照著做一步寫一行的,運行試試。沒錯吧?那麼做下一步:
6.打開串口和設置串口參數 你可以在你需要的時候打開串口,例如在程序中做一個開始按鈕,在該按鈕的處理函數中打開串口。現在我們在主對話框的CSCommTestDlg::OnInitDialog()打開串口,加入如下代碼:
// TODO: Add extra initialization here
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1); //選擇com1
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打開串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,無校驗,8個數據位,1個停止位
m_ctrlComm.SetInputMode(1); //1:表示以二進制方式檢取數據
m_ctrlComm.SetRThreshold(1);
//參數1表示每當串口接收緩沖區中有多於或等於1個字元時將引發一個接收數據的OnComm事件
m_ctrlComm.SetInputLen(0); //設置當前接收區數據長度為0
m_ctrlComm.GetInput();//先預讀緩沖區以清除殘留數據

現在你可以試試程序了,將串口線接好後,打開串口調試助手,並將串口設在com2,選上自動發送,也可以等會手動發送。再執行你編寫的程序,接收框里應該有數據顯示了。
7.發送數據 先為發送按鈕添加一個單擊消息即BN_CLICKED處理函數,打開ClassWizard->Message Maps,選擇類CSCommTestDlg,選擇IDC_BUTTON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend()函數,並在函數中添加如下代碼:
void CSCommTestDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //讀取編輯框內容
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//發送數據
}
運行程序,在發送編輯框中隨意輸入點什麼,單擊發送按鈕,我們通過把RS232的2.3兩口短接,在一台電腦上顯示串口的收發數據!
最後說明一下,由於用到VC控制項,在沒有安裝VC的計算機上運行時要從VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目錄下的System子目錄中(win2000為System32)並再進行注冊設置

⑷ 求《MFC WINDOWS程序設計(第二版)》配套的源碼的下載地址,謝謝~!

MFC Windows程序設計(第二版) 全書源碼
附件:
MFC Windows程序設計(第二版).rar(977K, 下載次數:259)

代碼名稱: MFC Windows程序設計(第二版)
分類信息: 書籍源碼
運行環境: Windows
開發語言: VC++6.0
解壓密碼:
轉載地址:
代碼作者:

http://www.pudn.com/dl.asp?id=154355

⑸ 求用MFC製作七巧板的程序源碼

// My.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "My.h"

#include "MainFrm.h"
#include "MyDoc.h"
#include "MyView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyApp

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyApp construction

CMyApp::CMyApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CMyApp object

CMyApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CMyApp initialization

BOOL CMyApp::InitInstance()
{
AfxEnableControlContainer();

// Standard initialization
// If you are not using these features and wish to rece the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.

#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif

// Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));

LoadStdProfileSettings(); // Load standard INI file options (including MRU)

// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.

CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);

// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;

// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd->UpdateWindow();

return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

// App command to run the dialog
void CMyApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}

/////////////////////////////////////////////////////////////////////////////
// CMyApp message handlers

⑹ MFC資料庫編程源代碼

10.sql Server7.0/2000資料庫
/*
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
*/
CoInitialize(NULL); // 初始化OLE/COM庫環境 ,為訪問ADO介面做准備
_RecordsetPtr m_pRecordset("ADODB.Recordset");
_ConnectionPtr m_pConnection("ADODB.Connection");
_bstr_t bstrSQL("select * from stu_info"); //查詢語句
char * query_cmd = "DELETE FROM stu_info WHERE sname = 』本拉登』";
try
{
// 創建Connection對象
m_pConnection.CreateInstance("ADODB.Connection");
// 設置連接字元串,必須是BSTR型或者_bstr_t類型
_bstr_t strConnect= "Provider=SQLOLEDB;Server=(local);Database=db2; uid=; pwd=;";
//若資料庫在網路上則Server為形如(192.168.1.5,3340)
//用戶sa和密碼123隻是針對我的庫
m_pConnection->Open(strConnect,"","",adModeUnknown);
if(m_pConnection==NULL)
cerr<<"Lind data ERROR!\n";
// 創建記錄集對象
m_pRecordset.CreateInstance(_uuidof(Recordset));
// 取得表中的記錄
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
_variant_t vsnum,vsname,vsage,vssex,vsmajor; //對應庫中的snum,sname,sage,ssex,smajor
cout << "學號 姓名 年齡 姓別 專業";
cout << "\n----------------------------------------------------------------\n";
while (!m_pRecordset->EndOfFile)
{
vsnum = m_pRecordset->GetCollect(_variant_t((long)0));//這兒給欄位編號和欄位名都可以
vsname = m_pRecordset->GetCollect("sname");
vsage = m_pRecordset->GetCollect("sage");
vssex = m_pRecordset->GetCollect("ssex");
vsmajor = m_pRecordset->GetCollect("smajor");
if (vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsage.vt != VT_NULL
&& vssex.vt != VT_NULL && vsmajor.vt != VT_NULL)
{
cout.setf(ios::left);
cout << setw(14) << (char*)(_bstr_t)vsnum;
cout << setw(14) << (char*)(_bstr_t)vsname;
cout << setw(8) << vsage.lVal;
cout << setw(8) << (char*)(_bstr_t)vssex;
cout <<setw(20) << (char*)(_bstr_t)vsmajor;
cout.unsetf(ios::left);
cout << endl;
}
m_pRecordset->MoveNext(); ///移到下一條記錄
}
cout << "\n----------------------------------------------------------------\n";
cout << "\n請輸入你要添加的學生信息\n";
cout << "學號:";
cin >> student.snum;
cout << "\n姓名:";
cin >> student.sname;
cout << "\n年齡:";
cin >> student.sage;
cout << "\n姓別:";
cin >> student.ssex;
cout << "\n專業:";
cin >> student.smajor;
m_pRecordset->MoveFirst(); //移動到第一條記錄
m_pRecordset->AddNew(); ///添加新記錄
m_pRecordset->PutCollect("snum",_variant_t(student.snum));
m_pRecordset->PutCollect("sname",_variant_t(student.sname));
m_pRecordset->PutCollect("sage",_variant_t(student.sage));
m_pRecordset->PutCollect("ssex",_variant_t(student.ssex));
m_pRecordset->PutCollect("smajor",_variant_t(student.smajor));
m_pRecordset->Update();
m_pConnection->Execute(query_cmd,NULL,1); //用Execute執行sql語句來刪除
m_pRecordset->Close(); // 關閉記錄集
}
// 捕捉異常
catch(_com_error e)
{
// 顯示錯誤信息
cerr << "\nERROR:" << (char*)e.Description();//拋出異常
}
if(m_pConnection->State)
m_pConnection->Close();
::CoUninitialize();

20.資料庫存入二進制欄位數據
/*
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
*/
CoInitialize(NULL);
_RecordsetPtr pRs=NULL;
_StreamPtr pStream=NULL;
pRs.CreateInstance(_uuidof(Recordset));
pStream.CreateInstance(__unidof(Stream));
_bstr_t ConnectString(("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%%1;Persist Security Info=False"); //C:\\mydb.mdb
pRs->Open(_bstr_t("Blob"),ConnectString,adOpenKeyset,adLockOptimistic,adCmdTable);
_variant vtSource;
vtSource.vt=VT_ERROR;
_bstr_t bstrUser(L"");
_bstr_t bstrPass(L"");
pStream->Type=adTypeBinary;
pStream->Open(vtSource,adModeUnknown,adOpenStreamUnspecified,bstrUser,bstrPass);
pStream->LoadFromFile(_bstr_t(%%3)); //"C:\\mypic.bmp"
pRs->AddNew();
pRs->Fields->GetItem(_variant_t(%%2))->put_Value(_variant_t(pStream->Read(adReadAll))); //"Image"
pRs->();
pStream->Close();
pRs->Close();
CoUninitialize();

21.資料庫取出二進制欄位數據
/*
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
*/
CoInitialize(NULL);
_RecordsetPtr pRs=NULL;
_StreamPtr pStream=NULL;
pRs.CreateInstance(_uuidof(Recordset));
pStream.CreateInstance(__unidof(Stream));
_bstr_t ConnectString(("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%%1;Persist Security Info=False");//C:\\mydb.mdb
pRs->Open(_bstr_t("Blob"),ConnectString,adOpenKeyset,adLockOptimistic,adCmdTable);
pStream->Write(_variant_t(pRs->Fields->GetItem(_variant_t(%%2))->GetValue())); //"Image"
pStream->SaveToFile(_bstr_t(%%3),adSaveCreateOverWrite); //"C:\\mypic.bmp"
pStream->Close();
pRs->Close();
CoUninitialize();

⑺ mfc 源代碼如何生成可執行程序

如果你電腦上裝有VC的話直接雙擊那個dsw擴展名的文件,打開後點VC的運行按鈕就可以生成了

⑻ 編好的C++代碼與MFC到底是什麼關系,我怎麼實現

以前編寫windows應用程序用的是c語言,通過c語言調用Windows API 實現編寫windows應用程序,後來微軟把C++引入windows編程,也就是現在的VC++;C++的特點就是以面向對象的方式實現代碼重用,不同的類實現特定的功能;windows應用程序最大的界面特點就是窗口,因此定義了類CWnd; 該類實現了所有窗口的基本功能和特點;然後根據各種窗口的特有特性,比如對話框,編輯框等窗口而從CWnd又派生了對話框類,編輯框控制項類等;當然窗口僅僅是windows應用程序的一部分,除了與窗口有關的類以外,還有其他實的現其他功能的類,而所有的由微軟用C++預定義的這些類就組成了所謂的MFC(微軟基礎類庫);有了這些基礎類庫,我們就可以從這些基礎類庫中派生出我們需要的類從而實現我們需要的功能;如果你有C++基礎;你就應該知道如何從一個類中派生一個類的方法和這樣做的意義。但是知道如何從一個基礎類中派生一個子類是不夠的,編寫一個windows應用程序,需要多個類在一起配合工作,但是這些類又如何被組織在一起的呢,由於這個工作比較復雜,所以才有VC++的應用程序編程向導,在向導的幫助下,可以產生一個windows應用程序基本框架,我們可以根據需要在這個程序框架上添加我們需要的功能。對話框應用程序向導為用戶產生一個對話框應用程序框架,這些框架是固定模式的,只有不斷的去研究才能掌握。
至於輸入'Y'或者'N'的判斷,C編程和MFC VC編程在思想上是一樣,只是在實現機制上不同而已,以前的C編程需要用戶通過鍵盤輸入'Y'或者'N'的判斷,在MFC VC編程下,都是圖像界面,用戶只需要用滑鼠進行操作即可。以前的C編程在用戶通過鍵盤輸入'Y'或者'N'判斷之後去執行相應的功能,而在Windows圖像界面下,用戶在界面上點擊一個按鈕會產生事件,相應的事件有相應的事件處理函數,點擊yes按鈕時,與之對應的事件函數被調用,點擊''NO''按鈕時,與之對應的事件函數也被調用,編程時候,用戶只需在相應的處理函數里做相應的處理即可,因為這種事件與函數的對應關系,因此編程時就沒有必要去判斷用戶點擊的是''yes''還是''NO''按鈕。

⑼ 用mfc設計貪吃蛇游戲源代碼,最好有解析

1.演算法
1. 首先,用一個結構體數組來標記蛇的X位置和Y位置,還有每一節的方向。用一變數標識蛇的長度。

2. 在蛇非轉彎的移動時用定時器來自動移動,不管蛇是哪種形狀,都只需在每次移動時先將各節向後移動(蛇尾舍棄,新的蛇尾由蛇尾的上一節代替):如蛇本身為snake[0]到snake[3],就是將snake[0]到snake[2]一起移動到snake[1]到snake[3]: 將 snake[2]的XY坐標賦值snake[3]的XY坐標 ,snake[1]的XY坐標 賦值給snake[2]的XY坐標 ,snake[0]的XY坐標 賦值給snake[1]的XY坐標 。再判斷蛇頭的方向,然後將蛇頭順著這個方向向前移動一格就是蛇頭snake[0]的XY坐標 。而蛇除蛇頭外各節的方向由函數SetDirection()來確定(明顯此種情況,蛇頭的方向不變),SetDirection()的思想是根據蛇的每一節的前一節的相對位置來確定本節的方向。(其實這個函數是多餘的,真正用到的只有蛇頭的方向)。

3. 蛇在轉彎時,也是各節一次向後移,蛇頭的位置順著轉彎的方向移動,方向由轉彎方向確定。

4. 蛇在吃到食物時,長度加一,蛇頭的位置變成食物的位置,方向不變。蛇的本身每節的XY位置都向後移。如蛇本身為snake[0]到snake[3], 就是將snake[0]到snake[3]一起移動到snake[1]到snake[4]。

5. 基於對話框的應用程序,響應按鍵消息需在PreTranslateMessage里,而不是像文檔視圖模式那樣在OnKeyDown里響應。

6. 每次蛇在轉彎時只能有一種方向按鍵能響應,即要麼左右轉,要麼上下轉。蛇頭方向向左或向右時,只能上下轉;蛇頭方向向上或向下時,只能左右轉。

7. 食物的位置由rand函數隨機產生。

2.添加如下函數和變數

1 void HuaFangGe(int bianChang, int gridShumu); //如在400*400的方格里繪制20*20個格子,則bianChang = 400;gridShumu = 20;
2 void InitSnackSite(); //初始化蛇的位置
3
4 int snakeLength; //表示蛇的長度
5 int foodX; //食物的X位置
6 int foodY; //食物的Y位置
7 bool start; //標志是否開始
8 bool reStart; //標志是否重新開始
9
10 struct SNAKE
11 {
12 int x;
13 int y;
14 char direction; //某位置的方向為前一個位置相對於該位置的方向,由SetDirection()確定
15 }snake[200];
16
17 void DrawRed(int x, int y); //指定點0*0到20*20,畫相應顏色,下同(紅頭綠身藍尾)
18 void DrawGreen(int x, int y);
19 void DrawBlue(int x, int y);
20 void DrawBlack(int x, int y); //根據SetFoodXY()所確定的foodX和foodY來畫食物。
21
22 void DrawSnakeFood(); //根據數組snakeSite數組的標識信息類繪制蛇的形狀位置顏色。
23 void SetFoodXY(); //隨機繪制食物的XY位置
24
25 bool leftRight; //確定是否能上下走(蛇本身在上下走,再按上下就無用了)
26 bool upDown; //確定是否能左右走(蛇本身在左右走,再按左右就無用了)
27
28 void MoveSite(); //蛇移動過程中,設置「除蛇頭」外各節的x和y的位置,順序前移。
29 void SetDirection(); //蛇移動過程中,設置「除蛇頭」外各節的方向
30
31 void TurnLeft(); //當蛇左轉時
32 void TurnRight(); //當蛇右轉時
33 void GoUp(); //當蛇向上時
34 void GoDown(); //當蛇向下時

可以參考這里:http://www.cnblogs.com/jncpp/archive/2012/07/24/2606908.html
【原創】基於MFC的 貪吃蛇 小游戲的實現,附源碼下載

⑽ MFC源代碼是如何鏈接到程序中的

1. 預處理
預處理相當於根據預處理指令組裝新的C/C++程序。經過預處理,會產生一個沒有宏定義,沒有條件編譯指令,沒有特殊符號的輸出文件,這個文件的含義同原本的文件無異,只是內容上有所不同。
讀取C/C++源程序,對其中的偽指令(以#開頭的指令)進行處理
①將所有的「#define」刪除,並且展開所有的宏定義
②處理所有的條件編譯指令,如:「#if」、「#ifdef」、「#elif」、「#else」、「endif」等。這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉。
③處理「#include」預編譯指令,將被包含的文件插入到該預編譯指令的位置。
(注意:這個過程可能是遞歸進行的,也就是說被包含的文件可能還包含其他文件)
刪除所有的注釋
添加行號和文件名標識。
以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生的編譯錯誤或警告時能夠顯示行號
保留所有的#pragma編譯器指令
2. 編譯
將預處理完的文件進行一系列詞法分析、語法分析、語義分析及優化後,產生相應的匯編代碼文件。
3. 匯編
將編譯完的匯編代碼文件翻譯成機器指令,並生成可重定位目標程序的.o文件,該文件為二進制文件,位元組編碼是機器指令。
匯編器是將匯編代碼轉變成機器可以執行的指令,每一個匯編語句幾乎都對應一條機器指令。所以匯編器的匯編過程相對於編譯器來講比較簡單,它沒有復雜的語法,也沒有語義,也不需要做指令優化,只是根據匯編指令和機器指令的對照表一一翻譯即可。
4. 鏈接
通過鏈接器將一個個目標文件(或許還會有庫文件)鏈接在一起生成一個完整的可執行程序。
由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變數或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。
鏈接程序的主要工作就是將有關的目標文件彼此相連接,也就是將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠被操作系統裝入執行的統一整體。
至此,大致經過這幾個步驟,一個完整的可執行程序產生了。

熱點內容
什麼配置的車最保平安 發布:2024-10-03 17:05:40 瀏覽:854
成人用品數據包上傳 發布:2024-10-03 17:05:30 瀏覽:838
sql資料庫習題 發布:2024-10-03 17:05:29 瀏覽:577
安卓音游哪個好玩 發布:2024-10-03 17:04:14 瀏覽:43
有伺服器的內網如何組建 發布:2024-10-03 16:57:42 瀏覽:358
phplinux安裝目錄 發布:2024-10-03 16:48:57 瀏覽:638
etf怎麼配置資產 發布:2024-10-03 16:42:07 瀏覽:440
紅米忘記鎖屏密碼怎麼辦 發布:2024-10-03 16:41:59 瀏覽:26
chm文件如何編譯 發布:2024-10-03 16:30:22 瀏覽:89
分期到期解壓 發布:2024-10-03 16:27:10 瀏覽:734