語言源程序自動評判設(shè)計_第1頁
語言源程序自動評判設(shè)計_第2頁
語言源程序自動評判設(shè)計_第3頁
語言源程序自動評判設(shè)計_第4頁
語言源程序自動評判設(shè)計_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1章引研究背景簡介C語言是目前國際上廣泛流行的、重要的計算機高級語言之一。它適合作為系統(tǒng)描述語言,即可用來編寫系統(tǒng),也可用來編寫應(yīng)用。對于學(xué)習(xí)C語言將為今后學(xué)習(xí)其他編程語言打下良好的基礎(chǔ),而隨著計算機應(yīng)用的普及,的其他非計算機專業(yè)也會需要學(xué)習(xí)編寫簡單的程序,C語言也是一個很不錯的選擇。C語言,首先是要學(xué)習(xí)理論知識,閱讀編程思想,閱讀源代碼,其次老師一般采用逐一檢查并試運行工檢查方式,然后給出相應(yīng)的得分。由于C語言源程序的自動評判系統(tǒng),幫助老師檢查學(xué)生的編程作業(yè),提C語言簡C語言是國際上廣泛流行的、很有發(fā)展前途的計算機高級語言。它適合作為系統(tǒng)描述語言,即可用來編寫系統(tǒng),也可用來編寫應(yīng)用。早期的操作系統(tǒng)等系統(tǒng)主要是用匯編語言編寫的(包括X操作系統(tǒng)在內(nèi)(匯編語言可以直接對硬件進(jìn)行操作C了。1960ALGOL60是一種面向問題的高級語言,它離硬件比較遠(yuǎn),不宜用來編寫系統(tǒng)程序。1963年英國的大學(xué)推出了CPL語言。1967年英國劍MatinRichardsCPLBCPL語言。1970年美國貝爾的KenThompson以BCPL語言為基礎(chǔ),又作了進(jìn)一步簡化,設(shè)計出了很簡單的而且很接近硬件的B語言,并用BUNIX操作操作系統(tǒng)。但B語言過于簡單,功能有限。1972年至1973,貝爾D.M.RitchieBC語言(BCPL的第二個字母。最初的C語言只是為描述UNIX操作系統(tǒng)提供一種工作語言而設(shè)計的。后來C語言多次作了改進(jìn)但主要還是在貝爾 直到1-975到其它機器時所做的工作大大簡化了,這也推動了UNIX操作系統(tǒng)迅速地在各種機器上實現(xiàn)。隨著UNIX的日益廣泛使用,C語言也迅速得到推廣。C語言和UNIX可以說是一對孿生兄弟,在發(fā)展過程中相輔相成。1978年以后,C語言已先后移植到大、中、小、微型機上,已獨立于UNIX和PDP了。現(xiàn)在C語C語言主要有以下一些特點:(1)語言表達(dá)能力強。(2)語言簡潔、緊湊,使語言生成的代碼質(zhì)量高。(5)語法限制不嚴(yán)格,程序設(shè)計度大。(6)可移植2要設(shè)C源程序的自動評判系統(tǒng)。首先需要解決的問題開發(fā)環(huán)VisualC++集成開發(fā)環(huán)境來開發(fā)整個程序。VisualC++Windows環(huán)境下最強大、最流行的工作方分析整個系統(tǒng),最主要的功能是:編譯源程序,運行目標(biāo)程序,目標(biāo)VisualC++開發(fā)環(huán)境來看,有批處理方式、普通VisualC++Add-in方式???,Add-inVisualC++環(huán)境,并且執(zhí)行特定的任務(wù),VisualC++VisualC++add-in文件(*.dll系統(tǒng)目本系統(tǒng)最終目的是為了減輕老師負(fù)擔(dān),利用計算機自動評判編程作業(yè),替代手工檢查方式。要求學(xué)生將編寫好的作業(yè)交至指定文件夾,然后老師運行本系統(tǒng),編譯,運行生成目標(biāo)程序,通過比較程序輸出與標(biāo)準(zhǔn)答案,可以得到每個源程序的評判結(jié)果??刂芕isualC++編譯器編譯源程序存放C源程序的文件夾的組織方式和文件夾中C源程序名方式C用程序控制VisualC++編譯器去編譯C源程序如何處理編譯時出錯,沒有生成目標(biāo)程序的C源程序基本流基本上本系統(tǒng)是一個順序執(zhí)行的過程,系統(tǒng)的實現(xiàn)也是一步一步來的。下一個模塊需要用到上一個模塊的數(shù)據(jù)。系統(tǒng)流程圖如圖11所示。C系統(tǒng)控制VisualC++的編譯器去編譯提取出的C源程序,得到系統(tǒng)以正確輸入數(shù)據(jù)運行生成的目標(biāo)程序(exe)1-1具體實作業(yè)(只交后綴名為*.c的文件)交至對應(yīng)的唯一文件夾下。每個文件夾中C源程序名方式:以學(xué)號命名,后綴名為*.c,這樣每個文件夾中的C源程序是唯一的,在評判時能更直觀的得到結(jié)果。C編譯方面,VisualC++不能直接編譯后綴名為*.c的C源程序,放至空白工程中,便可以解決不能直接編譯的問題。通過Add-in接口,控VisualC++C源程序的空白工程文件,然后便可進(jìn)行編譯。在這里要設(shè)置循環(huán),對列表框中的每一個C源程序都進(jìn)行編譯。循環(huán)過程中,編譯后生成目標(biāo)程序的C源程序,從空白工程文件的Debug文件夾中其目標(biāo)程序到暫存的文件夾,并用其學(xué)號來命名生成的目標(biāo)程序。然后循環(huán)繼續(xù)直到所有C源程序都完成編譯。對于編譯后沒有生成目標(biāo)程序的C源程序,視為編譯錯誤,最后的評判結(jié)果:沒有生成目標(biāo)程序,判為編譯出錯-50分;生成了目標(biāo)程確答案相同,判為程序正確-100分。3細(xì)設(shè)根據(jù)系統(tǒng)所應(yīng)該完成的功能,以及考慮到使用的方便性,將系統(tǒng)劃分為三個模塊,其中包括兩個基本框和一個函數(shù)。添加文件在系統(tǒng)運行選擇C源程序文之前,需要對相關(guān)文件夾和文件進(jìn)行處理,VisualC++中是不能直接刪除非DeleteFile()用庫函數(shù)RemoveDirectory()來刪除已空文件夾。添加文件:初始化之后,從相應(yīng)的存放相同題目的文件夾中提取所有C源程序文件(過濾器設(shè)置為只能選取后綴名為*.c的文件),將所有的文件添加至框的一個列表控件中,列表控件的每一行項目為C源程序文件的絕對路徑。完成添加C源程序后,取得項目總數(shù)的信息存入表,并且以項目總數(shù)設(shè)置循環(huán),將每個C源程序文件的絕對路徑信息存入表,然后調(diào)用編譯函數(shù)。此功能通過框的一個“添加文件”按鈕和一個列表控件完成。在添加文件時選擇用列表控件的方式,這樣在之后設(shè)置循環(huán)對每個C源程序文件進(jìn)行操作時比較方便。同時每個項目中取的是C源程序文件的絕對路徑(包括文件名),因為之后的好多操作需要文件的路徑,取得學(xué)號信息時也比較方便。因為在Add-in方式下,框類和Add-in類之間的數(shù)據(jù)傳遞比較特殊,所以采用將列表控件中的相關(guān)信息存至表的方式,以便今后在編譯時調(diào)用。確認(rèn):新建框時,默認(rèn)的代碼,無實際功能。通過點擊此按鈕,得此框的數(shù)據(jù)輸入是:文件夾中選取的所有后綴名為(*.c)的C源程序編譯函編譯:從表提取出添加文件框中列表控件的項目總數(shù),以此不用的文件和文件夾,然后通過從表提取出添加文件框列表控件的項C源程序文件的絕對路徑,將后綴名為*.cC源程序文件改名為與建C。編譯完成之后如果在空白工程文件的Debug文件夾中找到生成的目序改名為學(xué)號.exe)并且將改名后的目標(biāo)程序到暫存所有生成的目標(biāo)程序的件夾中沒有找到生成的目標(biāo)程序,則視為編譯錯誤,直接在結(jié)果文件夾中編譯已完成的信息提示框。首先編譯時取用的數(shù)據(jù)是剛才添加文件框中列表控件中添加入注testDebug0.cpp文件,清空、e文件夾,這些問題同添加文件因為是將C源程序文件加入空白工cpp文件已經(jīng)命名為0.cpp,所以C源程序文件在編譯前都需要改名為0.cpp文件。之后通過Add-in,VisualC++的開發(fā)環(huán)境,首先打開工作空間,然后載入工程,之后編譯,當(dāng)然這些都是VisualC++自動完成的,相當(dāng)于按下了Build按鈕,這也就是使用Add-in方式的關(guān)鍵所在。編譯結(jié)束后,如果在Debug文件夾中生成0.exe文件,則視為編譯成功,且此時需要將C源此函數(shù)的數(shù)據(jù)輸出是:編譯成功后以學(xué)號命名的存至相同文件夾下的運行/評判輸入數(shù)據(jù)、運行正確程序:彈出此框后,進(jìn)入運行目標(biāo)程序,評判階段,首先運行此題目正確程序編譯后生成的exe程序,如果需要輸入數(shù)exe文件路徑,通過另一個編輯框來實現(xiàn)數(shù)據(jù)輸入,通過第三個編輯框來得到運行正確exe文件后得到的數(shù)據(jù)輸出,即標(biāo)準(zhǔn)答案。在編譯結(jié)束后,進(jìn)入運行/評判階段,首先需要運行正確的程序,這是老師之前通過編譯正確題目程序得到的正確的exe程序。如果程序需要輸exe文件后,得到正確輸出,即標(biāo)準(zhǔn)答案。選取暫存文件夾中所有C源程序文件編譯正確后程序test文件夾下的result文件所以在打開文件時直接定位到此程序所目總數(shù)即目標(biāo)程序總數(shù)設(shè)置循環(huán)。在每次循環(huán)中,以運行正確程序的exe文件數(shù)據(jù)比較,這兩個數(shù)據(jù)都是CString類型的。如果比較結(jié)果相同,則視為運行正確,C源程序。直到處理完所有的目標(biāo)程序,至此運行、評判結(jié)束。此功能此框的數(shù)據(jù)輸入是:題目正確源程序生成的exe文件,正確的測試數(shù)據(jù)輸入,所有C源程序文件編譯正確后生成的目標(biāo)程序。此框的數(shù)據(jù)輸出是:以輸入的正確測試數(shù)據(jù)運行正確程序后的正確數(shù)系統(tǒng)模塊具體實現(xiàn)在這一節(jié)中,將會對各個模塊中系統(tǒng)那個實現(xiàn)的難點、遇到的問題、解決的方法、重點技術(shù)問題的給出詳細(xì)的說明。準(zhǔn)備工VisualC++Win32空白工程,這里工程名為test,然后在此空白工程中新建一個C++文件,文件名為0.cpp。以后編譯選取的C源程序文件時則將C源程序文件改名為0.cpp并替換空白工程Win32ReleaseWin32Debugtest中,新建一個文件夾e用于存放最后的評判信息,新建一個空白文本文件file.txt。Debug文件夾、0.cpp文件,清空result和e文件夾。接著開始系統(tǒng)的具體功能實現(xiàn)階段。首先VisualC++中新建一個DevStudio添加一個函數(shù)mandMethod()。這個函數(shù)是系統(tǒng)的切入點。這時編譯鏈接工程之后,生成DLL文件,加載此文件后,會添加一個按鈕,此按鈕實現(xiàn)的是mandMethod()的函數(shù)功能。系統(tǒng)的使用從點擊這個按鈕開始。實現(xiàn)添加文件DevStudioAdd-inWizardAutoClassesresult和eVisualC++DeleteFile()刪除在此遇見的問題是在VisualC++中不能直接刪除一個不為空的文件夾ClearFolder,分別用于刪除文件夾(不管其是否為空)和清空文件夾(清空其中DeleteFolder{

{ {}{{ }}} }ClearFolder{

{ {}{{ }}} }完整的“初始化”按鈕代{CStringStrDestFile="D:\\test\\0.cpp";CStringDirectoryDebugName="D:\\test\\Debug";CStringDirectoryResultName="D:\\test\\result"; e");//清 e文件GetDlgItem(IDC_addfile_BUTTON)->EnableWindow(true設(shè)置添加文GetDlgItem(IDOK)- }->報告,然后在AddFile類的Message中選擇WM_INITDIALOGC文件對于選擇多個文件添加至列表控件中,需要設(shè)置指針,通過GetNextPathName()C源程序文件的絕對路徑添加入 { m_list.InsertItem(0,"",0);m_list.SetItem(0,0,LVIF_TEXT,FileName,0,0,0,}將選取的所有C源程序文件的絕對路徑存入列表控件后,通過路徑寫入表,以備編譯時使用,其代碼如下:for(inti=0;i<m_list.GetItemCount();i++){charszRegKey[50];m_list.GetItemText(i,0));}{C文件{ { m_list.InsertItem(0,"",0);m_list.SetItem(0,0,LVIF_TEXT,FileName,0,0,0,}for(inti=0;i<m_list.GetItemCount();{charszRegKey[50];m_list.GetItemText(i,0));}}}3“OK”按鈕:此按鈕的代碼是新建框時的默認(rèn)代碼,無實際功能,其按下的意義在于,取得按下“OK”的消息,調(diào)用編譯函數(shù)。此消息的實現(xiàn)是在系統(tǒng)切入點mandMethod()函數(shù)出,點擊按鈕后彈出添加文件框,進(jìn)行完選取C源程序文件的操作后,點擊“OK”按鈕,mandMethod()函數(shù)得到按下“OK”按鈕的消息,然后調(diào)用編譯函數(shù),進(jìn)入下一步工作,這里mandMethod()函數(shù)相關(guān)代碼如下:AddFileAddFileDlg;//彈出添加文件if(AddFileDlg.DoModal()==IDOK)//若按下添加文件框的“OK”按{}實現(xiàn)編譯函編譯器去編譯工程。建立此函數(shù)的過程是:右擊CCommands類下的 mandMethod()函數(shù)中調(diào)用build()函數(shù)。初始化工作,在每次編譯C源程序文件前需要刪除Debug文件夾和前的C源程序文件的,其代碼如下:DeleteFile("D:\\test\\0.cpp");//刪除0.cpp文DeleteFolder("D:\\test\\Debug");//刪除DebugCC源程序文件存至列表控件中的也就是“學(xué)號.c”所以需要提取出文件名中的學(xué)號(即文件標(biāo)題),學(xué)號是唯一區(qū)CStringCStringCStringStrFile=AfxGetApp()->GetProfileString("Configure",RegKey,獲 取得表中存入的添加文件框中列表控件的項目總數(shù)和每個項目C源程序文件的絕對路徑,并以項目總數(shù)設(shè)置循環(huán)。每次循環(huán)中首先進(jìn)行初始化操作然后將C源程序文件改名為o.cpp文件并到空白工程testtest工程文件(test.dsw),最后編intfor(intnWorkspaceNumber=nNumWorkspaces;longcharCStringStrDestFile="D:\\test\\0.cpp";CopyFile(StrFile,StrDestFile,false);//拷貝并改名C文件至空白工程CComPtr<IDispatch>pDisp CComVariantOleVariant; s, s> OleVariant,CComPtr<IDispatch>for(longi=1;i<lCount+1;{longlNumConfigs;CComPtr<IGenericProject>pGenProject;CComPtr<IConfigurations>pConfigs;for(longj=1;j<lNumConfigs+1;j++){CComVariantVarj=j;CComPtr<IConfiguration>pConfig;VERIFY_OK(pConfigs->Item(Varj,CComBSTRbszStr;VERIFY_OK(pConfig-VERIFY_OK(m_pApplication-}}(3)在循環(huán)中遇到的問題是每次打開一個工作空間并對工程進(jìn)行編譯后沒有關(guān)閉文檔,從而使每次開始新循環(huán)后無法實現(xiàn)刪除Debugo.cpp文件,造成目標(biāo)程序是對應(yīng)第一個C源程序文件的,解決的辦法是在編譯DsSaveStatusd;VERIFY_OK(ps-每次循環(huán)中,編譯結(jié)束后,關(guān)閉工作空間,在空白工程test文件夾將此test.exe文件到暫存目標(biāo)程序的result文件夾,并改名為以學(xué)號命名的而如果編譯結(jié)束后,在Debug文件夾中沒有找到生成的目標(biāo)程序test.exe文件,則視為編譯錯誤,空白的文本文件file.txt并改名為以此C源程CFileFindfind;CFileFindfindexe;{{}}}{CStringCString }編譯完所有的C源程序文件,在result文件夾中所有編譯成功后得到的以學(xué)號命名的目標(biāo)程序,在e文件夾中所有編譯提示編譯已經(jīng)結(jié)束,點擊確認(rèn)進(jìn)入運行/評判框。代碼如下:{runRunDlg;//這里run是建立的運行/評判框的類}實現(xiàn)運行/評判調(diào)用編譯函數(shù),對所有的C源程序文件進(jìn)行編譯,處理生成的目標(biāo)文件,并且先一步給出編譯不正確的C源程序文件的評判結(jié)果后,彈出運行/評判框。這就首先需要在工作空間,右擊AutoClasses添加一個框類run,即添加運行/評判框。編輯此框,首先添加一些必要的用于說exe程序絕對路徑;exe程序后的正確輸出結(jié)比較以得到評判結(jié)果。另外,添加一個列表控件,添加一個“選擇正確程序”按出選擇文件框,設(shè)置過濾器為只能選擇exe文件,然后選擇正確的exe文,"可執(zhí)行文件{CStringStrFileName=Dlg.GetPathName();}“運行正確程序”按鈕:在選擇了題目正確的exe程序之后,在相應(yīng)的正確輸入編輯框輸入數(shù)據(jù),以此數(shù)據(jù)來運行正確的exe程序,而如果程序是不需要數(shù)據(jù)輸入運行后直接得到數(shù)據(jù)輸出的,則也省略掉數(shù)據(jù)輸入這一步。在運行正確的exe程序時,利用CreateProcess()函數(shù)來新建一個進(jìn)程運行exe程序,因為是 ==| CStringput=m_inEdit+"\\n";//輸入框輸入數(shù)據(jù),類型為CString memcpy(szInPut,put,20);//CString類型數(shù)據(jù)輸入到char { GetDlgItem(IDC_add_BUTTON)-彈出選擇文件框,選擇所有C源程序文件編譯正確后生成的以學(xué)號命顯示的是目標(biāo)文件的絕對路徑。列表控件的初始化工作與添加文件框中的ECT,"可執(zhí)行文件{ { m_exelist.InsertItem(0,"",0);m_exelist.SetItem(0,0,LVIF_TEXT,FileName,0,0,0,}}GetDlgItem(IDOK)-CStringfilename=-filepath.ReverseFind('\\')-CreateProcess()函數(shù)來新建一個進(jìn)程運行目標(biāo)程序,運行結(jié)束后 CStringput=m_inEdit+"\\n";//輸入框輸入數(shù)據(jù),類型為CString memcpy(szInPut,put,20);//CString類型數(shù)據(jù)輸入到char { }時則強制結(jié)束進(jìn)程,且判為錯誤。如果有輸出數(shù)據(jù)能存入字符串 e,則將e與正確輸出編輯框的正確輸出比較。如果結(jié)果相同則視為運行正確,復(fù)制空白的文本文件file.txt并改名為以此目標(biāo)程序?qū)?yīng)的C源程序文件的學(xué)號命 果結(jié)果不同則視為運行時出錯,空白的文本文件file.txt并改名為以此目標(biāo)結(jié)果存至結(jié)果文件夾e。其代碼如下: e\\"+filetitle+"運行正確}{

運行錯 {DWORD exitcode=0;CStringerrorfile="D:\\test\\ }//如果進(jìn)程沒有自動終止,4}4章測程序修改使之存在語法錯誤而無法通過編譯,選取另一個程序修改使之語法正確能夠通過編譯但輸出內(nèi)容與正確輸出不同。在運行這兩個題目正確C源程序得到正確的exe文件后,開始進(jìn)入測試。準(zhǔn)備系統(tǒng)運行VisualC++Add-In方式,所以在開始使用系統(tǒng)前,需要加載程序開發(fā)編譯后生成的DLL文件。選擇VisualC++菜單欄中“工具”->“定制”->“附加文件”->“瀏覽”,在彈出的選擇文件框中首先選擇文件類型為Add-ins(.dll),然后找到Auto工程文件夾下Debug文件夾中的4-1加載dll點擊“關(guān)閉”后,在VisualC++開發(fā)環(huán)境的中顯示添加了一個新的按鈕,如圖4-2所示此按鈕即是系統(tǒng)的開始使用按鈕,所謂Add-In的方式,也就是把程序功能嵌入到VisualC++開發(fā)環(huán)境中。圖4-2添加按系統(tǒng)測添加文件點擊此中按鈕,彈出添加文件框,點擊“初始化”,啟用“添加文4-3所示,并點擊“OK“按鈕。4-3統(tǒng)自動進(jìn)行編譯部分的工作,結(jié)束后彈出信息提示框,如圖4-4所示,點擊“是(Y)”后進(jìn)入運行/評判框。圖4-4編譯結(jié)束信息提示進(jìn)入運行/評判框后,首先點擊“選擇正確程序”按鈕,選則之前生exe333。再點擊“運PleaseimportanumberThesumis:最后點擊“OK”按鈕,運行這些目標(biāo)程序并且進(jìn)行評判。因為文件205.c設(shè)置的是語法錯誤,無法通過編譯,所以在目標(biāo)程序中沒有205.exe文件,如圖4-5(Y)”后,退出運行/評判框,這樣再點擊按鈕便可以進(jìn)行下一條題目的評判。信息提示框如圖4-6所示。4-6最后,在eC源程序文件對應(yīng)的空白文本文件,文件名是對應(yīng)的評判信息。空白處右擊->查看->詳細(xì)信息,便可以直觀的得到評判信息了。結(jié)果如圖4-7所示。4-7經(jīng)過檢查,評判的結(jié)果與預(yù)先設(shè)置的文件質(zhì)量相同,能夠區(qū)分出編譯C源程序文件結(jié)VisualC++開發(fā)環(huán)境下能夠通DLL文件順利開始運行。在C語言源程序題目需要數(shù)C語言源程序的基本評C源程序文件的評判各種。發(fā)方式,這是之前完全沒有接觸過的一個方式,不同于一般的框方式。這MessageBox()Add-inAfxMessageBox(),這些難點是參考MSDN中的相關(guān)說明后基本解決。第二個就是對于編譯成功后得到的目標(biāo)VisualC++exe程序有多種方法,例如可以通過開發(fā)的整個過程,從接到任務(wù)到完成任務(wù)。第五,提高了自己對于工程的爾濱工業(yè)大學(xué)在C語言課程的上機實驗中采用了一個C語言自動評判,但是具體信息并未公開。其他的是一些帶有自動評判功能的測試,多用于大型C源程序自動評判還是比較少的,二來C源程序自動評判系統(tǒng)得開發(fā)后,對于開發(fā)類似的源當(dāng)然,本系統(tǒng)還不盡完善,評判的是實際教學(xué)中學(xué)生學(xué)習(xí)C較為簡單的源程序,輸入輸出相對而言也較為簡單,對于評判結(jié)果,也還沒有做到進(jìn)一步細(xì)致的區(qū)分各種情況,暫時只有三種結(jié)果。還有就是對于一種特殊情況不能發(fā)現(xiàn),即能夠編譯,程序的內(nèi)容其實是錯誤的,但碰巧輸出結(jié)果與正確答案相同,這里本系統(tǒng)判為正確,而實際上是錯誤的。今后將不斷完善C致在本次的撰寫過程中,新老師給予了我極大的幫助和支持。在開題階段,他針對設(shè)計任務(wù)給予了很多建議。在程序設(shè)計階段,對于出現(xiàn)的問題,反復(fù)實驗,幫助我解決。初稿完成后,他又多次提出修改意見和獨到見解。這些都使我受益匪淺。在此,我謹(jǐn)對新老師的悉心指導(dǎo)和幫 VisualC++編程技巧精選500例.:中國水利水電電,2005AI ClaytonWalnum.標(biāo)準(zhǔn)C++寶典.:電子工業(yè),DaleRogerson.COM技術(shù) 公司 MSDNLibraryVisualStudio6.0附錄 VisualC++第一章句柄和消息技術(shù)也許你希望直截了當(dāng)開始研究代碼,但事實上并非如此。的確,idows下imdosm)?的32例如,若移動鼠標(biāo),就會往活動窗口上發(fā)送一條消息此消息定義為_SEOE)(此消息定_KEY)(此消息定義為WM_SIZE)。了解大概情況了吧WM_MOVE消息后,它更象有很多,譬如桌面、所使用的程序等等。在非面象語言中,程序員銷毀它們。如果不銷毀它們,最終將導(dǎo)致資源泄漏(resourceleak)。資源泄漏將導(dǎo)致系統(tǒng)。所以,務(wù)必確保在適當(dāng)?shù)臅r候銷毀不再使用的句柄?,F(xiàn)在將消息與句柄聯(lián)系起來。假一個窗口,且擁有該窗口的一個句(稱做一HWND)命名句柄為your_HWND。因為其他窗口剛剛從該窗口上移走,操作系統(tǒng)希望重繪窗口。Windows傳遞如下所示消息:your_HWND給窗口發(fā)送了一條繪制消息。最后兩個參voidHandleTheMessage(long{swit{}}以上就是Windows的大致工作過程。了解這些原理后,就可以開始C++如果你希望使用Visualc++,在確實熟悉c++的情況下會大有所有的操作都與類有關(guān)。如果你于使用一般的C語言,只有實際運類一段時間后,才能真正體會類的用途。在開始使用VC++之前,先介紹一些類表達(dá)一條直線。在.h文件中,定義類如下:class{intm_nX1;intm_nY1;intm_nX2;int//CLine(intx1,inty1,intx2,int////voidSetPoints(intx1,inty1,intx2,int//void}的第一字母大寫。不要使用下劃線以及類似的字符。之所以在此微軟標(biāo)準(zhǔn)言歸正傳,再回到類的上。int變量是直線的終點。注意,它們在公有(public)部分的前面。這意味著,使用這個類的程序員不能直接這些變量。它們并非用于公有目的。public3個稱做構(gòu)造//CLine()CLineMyLine;//CLineCLine//下面調(diào)用CLine()//CLineCLine//CLine(intx1,inty1,intx2inty2)pMyLine=newCLine(0,0,10,10);//CLine(intx1,inty1intx2,inty2)CLineMyLine(0,0,10,10);代碼坐標(biāo)。在C++中,關(guān)鍵字new用于創(chuàng)建一個新的對象,這與C中的ma.Uoc一樣。對于創(chuàng)建的對象在不用時需要調(diào)用delete,如同在C中調(diào)用100CLineMyLine;//CLineCLine//下面調(diào)用CLine()//CLineCLine//CLine(intx1,inty1intx2,inty2)pMyLine=newCLine(0,0,10,10);//CLine(intx1,inty1intx2,inty2)CLineMyLine(0,0,10,10);代碼坐標(biāo)。在C++中,關(guān)鍵字new用于創(chuàng)建一個新的對象,這與C中的mallocdeleteCfree它們一樣。使用如下代碼可以分配一個包含100個整數(shù)的數(shù)組://int//100pNumbers=new////內(nèi)delete[]則只首元素的內(nèi)存。因而可能會泄漏內(nèi)存。內(nèi)存泄漏在忘記內(nèi)存時發(fā)生。如果耗盡了計算機的所有內(nèi)存,最終導(dǎo)致計算機的。很抱歉,又跑題了。請再回過頭來CLine的構(gòu)造函數(shù)。在創(chuàng)建一條新{}CLine::CLine(intx1,inty1,intx2,int{}注意以上的函數(shù)與常規(guī)C函數(shù)很相似,只是在函數(shù)名字的前面放置//ClineCLine//下面調(diào)用CLine()清除這個類占用的內(nèi)存,并調(diào)用~CLine()deletepMyLine;{CLineMyLine;}//這個'}'MyLine//調(diào)用~CLineMyLine越出了作用域{//}voidCLine::SetPoints(intx1,inty1,intx2,int{}void{//它們是繪制直線的操作系統(tǒng)函數(shù)MoveTo(m_nX1,m_nY1);LineTo(m_nX2,m_nY2);}CLine*pLine=newCLine(0,0,10,10);deleteCLineMyLine;個類CSquare,其中有4CLine類:class{CLineCLineCLineCLine}建新類。只需繼承類CLine即可達(dá)到目的。實現(xiàn)代碼如下所示:classCColorLine:public{voidDraw(long可以使用其他Draw()函數(shù)來設(shè)置顏色。cppvoidCColorLine::Draw(long{////}奇怪部分CLine::Draw(),它告訴程序來調(diào)用基類Draw函數(shù)。因此,LineToMoveTo代碼。夠酷吧?因此可以完成如下所示任務(wù):CColorLineMyLine;//0VisualCIDEWindows編程很復(fù)雜。也不要輕信別人的一面之詞。微軟為提供了高效率IDE,它稱DeveloperStudio。它能處理所有的編譯和連接,提供掌握使用(onlinehelp)。Windows函數(shù)如此之多,你會發(fā)現(xiàn),至少在頭50%的時間里,你都在浩瀚的幫助文檔中“游蕩”Visual4.25.0,則不必單獨安裝其他幫助文檔,可以直接使用內(nèi)置有時也用到Resource視圖。它用于設(shè)計框。可以在框或其他框架ClassWizard,可以完成項目的50%。剩下的工作是填充ClassWizard生成的函打開Resource視圖,并在框上面放入一些按鈕和其他控件。然后進(jìn)行鍵Ctrl+F5,生成并運行項目)。應(yīng)當(dāng)生成項目所有文件并運行它們。瞧,就這運用IDE的最后一個技巧。如果你右擊菜單欄,馬上會彈出一個框。的utomi。這能非常有用。通過從菜單欄中拖拽按鈕,可以生成一個自定義菜單,其中包括所有必需的按鈕。你甚至可以更改菜單布局(例如,把Fil”、命令作為上的按鈕)。在utomi”框的uild”類別中有一個非常有用的控件。這就是下拉列表.它用于選擇現(xiàn)行配置。將它拖到,它包含如下按鈕:Sv、Sve 、 piluild、topuild,buildll、SttiveonfiurtionFindFindinFilSowiwShowutptindo、StrkPoint、moverkPoit、ileidos和Findinlp。MFC編寫一個極其簡單的“oworld”應(yīng)用程序,對吧如果你想充分利用Visual中談到的所有句柄?,F(xiàn)在,對你來說,最重要的是類CWnd。它封裝了需要窗口句柄(HWND)的函數(shù)。還記得我曾經(jīng)提到的PostMessage函數(shù)嗎?以上代碼做的是相同的事情,但現(xiàn)在不必窗口句柄。不過,也不要被迷惑了,它們?nèi)匀淮嬖?,仍然可以使用它們。它們現(xiàn)在只是類的成員CWndm_hWnd。可以按如下方式調(diào)用舊這些冒號(::)用于通知FC:此時正調(diào)用舊方式的函數(shù)版本。也可以在大部分使它但它放里為在代中到它們時,不至于感到困惑。wnd(uttonDilog)類字解。從uton也可以窗口柄你一感到)。CWinApp,不過,不會在太多的地方明確使用它。你的程序也將有一個CWinApp類,在創(chuàng)建這個類時,開始執(zhí)行程序。構(gòu)建CWinAppInitInstance()。在這個函數(shù)中,創(chuàng)建窗口,并啟動應(yīng)用程序。將CwinAppInitInstance()Cmain()函數(shù)。最后介紹一個非常有用的MFC,而且以后必定會用到,這就是CString。它CStringstrMyString="MaytheForcebewithyou";strMyString+="youngJedi."printf("%s",//輸出將是"MaytheForcebewithyouyoung第五章基于框的應(yīng)用程前幾課還沒有生成框應(yīng)用程序,這~課作進(jìn)一步的介紹,讓你對框應(yīng)用程序的工作過程有一個大概的了解。我認(rèn)為,框應(yīng)用程序是最簡單EFilPojtFCppird(x)”,xtilogpplition型,然后點擊Finih”按鈕。接著,進(jìn)入Fil”視圖。在此視圖中可以看到自動一inppilog派生類(nd派生出在,式框,在用戶按下“OK”、“Cancel”或“Close”按鈕之前,程序一直掛起。而對于無模式框,以點擊按鈕或進(jìn)行應(yīng)用程序的其他操作時,框可以保持打開。有模式框的一個例子是討厭的錯誤提示框,在這個框上而有一個“OK”按鈕。在此,我只介紹此類框。要創(chuàng)建一個有模式框,只需要調(diào)據(jù)退框的具體方式而定???qū)⒄{(diào)用OnInitDialog(),這是初始化框變量的理想地方。如果創(chuàng)建一個框應(yīng)用程序,則可以注意到,已經(jīng)創(chuàng)建了一個缺省的框類和資源。類的文件名為項目名字加上“Dlg”。出在,雖然現(xiàn)在還不能生成一個應(yīng)用程序,但必須告訴你如何在框上放置一現(xiàn)在,把框上的某個地方拖入一個按鈕控件。右擊這個控件,并選擇ShowMessage。至此,就框的名字和按鈕的ID。如果選擇框的名字,則在右邊可以看到通過ClassWizard可以添加的代碼的所有函數(shù)和消息??梢哉业皆?jīng)講過的CLICK,并接受缺省的函數(shù)名字。它將出現(xiàn)在底部的列表中?,F(xiàn)在,雙擊底部列表中的函數(shù)。立即切換到cpp文件中,光標(biāo)所在處正是需要填充代AfxMessageBox("StupidAfx函數(shù)是有用的。我認(rèn)為消息框是其中最有用的。它屬于次打開Resource編輯器,這一次在框上添加一個編輯框。再次右擊編輯框,IDCtrl+WClassWizard。這一次要使用第二個。在這里添加與框中控件關(guān)聯(lián)的成員變量。雙擊編輯框的ID, 將以上代碼運用到應(yīng)用程序中,以此結(jié)束這一節(jié)的講解。請定位到m_strMessage="Initialtext";初始文本設(shè)置為“Initialtext”。然后,點擊按鈕時,消息框中顯示該文本,因為通過UpdateData(TRUE)從框中獲取了該文本。必須處理框的滾動消息。這里只是稍作提示。

講解基丁WindowsNT環(huán)境。大部分材料來自于MSDN。WindowsNT的基本執(zhí)行單元是線程(thread)。這意味著,WindowsNT不執(zhí)先級根據(jù)WindowsNT對每個線程的規(guī)劃而定。優(yōu)先級越高,線程的優(yōu)先個線程。進(jìn)程可以創(chuàng)建線程,也可以終止線程。在任何時刻,線程處于以下3·等待狀態(tài)(waiting)——線程處于掛起狀態(tài),直到指定的事件發(fā)生才能運行就緒和運行狀態(tài)的線程稱做可運行線程(runnlethrd)??蛇\行線程可以PUPU理器系統(tǒng)上,在某一時刻運行的線程數(shù)量等于1。在多處理器系統(tǒng)上,在某一時刻CPU空閑時,OS找出具有最高優(yōu)先級的就緒線程,從隊列首部刪是一個搶占式多任務(wù)系統(tǒng)。這意味著,線程運行的時間段長短由OS決定,而就緒線程,OS就允許運行線程完成它的時間,它稱做線程時間片(threadquantum)。一個線程完成線程的時間片后,OS在最高優(yōu)先級隊列首部尋找就緒就緒線程,則OS搶占當(dāng)前運行的線程,而運行更高優(yōu)先級的線程。任務(wù)無關(guān)。在這樣的應(yīng)用程序中,可能有一個工作線程(workerthread),它執(zhí)行任務(wù),還有一個主線程(mainthread),它執(zhí)行與用戶接口相關(guān)的任務(wù)。因為線程函數(shù)定義沒有this,所以需要在類定義中將函數(shù)定義為靜態(tài)。而且它們共享公共資源。這就涉及到線程同步(threadsynchronization)方面的內(nèi)附錄 LiteratureoneVisualC++Lesson1:BehindtheSceneswithHandlesandThoughyouthinkyouwanttodiverightintothecode,youreallydon't.Windowsprogrammingisoverwhelmingat.Let'stakeaquicklookathowWindowsworks.Thebackboneofallofyourprogrammingwillberespondingtoandsendingmessages.Whataremessages?Messagesaresimplya32bitnumberdesignatingsomeevent.Example:Youmovethemouse,amessage(definedasWM_MOUSEMOVE)is'posted'totheactivewindow.Youpressakey,amessage(WM_KEYDOWN)is'posted'totheactivewindow.Youresizethewindow,amessage(WM_SIZE)is'posted'totheactivewindow.Getthepicture?Nowwheredothesemessagesgo?Theygetqueuedupandawindoweventuallytakesthemoutofthequeueandreactstothem.ForinstancewhenawindowgetstheWM_MOVEmessageitchangesthecoordinatesofthewindowandredrawsitontheLet'smoveontoHandles.Windowsisverymuchobjectoriented.Youhaveseveralwindowobjects(likethedesktop,theprogramyourreadingthiswith,etc...).Howdoestheprogrammerdistinguishallofthesethingsinannon-object-orientedlanguage?Heuseshandles.Handlesareawaytoreferencedifferentwindowsobjects.Youcanhavehandlestowindows,handlestofiles,handlestoallocatedmemory,handlestoimages,etc.Youcanthinkofthemaspointers.Youmustcreatethemsomehow.Andwhenyouaredonewiththem,youmustdestroythem.Ifyoudon'tyouwillendupwithwhatiscalledaresourceleak.Thiscouldbringyoursystemtoagrindinghalt.SotakecaretoalwaysmakesuretheyaredestroyedatNowletstiethesetwothingstogether.Sayyouhaveawindow.Youwillhaveahandletoit(calledanHWND).Letsnameyourhandleyour_HWND.Theoperatingsystemwantstolyoutoredrawyourwindowbecauseitwasjustuncoveredbysomeotherwindow.Windozepassesyouamessagelikethis:Thisfunctionpostsapaintmessagestothewindowwithhandleyour_HWND.Thelasttwoparametersareusedforextrainformationaboutthemessage.Don'tworryaboutthemfornow.Nowyourapplicationwillhaveafunctionwithabigcasestatementinittohandleallofthemessages.Forexample: {swit{}}Okthatisbasicallyhowwindowsworksunderthehood.ThatshouldbeenoughtogetyougoingwhenwestarttalkingaboutMFC.Lesson2:C++IfyouwanttouseVisualC++,ithelpsatonifyoureallyknowC++.Everythingisaboutclasses.IfyouareusedtoplainC,youwon'treallyseethebigdealwithclassesuntilyouusethemforawhile.Let'sreviewwhatyouneedtoknowaboutclassestogetstartedwithVC++.Aclassisastructureforthemostpart.Let'sworkwithanexampleinsteadofmejustlingyourules.Let'smakeaclasstorepresentaline.Inthe.hfileyouwouldtheclassasclass{intm_nX1;intm_nY1;intm_nX2;intCLine(intx1,inty1,intx2,int////setthelinevoidSetPoints(intx1,inty1,intx2,int//drawthelinevoidDraw();}Aquickwordaboutnamingconventions.Classnamesusuallystartwith'C'andthemembervariablesusuallyareprefixedbya'm_'.Theninthewayyouwillhavealettertoletyouknowwhatdatatypethenameisandthenthenameofthevariable.Capitalizetheletterofallnewwordsinthename.Don'tuseunderscoresandstufflikethat.I mendthisstandard(calledHungariannotation)sinceitiswidelyacceptedandveryeasytoread.Ifyouseem_pPoint,youwouldassumethisisamembervariableofaclassthatpoints(itisapointer)toapoint.IfyouseefData,youwouldassumethatitisafloating-pointBacktoourclass.Theintvariablesarepointsoftheline.Notethattheyarebeforethe'public:'part.Thismeansthataprogrammerusingthisclasswillnotbeallowedtomanipulatetheseguysdirectly.Theyarenotfor'public'use.Thefunctionsunderthepublicstatementareforpublicuse.Thethreearecalledconstructors.ThesefunctionsarecalledanytimeanewCLineclassiscreated.Herearesomeexampleswhenthearecalled://thiscallsCLine()CLineMyLine;//thisisapointertoaCLineclassCLine*pMyLine;//this callsCLine()//thisisapointertoaCLineclassCLine*pMyLine;//thiscallsCLine(intx1,inty1,intx2,inty2)pMyLine=newCLine(0,0,10,10);//thiscallsCLine(intx1,inty1,intx2,inty2)CLineMyLine(0,0,10,10);Alloftheseconstructaline.Someinitializeittoitsdefaultsettingsandotherscopycoordinates.The'new'keywordisusedtocreatenewthingsinC++,likemallocinC.Youneedtocall'delete'foreverythingyousaynewto,likefreeinC.Thisgoesforclassesaswellasotherdatatypes.Icouldallocateanarrayof100integerswith://apointertosomeintegersint*pNumbers;//makememoryfor100ofpNumbers=new//settheelementto0//setthelasementto99//freethememory.delete[]Noticethe[]afterthedelete.Thisistoltheprogramtodeletetheentirearray.Ifyousay'deletepNumbers;'youwillonlyfreememoryfortheelement.Youwillthenbe'leaking'memory.Memoryleaksarewhenyoufettodeletememory.Thismayendupcrashingyourcomputerifyouuseallthecomputersmemory.Sorry,let'sgetbacktotheconstructorsforCLine.Thecodefortheseconstructorfunctionswhichautomagicallygetcalledwhenanewlineiscreatedwilllooklike:{}CLine::CLine(intx1,inty1,intx2,int{}Noticethatthefunctiondeclarationismuchlikearegular'C'functionexceptthatweputtheclassnameandtwocolonsinfrontofthefunctionname(CLine::).Onedifferencewithconstructorsisthattheydon'thaveareturnvalue.Thisisthecasefordestructorsalso.AdestructoristhefunctionwhichautomagicallygetscalledwhenourCLineisdeletedoesoutofscope.Forinstance://thisisapointertoaCLineclassCLine*pMyLine;//this callsCLine()//memoryfortheclassisclearedupand~CLine()iscalleddeletepMyLine;{//this CLineMyLine;}//this'}'endsthesectionoftheprogramwhereMyLine//valid.~CLine()willbecalled.(MyLinegoesoutofForourclass,~CLine()doesn'tneedtodoanything.However,sometimesyoumaywanttoputyourcleanupcodehere.Likedeletinganyallocatedmemoryinyourclass.Sincewehavenothingtodooutfunctioncodeisempty:{//do}Let'sfillintheother2voidCLine::SetPoints(intx1,inty1,intx2,int{}void{//psuedocodehere,theseareoperating//functionstodrawalineLineTo(m_nX2,m_nY2);}HowwouldIcallthesefunctions?Hereareacoupleofexamples.Onewithpointersandonewithout.CLine*pLine=newCLine(0,0,10,10);deleteCLineMyLine;That'sitfortheclass.Nowthisclasscanbeusedinotherclasses.YoucanimagineaCSquareclassthathas4Clineclassesinit:class{CLineCLineCLineCLine}Orbetteryet,thepointofallofthisclassstuff,youcanusetheCLineclasstomakeyourownclass.ThisisdoneatoninVisualC.Letssayyouwantedtodrawlinesinyourprogram,andyouthoughtthelineclassmightbenice,butitismissinganimportantfeature,itdoesn'tletyousetthelinecolor.Insteadofwritingawholenewclass,youcansimpleinherittheCLineclass.Thiswouldlooklikethis:classCColorLine:public{voidDraw(longWhat'sgoingonhere?Wellwiththisclasswehaveallthefunctionalityofourotherclass,butnowwecanusethisotherDraw()functionwhichallowsustosetthecolor.TheCPPcodewouldlooklike:voidCColorLine::Draw(long{//psuedocodehere,theseareoperating//functionstodrawaline}NowwehaveallthefunctionalityoftheotherclassbutweaddedanextrafunctioncalledDraw.Butit'sthesamenameasourotherDraw!Nomatter.CppissmartenoughtoknowthatifyoucallDraw(color)tousethenewfunction,butifyoucallDraw()itwillusetheoldfunction.ThestrangepartofthecodemaybeCLine::Draw().Thisjustlsourprogramtocallthebaseclass'sDrawfunction.WesaveourselvesfromhavingtowritethatLineToandMoveTocodeagain.Prettycool,huh?Nowwecandosomethinglikethis:CColorLineMyLine;//assuming0isblack,thiswilldrawablackline.OfcourseI'mleavingoutatonofaspectsandthingshere.Likedefiningoperators,overridingfunctions,virtualfunctions,protectedandprivatemembers...thelistgoeson.Youhaveenoughtogetstartedthough.Lesson3:VisualC++IDEandWindowsprogrammingistrickystuff.Don'tletanyonefoolyou.ButhasblesseduswiththeirIDEcalledDeveloper'sStudio.Itwillhandleallthecompilingandlinking,provideshelp,fillsintonsofcodeforyou,andgivesyouthat'visual'designingenvironmenttomakecuittledialogs.Thereafewthingsyoumustlearntousetogetanywhere.andmostimportantly,USETHEONLINEHELP.Therearesomanywindowsfunctions,youwillfindyourselfinthehelp50%ofthetimeormoreforthefewmonths.Ifyouhavevisualc6.0youneedtheMSDNforhelp.Getit.Ifyouhave4.2or5.0youcanusethebuiltinhelp.Next,thesinglemostimportantkeycombinationisCtrl-W.Thisbringsupwhatiscalledthe'ClassWizard'.Thisguywillinsertabunchofcodeinyourprojectforyou.IthandlesallthecodeforconnectingfunctionsuptothemessageswindowsYouwillalsofindyourselfintheresourceviewabit.Itisusedtodesignthedialogs.Youcandropbuttonsonthemandwhatnot.Withacoupleofclickshereandthereyoucanlayoutyourwholeapplication.Thenusingtheclasswizard,youcanhaveyourproject50%finished.Allisleftistofillinthefunctionstheclasswizardmadetohandlethebuttonclickmessagesandwhatnot.Nowyouneedtoknowhowtostartanewprogramandwecanbeginwiththerealcode.GototheFile andselectNew.Thengotothe'Projects'tabandselectMFCAppWizard.Typeinanameforyouapplicationandpressok.Theonlyimportantoptionfornowistheone.Thisisthetypeofapplicationyouwanttobuild.Thesimplestisa'DialogBased'.Trythemall,buttrydialogbased.Justselectallthedefaultsafterwardsbypressing'next'and'ok'.You'llendupwithafewfiles,butletsignoreeverything.Gototheresourceviewandplopsomebuttonsandstuffonthedialog.Justplayaround.Whenyoufeellikeit,Buildtheprojectfromthe'Build' andrunit(IalwaysjustpressCtrl-F5,itbuildstheprojectandrunsit).Everythingshouldbuildandrun.Wa-la.Applicationcompleteandrunning.OnelasttipontheIDE.Ifyourightclickona bar,adialogwillpopup.Youcanselect'Customize'.Thisisveryuseful.Youcanbuildonecustom withallthebuttonsyouneedonitbysimplydraggingthebuttonstoandfromthe Youcanevenchangethe layout(likebyputtingtheFile,Newasabuttononthetoolbar).OnereallyneededcontrolisundertheBuildcategoryinthecustomizedialog.Itisthedroplistusedtoselecttheactiveconfiguration.Dragthatsuckeruptoyourmaintoolbarandchangeit'ssizestillitlooksgoodtoyou.Ihaveonlyonetoolbaronmyscreenandithasthefollowingbuttonsonit:save,saveall,compile,build,stopbuild,rebuildall,setactiveconfiguration,find,findinfiles,showview,showoutputwindow,setbreakpoint,removebreakpoint,tilewindows,findinhelp.Lesson4:MFCAreyoureadytostartprogramming?Noyouarenot.Youdon'twantmetoteachyouastupid'oworld'application,doyou?IfyouwanttomakethemostofVisualC++youhavetouseFoundationClasses(MFC).Theseclassesaregreatbecausetheywrapallofthosehandleswetalkedaboutinthelessonwitheasytouseclasses.ThemostimportanttoyourightnowistheclassCWnd.Thiswrapsthefunctionswhichneededawindowhandle(HWND).RememberthatPostMessagefunctionImentioned?Wellnowwecantakeourwindowsclassandcallit'smemberThisdoesthesamething,butnowwedon'thavetokeeptrackofthewindowhandles.Butdon'tbefooled,theyarestillthere.Wecanstillusethemtoo.Theyarenowjustmembervariablesoftheclass.ThehandletothewindowaCWndisassociatedwithinthemembervariablem_hWnd.Wecancalltheoldpostmessagethisway:Thosecolons(::)areusedtolMFCthatwearecallingtheoldfashionedversionsofthefunction.Youcangetawaywithoutusingthemmostofthetime,butIputthemheresoyouwon'tbetooconfusedwhenyouseethemin'scode.TheCWndclassisthebaseforseveralotherclasses.LikeCButtonandCDialogwhichIhopethenamesmakeselfexplanatory.FromCButtonyoucanaccessthewindowshandlealso.(You'dbesurprisedhowmanythingsarewindows..Scrollbars,editboxes,treeviews,thedesktop...)Gotallthat?Great!Thenextmostimportantclass,thoughyouwon'texplicitlyuseitmuch,isCWinApp.ThisclassisthebackboneofallofyourfutureMFCapplications.Thisistheclassthatdoesthemaindirtyworkunderthehood.YourprogramwillhaveaCWinAppclass,whichwhencreated,startstheprogramexecution.Themainfuncti

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論