① 請詳細介紹一下vc
一、VC是什麼?學VC是學什麼?
首先VC是一個軟體(IDE集成開發環境)(編譯、編輯、調試)
C和C++。但C++中的有些特性是不用的,例如I/O流,多態繼承
WindowsSDK(軟體開發工具)
VC的靈魂:MFC(微軟基礎類庫)
ATL(ActiveX模板類庫)
其他的SDK,如OpenGL,DirectX,ActiveMoive,DrawDib(WinG)
VC是許許多多技術的綜合,就好象少林72般絕技,一般在應用中學會其中很少一部分就夠了。我們的現在目的,其實不過是學一套少林長拳。這套長拳應包括:
1、養成一種嚴謹的軟體開發習慣,熟悉軟體工程的基本原則。
2、C語言基礎
3、C++最基本內容:類、繼承性、封裝性、多態性的概念
4、如何用向導建立一個程序框架
5、設計菜單
6、設計工具條
7、設計和使用對話框,熟悉最常用的對話框控制項:按鈕、靜態文本、編輯框等
8、知道怎樣新建類、成員函數、成員變數、消息處理函數。
9、了解最常用的Windows消息:如WM_PAINT(重繪窗口),滑鼠按下、彈起、移動,初始化對話框,等。
10、了解最簡單的GDI(圖形設備介面):寫文字、畫框、畫點、畫線、畫圓,設置畫筆、畫刷。
11、熟悉最常用的MFC類:
CWnd
CDocument
CView
CDC
CDialog
CWinApp
CGdiObject及子類
CString、CPoint、CRect、CSize等簡單數據類型
CFile
以上提到的這些內容,是每個人都會用到的內容。
二、MFC簡介
上述主要內容都是與實際操作關系非常密切的,在此不可能講清楚;而且,這些在一般的書里都會講到。我主要將最重要的MFC介紹一下。
MFC是對WindowsAPI的封裝,大大簡化了我們的工作;學VC主要就是要學MFC,大約有100多個類,但常用的也就二三十個。應該象背4級單詞一樣將這些常用類搞懂;當然不要死記,要通過看幫助、看例子、動手練習來學會它們;而且,並非每個類的內部的所有函數都要學會,要日積月累。如果真的想成為高手,做個筆記本把自己認為重要的類、函數記下來,隨時學習,也是很好的突擊方法。
下面介紹最重要的MFC。
CWnd:窗口,它是大多數「看得見的東西」的父類(Windows里幾乎所有看得見的東西都是一個窗口,大窗口裡有許多小窗口),比如視圖CView、框架窗口CFrameWnd、工具條CToolBar、對話框CDialog、按鈕CButton,etc;一個例外是菜單(CMenu)不是從窗口派生的。該類很大,一開始也不必學,知道就行了。
CDocument文檔,負責內存數據與磁碟的交互。最重要的是OnOpenDocument(讀入),OnSaveDocument(寫盤),Serialize(讀寫)
CView視圖,負責內存數據與用戶的交互。包括數據的顯示、用戶操作的響應(如菜單的選取、滑鼠的響應)。最重要的是OnDraw(重畫窗口),通常用CWnd::Invalidate()來啟動它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。你自己的許多功能都要加在裡面,你打交道最多的就是它。
CDC設備文本。無論是顯示器還是列印機,都是畫圖給用戶看。這圖就抽象為CDC。CDC與其他GDI(圖形設備介面)一起,完成文字和圖形、圖像的顯示工作。把CDC想像成一張紙,每個窗口都有一個CDC相聯系,負責畫窗口。CDC有個常用子類CClientDC(窗口客戶區),畫圖通常通過CClientDC完成。
CDialog對話框
CWinApp應用程序類。似於C中的main函數,是程序執行的入口和管理者,負責程序建立、消滅,主窗口和文檔模板的建立。最常用函數InitInstance():初始化。
CGdiObject及子類,用於向設備文本畫圖。它們都需要在使用前選進DC。
CPen筆,畫線
CBrush刷子,填充
CFont字體,控制文字輸出的字體
CBitmap點陣圖
CPalette調色板
CRgn區域,指定一塊區域可以用於做特殊處理。
CFile文件。最重要的不外是Open(打開),Read(讀入),Write(寫)
CString字元串。封裝了C中的字元數組,非常實用。
CPoint點,就是(x,y)對
CRect矩形,就是(left,top,right,bottom)
CSize大小,就是(cx,cy)對(寬、高)
三、用好MSDN和例子
作為提高,推薦看的例子有:
nHello最簡單的程序框架
nScribble滑鼠繪圖。教程:編程基礎,GDI
nDiblook圖像處理最簡單範例
nMFCIE網際網路瀏覽器
nEnroll資料庫
nDaoviewDao(數據訪問對象)範例。樹型和列視控制項
nCubeOpenGL範例,畫一個不斷旋轉的方塊
nHierSvrOLE伺服器
nOclientOLE包容器
nDrawcli滑鼠繪圖。也包括OLE。
nWordPad寫字板。OLE
四、幾點經驗
A.為什麼要用Windows而不是DOS編程
Windows編程並不比DOS編程難很多,只是在剛剛接觸的時候感到頭緒繁多,不知從何下手。實際上,如果你會C語言,你會發現Windows編程的難度並不比當年學C語言時大。DOS編程要想成為高手,也需要學習幾百個函數(無論是TC、BC、MicrosoftC),並要深入了解匯編語言級的DOS功能調用。而現在在Windows下,付出相同的工作量,你卻可以獲得幾倍的收益。如果你以前熟悉DOS編程,現在再搞Windows編程,只要兩個星期肯定會感到巨大的優越性:在DOS下,每一件事都要自己干,而且還有64K內存、顯示精度等的限制,實在是事倍功半了。
B.為什麼要用VC而不是其他Windows編程語言
n大多數大型軟體(包括Windows自己)都是用C、C++編的,所以可以利用的源代碼特別多。例如Photoshop,就有VC的編程介面。的其他的語言都不如VC有歷史優勢。而且VC的開發工具特別多,從控制項公司到硬體開發商,其產品很少敢不提供VC介面的。
nVC適合組織大工程(VB就不行)
nBorlandC++或C++Builder也很不錯,並不比VC差。但BC的版本兼容性不好,從3.1到4.0就出現「代溝」,而且VC提供了極為豐富的文檔和範例,VC的參考資料也遠比BC多。並且VC與其他的VisualStudio成員可以協調工作,對軟體工程有利。
n
C.開始不要學WinAPI編程,但以後最好學學WinAPI
特別要注意,開始不要買講WindowsSDK編程的書。一個臭名昭著的例子就是「HelloWorld」。各種計算機語言在入門課中往往都給出一個例子,顯示一行文字「HelloWorld」,無論是在Basic、C、Pascal,甚至匯編中,這個最簡單的小程序都幾行就可以寫完。但在早期的Windows編程中,剛才講到的「HelloWin」這個有名的例子就要組織一個工程、寫上幾百行代碼才能實現。這就嚇跑了很多想學Windows編程的人。實際上,在Windows下顯示「Helloworld」,最簡單的方法只要5行就夠了:
#include「windows.h」
voidWinMain()
{
MessageBox(NULL,」HelloWorld!」,」MyFirstWindowsApplication」,MB_OK);
}
當然這個程序只建立了一個最簡單的對話框,但這已經夠了。
如果你沒有SDK編程的經驗,學VC就是要利用MFC繞過Windows編程的許多細節。有好的工具為什麼不用呢?現在你在VC寫一個」HelloWorld」,只要寫一行代碼就可以了。
voidCYourView::OnDraw(CDC*pDC)
{
//…….其他的代碼
pDC->TextOut(100,100,」HelloWorld!」);
}
但MFC不是萬能的,WinAPI和VC中有很多功能在MFC中並不能反映出來。在入門後,要想發揮VC的完全能力,WindowsAPI還是非常重要的。而且,這些API在其他Windows語言中也用得到。
學語言,與練武道理也差不多。VC、VB、Dlphi、VFP,以及其他的Windows編程語言,都屬於同一個門派:Windows門,雖然招式不同,但內功都是一樣的,這就是WindowsAPI(應用編程介面),大概是兩千個函數。任何武功,招式即使再復雜,通常也能在很短時間內記下來;但內功就不是一朝一夕的事。而且,各門派的內功不同,Unix、Linux門有Uinx的內功,Apple(蘋果)門有Mac的內功,Java更是自成一派。我們這里說的學VC,只是學招式,學招式一個月差不多就夠了,聰明的兩個星期就可以掌握。光學招式,嚇唬人是夠了,但和高手一過招,非出醜不可。要想精通VC,必須熟悉WindowsAPI。
D.高級語言與自然語言
一門高級語言與一門自然語言是類似的。關鍵要素有三:
語法:了解C和C++基本語法,這是比較容易的。
修辭:編程的藝術和風格。通常,這是與軟體工程聯系起來的。演算法上的小伎倆並非是關鍵的。嚴謹,嚴格按照規范去做,同時又能發揮出極大的創造性,才是語言學家的本色。
詞彙:如何利用別人的工作?如何利用自己以前的工作?這是一個軟體工程師成功的關鍵。如果詞彙量不豐富,就寫不出好文章,就會有想法表達不出。一個人的語法在上小學之前就基本上學成了,修辭水平也在年輕時就確定了,惟有詞彙量需要根據需要不斷學習、不斷擴充。VC編程中,擁有大的詞彙量就意味著要掌握較多的類、函數和其他編程組件。如:WindowsSDK,MFC,以及你所專攻的領域的現成的SDK,比如3D編程中的OpenGL,多媒體編程中的DirectX,圖像處理中的Victor庫。另外,ActiveX控制項的掌握往往也是成敗的關鍵。我們這幾年的工作也總結成了一個類庫,叫IPX(圖像處理框架),大大簡化了圖像處理的工作;不過現在還有很多細節問題要解決,如果有同學感興趣可以參與這方面的工作。
學習VC,千萬不要用我們在學校里學英語的方法,而要用小孩學說話的方法。所謂學英語的方法,就是我們在本科時學C語言的那種模式:詳細搞懂每一個細節,背大量的規則,很少上機實踐,沒有實際問題供解決,最後由考試來斷定學習成果。這種模式的後果大家都清楚:我們學了十幾年英語,可有不少人還只會四五千個單詞,寫百把字的文章,不會說,不能聽;尤其要命的是,看不懂VC的幫助文檔。我們要象嬰兒一樣,在使用中學會語法、修辭和詞彙;一開始肯定只能編出最糟糕的,就好象小孩開始只會說:「爸爸坐車車」;但「爸爸」「車車」這些詞對小孩是最需要的,學習的效率反而最高。學VC的時候,應從我的需要出發,先做一個最簡單的東西,然後一點一點復雜起來,象滾雪球一樣。
學習VC尤其要和別人交流,你苦苦思考不明白的,也許別人早就解決了。一定要善於學習:從書店找出有用的書;向身邊的高手學習;尋找可以利用的源代碼、類庫、組件、控制項、庫;如果能上互連網,那就更加能解決問題了。
② VC 如何將多個文件和多個文件夾打包成一個自定義格式的文件
文件夾,只是個路徑而也
比如你只需要打包文件,但是標記下文件的相對路徑,當然路徑中就有文件夾的名稱
在釋放的時候,自己根據這個信息,創建文件夾,再釋放文件就可以了
③ vc中的頭文件
這個東西是不抄是屬於c++中的頭文件?
<iostream>是標准c++的輸入輸出流類庫,有這個你才能用類似cout\cin等在屏幕輸入輸出,可以說是頭文件。
在用vc6編程的時候,是要把它寫在header file中呢?還是寫在source file里?
二者皆可。你在哪裡使用類似cout<<或cin這類東西,就在哪裡加這個。一般是在source file里。
問題補充:那c++中沒有頭文件的行不行啊?頭文件一定是寫在header file里嗎?
當然是行的。vc頭文件與實現文件分開是為了便於管理,因為一個工程可能有很多頭文件和源文件,這樣比較清晰。如果一個很簡單的程序,那頭文件當然可以不用。另外,也不一定非要寫在header file里。就像吃飯用碗吃,但我也可以不用碗直接下手從鍋里抓一個道理。
④ vc++如何新建C文件
分三步:
1.
打開VC++,界面如圖:
2.
點擊文件,選擇新建。出現如下頁面。
3.
點擊文件,選擇C/C++
Header
File,輸入文件名,點擊確定就可以了。
4.
⑤ VC 如何創建類文件
VS2010在項目右鍵菜單中有添加類。
手動方法:
建立一個類頭文件和實現文件,
把你的方法寫在實現文件裡面,
Main.c文件中包含頭文件,
就可以了。
注意:頭文件和實現文件中聲明要對應。
⑥ 用VC++ MFC模板寫的程序的EXE文件的圖標怎麼改
創建或打開工程Icon(以下都以工程名為Icon為例)。
單擊Workspace窗口的ResourceView標簽,選中資源ID為IDR_MAINFRAME圖標內資源,然後按Delete鍵把它刪除容掉。注意:一定要把它刪除才行。
從Developer Studio的Insert菜單中選擇Resource,然後選擇Icon,新建(New)一個新的圖標或導入(Import)一個已有的圖標。
把新圖標的資源ID改為AFX_IDI_STD_MDIFRAME(如果是MDI應用程序)或改為AFX_IDI_STD_FRAME(如果是SDI應用程序)。AFX_IDI_STD_MDIFRAME和AFX_IDI_STD_FRAME這兩個資源ID是MFC中預定義了的。
編譯並運行程序,可以發現主框架窗口的圖標就是你指定的圖標。
⑦ VC中如何使用資源模板(.rct文件)
文檔,視,框架之間相互作用
一般來說用戶的輸入/輸出基本都是通過視進行,但一些例外的情況下可能需要和框架直接發生作用,而在多視的情況下如何在視之間傳遞數據。
在使用菜單時大家會發現當一個菜單沒有進行映射處理時為禁止狀態,在多視的情況下菜單的狀態和處理映射是和當前活動視相聯系的,這樣MFC可以保證視能正確的接收到各種消息,但有時候也會產生不便。有一個解決辦法就是在框架中對消息進行處理,這樣也可以保證當前文檔可以通過框架得到當前消息。
在用戶進行輸入後如何使視的狀態得到更新?這個問題在一個文檔對應一個視圖時是不存在的,但是現在有一個文檔對應了兩個視圖,當在一個視上進行了輸入時如何保證另一個視也得到通知呢?MFC的做法是利用文檔來處理的,因為文檔管理著當前和它聯系的視,由它來通知各個視是最合適的。讓我們同時看兩個函數:
void CView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint )
void CDocument::UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL )
當文檔的UpdateAllViews被調用時和此文檔相關的所有視的OnUpdate都會被調用,而參數lHint和pHint都會被傳遞。這樣一來發生改變視就可以通知其他的兄弟了。那麼還有一個問題:如何在OnUpdate中知道是那個視圖發生了改變呢,這就可以利用pHint參數,只要調用者將this指針賦值給參數就可以了,當然完全可以利用該參數傳遞更復雜的結構。
視的初始化,當一個文檔被打開或是新建一個文檔時視圖的CView::OnInitialUpdate()會被調用,你可以通過重載該函數對視進行初始化,並在結束前調用父類的OnInitialUpdate,因為這樣可以保證OnUpdate會被調用。
文檔中內容的清除,當文檔被關閉時(比如退出或是新建前上一個文檔清除)void CDocument::DeleteContents ()會被調用,你可以通過重載該函數來進行清理工作。
在單文檔結構中上面兩點尤其重要,因為軟體運行文檔對象和視對象只會被產生並刪除一次。所以應該將上面兩點和C++對象構造和構析分清楚。
最後將一下文檔模板(DocTemplate)的作用,文檔模板分為兩類單文檔模板和多文檔模板,分別由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在於記錄文檔,視,框架之間的對應關系。還有一點就是模板可以記錄應用程序可以打開的文件的類型,當打開文件時會根據文檔模板中的信息選擇正確的文檔和視。模板是一個比較抽想的概念,一般來說是不需要我們直接進行操作的。
當使用者通過視修改了數據時,應該調用GetDocument()->SetModifiedFlag(TRUE)通知文檔數據已經被更新,這樣在關閉文檔時會自動詢問用戶是否保存數據。
好象這一節講的有些亂,大家看後有什麼想法和問題請在VCHelp論壇上留言,我會盡快回復並且會對本節內容重新整理和修改。