文章編號:10617時間:2024-09-28人氣:
正好我寫個一個函數封裝在DLL里了,代碼是這樣的:
C語言是一種計算機程序設計語言。 它既有高級語言的特點,又具有匯編語言的特點。 它可以作為系統設計語言,編寫工作系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬件的應用程序。 因此,它的應用范圍廣泛。 C語言對操作系統和系統使用程序以及需要對硬件進行操作的場合,用C語言明顯優于其它解釋型高級語言,有一些大型應用軟件也是用C語言編寫的。 C語言具有繪圖能力強,可移植性,并具備很強的數據處理能力,因此適于編寫系統軟件,三維,二維圖形和動畫。 它是數值計算的高級語言。 常用的C語言IDE(集成開發環境)有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,Turbo C等等......C語言的缺點1. C語言的缺點主要是表現在數據的封裝性上,這一點使得C在數據的安全性上做的有很大缺陷,這也是C和C++的一大區別。 2. C語言的語法限制不太嚴格,對變量的類型約束不嚴格,影響程序的安全性,對數組下標越界不作檢查等。 從應用的角度,C語言比其他高級語言較難掌握。 [C語言指針]指針就是C語言的一大特色,可以說C語言優于其它高級語言的一個重要原因就是因為它有指針操作可以直接進行靠近硬件的操作,但是C的指針操作也給它帶來了很多不安全的因素。 C++在這方面做了很好的改進,在保留了指針操作的同時又增強了安全性。 Java取消了指針操作,提高了安全性。 C源程序的結構特點1.一個C語言源程序可以由一個或多個源文件組成。 2.每個源文件可由一個或多個函數組成。 3.一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。 4.源程序中可以有預處理命令(include 命令僅為其中的一種),預處理命令通常應放在源文件或源程序的最前面。 5.每一個說明,每一個語句都必須以分號結尾。 但預處理命令,函數頭和花括號“}”之后不能加分號。 6.標識符,關鍵字之間必須至少加一個空格以示間隔。 若已有明顯的間隔符,也可不再加空格來間隔。 學習C語言在初學C語言時,可能會遇到有些問題理解不透,或者表達方式與以往數學學習中不同(如運算符等),這就要求不氣餒,不明白的地方多問多想,鼓足勇氣進行學習,待學完后面的章節知識,前面的問題也就迎刃而解了,這一方面我感覺是我們同學最欠缺,大多學不好的就是因為一開始遇到困難就放棄,曾經和好多同學談他的問題,回答是聽不懂、不想聽、放棄這樣三個過程,我反問,這節課你聽過課嗎?回答又是沒有,根本就沒聽過課,怎么說自己聽不懂呢?相應的根本就沒學習,又談何學的好?學習C語言始終要記住“曙光在前頭”和“千金難買回頭看”,“千金難買回頭看”是學習知識的重要方法,就是說,學習后面的知識,不要忘了回頭弄清遺留下的問題和加深理解前面的知識,這是我們學生最不易做到的,然而卻又是最重要的。 學習C語言就是要經過幾個反復,才能前后貫穿,積累應該掌握的C知識。 那么,我們如何學好《C程序設計》呢?一.學好C語言的運算符和運算順序這是學好《C程序設計》的基礎,C語言的運算非常靈活,功能十分豐富,運算種類遠多于其它程序設計語言。 在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單,但初學者往往會覺的這種表達式難讀,關鍵原因就是對運算符和運算順序理解不透不全。 當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則顯得十分重要。 在學習中,只要我們對此合理進行分類,找出它們與我們在數學中所學到運算之間的不同點之后,記住這些運算也就不困難了,有些運算符在理解后更會牢記心中,將來用起來得心應手,而有些可暫時放棄不記,等用到時再記不遲。 先要明確運算符按優先級不同分類,《C程序設計》運算符可分為15種優先級,從高到低,優先級為1 ~ 15,除第2、3級和第14級為從右至左結合外,其它都是從左至右結合,它決定同級運算符的運算順序.二.學好C語言的四種程序結構(1)順序結構順序結構的程序設計是最簡單的,只要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。 例如;a = 3,b = 5,現交換a,b的值,這個問題就好像交換兩個杯子水,這當然要用到第三個杯子,假如第三個杯子是c,那么正確的程序為: c = a; a = b; b = c; 執行結果是a = 5,b = c = 3如果改變其順序,寫成:a = b; c = a; b = c; 則執行結果就變成a = b = c = 5,不能達到預期的目的,初學者最容易犯這種錯誤。 順序結構可以獨立使用構成一個簡單的完整程序,常見的輸入、計算,輸出三步曲的程序就是順序結構,例如計算圓的面積,其程序的語句順序就是輸入圓的半徑 r,計算s = 3.*r*r,輸出圓的面積s。 不過大多數情況下順序結構都是作為程序的一部分,與其它結構一起構成一個復雜的程序,例如分支結構中的復合語句、循環結構中的循環體等。 (2) 分支結構順序結構的程序雖然能解決計算、輸出等問題,但不能做判斷再選擇。 對于要先做判斷再選擇的問題就要使用分支結構。 分支結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。 分支結構的程序設計方法的關鍵在于構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的分支語句。 分支結構適合于帶有邏輯或關系比較等條件判斷的計算,設計這類程序時往往都要先繪制其程序流程圖,然后根據程序流程寫出源程序,這樣做把程序設計分析與語言分開,使得問題簡單化,易于理解。 程序流程圖是根據解題分析所繪制的程序執行流程圖。 學習分支結構不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執行的功能,嵌套結構也就不難了。 嵌套只不過是分支中又包括分支語句而已,不是新知識,只要對雙分支的理解清楚,分支嵌套是不難的。 下面我介紹幾種基本的分支結構。 ①if(條件){分支體}這種分支結構中的分支體可以是一條語句,此時“”可以省略,也可以是多條語句即復合語句。 它有兩條分支路徑可選,一是當條件為真,執行分支體,否則跳過分支體,這時分支體就不會執行。 如:要計算x的絕對值,根據絕對值定義,我們知道,當x>=0時,其絕對值不變,而x<0時其絕對值是為x的反號,因此程序段為:if(x<0) x=-x;②if(條件)else這是典型的分支結構,如果條件成立,執行分支1,否則執行分支2,分支1和分支2都可以是1條或若干條語句構成。 如:求ax^2+bx+c=0的根分析:因為當b^2-4ac>=0時,方程有兩個實根,否則(b^2-4ac<0)有兩個共軛復根。 其程序段如下:d=b*b-4*a*c;if(d>=0){x1=(-b+sqrt(d))/2a;x2=(-b-sqrt(d))/2a;printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);}else{r=-b/(2*a);i =sqrt(-d)/(2*a);printf(“x1=%8.4f+%8.4fi\n”r, i);printf(“x2=%8.4f-%8.4fi\n”r,i)}③嵌套分支語句:其語句格式為:if(條件1) ;else if(條件2) else if(條件3) ……else if(條件n) else 嵌套分支語句雖可解決多個入口和出口的問題,但超過3重嵌套后,語句結構變得非常復雜,對于程序的閱讀和理解都極為不便,建議嵌套在3重以內,超過3重可以用下面的語句。 ④switch開關語句:該語句也是多分支選擇語句,到底執行哪一塊,取決于開關設置,也就是表達式的值與常量表達式相匹配的那一路,它不同if… else 語句,它的所有分支都是并列的,程序執行時,由第一分支開始查找,如果相匹配,執行其后的塊,接著執行第2分支,第3分支……的塊,直到遇到break語句;如果不匹配,查找下一個分支是否匹配。 這個語句在應用時要特別注意開關條件的合理設置以及break語句的合理應用。 (3)循環結構:循環結構可以減少源程序重復書寫的工作量,用來描述重復執行某段算法的問題,這是程序設計中最能發揮計算機特長的程序結構,C語言中提供四種循環,即 goto循環、while循環、do –while循環和for循環。 四種循環可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環,因為強制改變程序的順序經常會給程序的運行帶來不可預料的錯誤,在學習中我們主要學習while、do…while、for三種循環。 常用的三種循環結構學習的重點在于弄清它們相同與不同之處,以便在不同場合下使用,這就要清楚三種循環的格式和執行順序,將每種循環的流程圖理解透徹后就會明白如何替換使用,如把while循環的例題,用for語句重新編寫一個程序,這樣能更好地理解它們的作用。 特別要注意在循環體內應包含趨于結束的語句(即循環變量值的改變),否則就可能成了一個死循環,這是初學者的一個常見錯誤。 在學完這三個循環后,應明確它們的異同點:用while和do…while循環時,循環變量的初始化的操作應在循環體之前,而for循環一般在語句1中進行的;while 循環和for循環都是先判斷表達式,后執行循環體,而do…while循環是先執行循環體后判斷表達式,也就是說do…while的循環體最少被執行一次,而while 循環和for就可能一次都不執行。 另外還要注意的是這三種循環都可以用break語句跳出循環,用continue語句結束本次循環,而goto語句與 if構成的循環,是不能用break和 continue語句進行控制的。 順序結構、分支結構和循環結構并不彼此孤立的,在循環中可以有分支、順序結構,分支中也可以有循環、順序結構,其實不管哪種結構,我們均可廣義的把它們看成一個語句。 在實際編程過程中常將這三種結構相互結合以實現各種算法,設計出相應程序,但是要編程的問題較大,編寫出的程序就往往很長、結構重復多,造成可讀性差,難以理解,解決這個問題的方法是將C程序設計成模塊化結構。 (4)模塊化程序結構C語言的模塊化程序結構用函數來實現,即將復雜的C程序分為若干模塊,每個模塊都編寫成一個C函數,然后通過主函數調用函數及函數調用函數來實現一大型問題的C程序編寫,因此常說:C程序=主函數+子函數。 因此,對函數的定義、調用、值的返回等中要尤其注重理解和應用,并通過上機調試加以鞏固。 三.掌握一些簡單的算法編程其實一大部分工作就是分析問題,找到解決問題的方法,再以相應的編程語言寫出代碼。 這就要求掌握算法,根據我們的《C程序設計》教學大綱中,只要求我們掌握一些簡單的算法,在掌握這些基本算法后,要完成對問題的分析就容易了。 如兩個數的交換、三個數的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些算法的內在含義結語:當我們把握好上述幾方面后,只要同學們能克服畏難、厭學、上課能專心聽講,做好練習與上機調試,其實C語言并不難學C源程序的關鍵字---------------------------------------------------------------------------------------所謂關鍵字就是已被C語言本身使用, 不能作其它用途使用的字。 例如關鍵字不能用作變量名、函數名等由ANSI標準定義的C語言關鍵字共32個 :auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static根據關鍵字的作用,可分其為數據類型關鍵字、控制語句關鍵字、存儲類型關鍵字和其它關鍵字四類。 1 數據類型關鍵字(12個):(1) char :聲明字符型變量或函數(2) double :聲明雙精度變量或函數(3) enum :聲明枚舉類型(4) float:聲明浮點型變量或函數(5) int: 聲明整型變量或函數(6) long :聲明長整型變量或函數(7) short :聲明短整型變量或函數(8) signed:聲明有符號類型變量或函數(9) struct:聲明結構體變量或函數(10) union:聲明聯合數據類型(11) unsigned:聲明無符號類型變量或函數(12) void :聲明函數無返回值或無參數,聲明無類型指針(基本上就這三個作用)(2)控制語句關鍵字(12個):A循環語句(1) for:一種循環語句(可意會不可言傳)(2) do :循環語句的循環體(3) while :循環語句的循環條件(4) break:跳出當前循環(5) continue:結束當前循環,開始下一輪循環B條件語句(1)if: 條件語句(2)else :條件語句否定分支(與 if 連用)(3)goto:無條件跳轉語句C開關語句(1)switch :用于開關語句(2)case:開關語句分支(3)default:開關語句中的“其他”分支Dreturn :子程序返回語句(可以帶參數,也看不帶參數)3 存儲類型關鍵字(4個)(1)auto :聲明自動變量 一般不使用(2)extern:聲明變量是在其他文件正聲明(也可以看做是引用變量)(3)register:聲明積存器變量(4)static :聲明靜態變量4 其它關鍵字(4個):(1)const :聲明只讀變量(2)sizeof:計算數據類型長度(3)typedef:用以給數據類型取別名(當然還有其他作用(4)volatile:說明變量在程序執行中可被隱含地改變
Electron打包一開始時出現error,去解決真的好累,報錯一個接一個,而且我這和網上一些bug解決方案還有點不同,不能照抄別人的作業。
本次我使用的electron打包工具是electron-builder(以后就換其他的試試)
當然也是我學藝不精了?
打包正常流程在說自己錯誤經歷之前,先走一遍可以正確打包的流程吧
為了讓流程看起來干凈些,創建一個獨立的electron項目
使用yarninit命令創建項目,注意需要寫明author作者和description描述,后續打包時如果沒有會出現報錯
使用yarnaddelectron-D和yarnaddelectron-builder命令安裝需要的程序包。安裝完程序包后,在中添加運行命令和打包命令
scripts:{start:electron.,electron:build:electron-builder--win--x64},如果yarnaddelectron-D出錯,可以看看是不是和我這篇文章中的錯誤相似:《yarnaddelectron安裝失敗》?
我在之前使用vue和vuecli4創建了一款簡易的小說閱讀器,現在將其使用yarnbuild命令打包出來,生成了一份dist
里面的頁面可以直接在瀏覽器中打開,就能夠直接看到效果。不過現在先將此文件夾改個名字在放入electron項目中,不然的話等等會和打包出來文件夾名字重復
在同級目錄下創建一個入口文件,該文件是electron所必須的程序進入文件
可以像下面這樣寫,這是一種較為簡單的入口文件寫法:
constelectron=require(electron);//控制應用生命周期的模塊。const{app}=electron;//創建原生瀏覽器窗口的模塊。const{BrowserWindow}=electron;letmainWindow;functioncreateWindow(){//創建瀏覽器窗口。mainWindow=newBrowserWindow({width:480,height:670});//加載應用的。(`file://${__dirname}/common/`);//啟用開發工具//();}//Electron會在初始化后并準備(ready,createWindow);//當全部窗口關閉時退出。(window-all-closed,()=>{//否則絕大部分應用及其菜單欄會保持激活。if(!==darwin){();}});(activate,()=>{//絕大部分應用會重新創建一個窗口。if(mainWindow===null){createWindow();}});現在就可以嘗試使用yarnstart命令運行electron了,如果不出意外的話,會成功跳出小說閱讀器界面
此時小說閱讀器并沒有打包
接下來,使用yarnelectron:build命令進行打包,一路順利,沒有報錯,就能看到生成了一個dist文件夾
PS:在編寫build去對打包進行配置,我一開始以為這是必須的,后來發現即使不寫,基礎打包也可以成功。
在此文件夾中,如果使用打開文件,那么將會進行安裝程序,并且桌面會出現程序圖標,點擊即可打開項目。 此時已經是標準的桌面應用的了。
當然如果不想安裝,只是想看看打包后的結果,可以打開內部的win-unpacked/,這樣能跳過安裝直接啟動程序。
到目前為止,一個正確無誤的打包流程就走完了!
項目打包遇到各種問題那么接下來,就說說我真正的錯誤之路吧:
省略一些中間的步驟,直到上面所說的第四步為止,我一切都還是順利的。
那么問題就出在第五步上,yarnelectron:build
問題1運行此命令時,一開始還是挺順利的,但是很快遇到了第一個問題:
?Get當遇到打包報錯,肯定是哪里不會搜哪里了,發現原因還是和連接有關,根據網上找到的參考文章,可以通過先將下載下來,然后放到C:\Users\Administrator\AppData\Local\electron\Cache文件夾下。
參考文章:
同時分享一下下載包地址:
但是很尷尬的是,我Local下這并沒有electron文件夾。那么能否自己創建一個然后放入呢?
答案:不行,自己創建了一個electron也沒有用,后來想是不是因為我沒有全局安裝electron,可以把這放入項目的node_modules里,不過還是失敗了,只能另辟蹊徑,在中進行配置。(后面的nsis和winCodeSign也同樣如此)
其實這可能和這臺電腦一開始的配置有關系,因為后來我使用自己筆記本,發現Local下是存在electron和electron-builder兩個文件夾的。
在下載文件到本地失敗后,我采用在中進行設置electron_mirror路徑的方式。
的打開路徑在C:\Users\用戶文件夾下,同時也可以使用cmd命令直接打開此文件:npmconfigedit
然后通過添加一句話:electron_mirror=這樣包就能夠成功安裝了
問題2成功解決了的問題之后,我又遇到了新的問題:
?Get這兩種同樣也是在中進行配置的,添加的是electron-builder-binaries_mirror的路徑:
electron-builder-binaries_mirror=其實一開始我添加的是路徑,但是發現會出現報錯,沒有這個地址,然后經過實際下載才發現nsis-3.0.4.1.7z的地址是,所以對electron-builder-binaries_mirror進行了重新設置,然后成功了
現在讓我重新進行打包,發現到此,沒有出現任何報錯,并且打包成功了
我遇到的問題終于解決了,和網上找到的直接下載包到本地方式不同,解決方案是修改了下載源。最后我發現成功一次之后,把中的修改下載源注釋掉后續打包也可以成功了?
總結這個打包問題當時改的我心累,因為我下載到本地也還是不成功,最后修修改改,通過修改成功。 期間甚至想放棄electron-builder這種方式打包,中間我去用了一下ElectronForge。 發現這個居然輸入命令要在gitbash里,并且會對你的重寫,這還是算了。
現在electron打包應該還有一種electron-package的方式,不過我沒有去嘗試,可能也是當時對builder已經上頭了,一心要解決掉這個報錯。
遇到報錯,努力一把,總會攻克的。(當然這個問題困了你一天以上,建議找找其他替代方案)
原文:
cmake vs qmakeqmake 是為 Qt 量身打造的,使用起來非常方便cmake 使用上不如qmake簡單直接,但復雜換來的是強大的功能內置的 out-of source 構建。
(目前QtCreator為qmake也默認啟用了該功能,稱:shadow build)為各種平臺和場景提供條件編譯可處理多個可執行文件情況,和很好配合 QtTest 工作如何選擇?Using CMake to Build Qt Projects 一文中說:對簡單的Qt工程,采用 qmake對復雜度超過 qmake 處理能力的,采用 cmake盡管如此,如果簡單Qt的工程都不知道怎么用 cmake 構建,復雜的工程,就更不知道如何使用 cmake 了。
還是從簡單的學起吧簡單的 Qt 程序#include
如何看MFC 程序代碼 看下面內容之前,建議你學學《深入淺出MFC》,這本書強烈推薦! 現在只是做個了解。 不妨做個知識備份! 在MFC 程序中,我們并不經常直接調用Windows API,而是從MFC 類創建對象并調用屬于這些對象的成員函數.也就是說MFC 封裝了Windows API 你說你喜歡C++而MFC 換一種說法就是一個用C++寫的一個函數庫然后你來調用只不過這個類不是你寫的MFC 提供數百個類,最重要的、也是編寫任何VC++應用程序都必不可少的兩個類CWinApp 和CFrameWnd,這兩個類是編寫復雜龐大應用程序的基石。 1 封裝特性:構成MFC 框架的是MFC 類庫而MFC 類庫又是C++的一個類庫。 這些類封裝WIN32 應用程序編程接口,OLE(Object Link Embed 對象鏈接嵌入) 特性,ODBC 和DAO 數據訪問的功能。 2 繼承特性:MFC 抽象出了眾多類的共同特性,并設計出一些基類作為實現其他類的基礎,這些類中最重要的類是 CObject 類和CCmdTarget 類,程序員可以從適當的MFC 類中派生出自己的類,實現特定的功能達到編程的目的。 3 虛擬和消息映射:MFC 是以C++為基礎,當然支持虛函數,但作為一個編程框架必須要解決的是效率問題:如果MFC 僅僅通過虛函數來支持動態約束必然會產生大量的虛函數表這樣編程框架過于臃腫而且消耗更多的內存。 但是MFC 建立了消息映射機制這樣降低了內存的使用卻大大提高了效率消息映射是一個將消息和成員函數相互關聯的表,當應用程序的框架窗口接收到一個消息時,MFC 將搜索該窗口的消息映射,如果存在一個處理消息的處理程序,那么就調用該處理程序.它通過宏來實現消息到成員函數的映射,而且這些函數不必是虛擬的成員函數,這樣不需要為消息映射函數生成一個很大的虛擬函數表(V 表),節省內存。 MFC 消息映射機制:將消息與消息處理函數聯系起來,形成一一對應的機制。 消息映射宏聲明:DECLARE_MESSAGE_MAP 定義:BEGIN_MESSAGE_MAP ON_COMMAND ON_CONTROL ON_MESSAGE END_MESSAGE_MAP MFC 主要組成部分:類、宏和全局函數。 類是MFC 中最主要的內容。 MFC 類是以層次結構方式組織起來的。 MFC 中的類分成兩部分,除了一些輔助類,大多數的MFC 類是直接或間接從根類CObject 派生而來。 MFC 宏主要功能:消息映射、運行時對象類型服務、診斷服務、異常處理。 MFC 約定:全局函數以Afx為前綴,全局變量以afx為前綴MFC 類的層次關系CObject 項目類)-CCmdTarget(消息響應類)-{CWinThread(線程類)-CWinApp(Window 應用程序類)CDocument(文檔類)CWnd(窗體類)-[CFrameWnd(框架類)CView(視圖類)]}CObject 類由于MFC 中大部分類是從CObject 類繼承而來的,CObject 類描述了幾乎所有的MFC 類的一些公共特性,CObject 類為程序員提供了對象診斷、運行時類型識別和序列化等功能。 CCmdTarget 類由CObject 類直接派生而來,它負責將消息發送到能夠響應這些消息的對象。 它是所有能進行消息映射的MFC 類的基類。 CWinApp 類在任何MFC 應用程序中有且僅有一個CWinApp 派生類的對象,它代表了程序中運行的主線程,也代表了應用程序本身。 CWinApp 類取代了WinMain()主函數在SDK 應用程序中的地位。 傳統SDK 應用程序 WinMain()函數完成的工作。 現在由類CWinApp 的InitApplication(), InitInstance()和Run()三個成員函數承擔。 CWnd 類由CCmdTarget 類直接派生而來,該類及其派生類的實例是一個窗口。 CWnd 類代表了MFC 中最基本的GUI 對象,它是一個功能最完善、成員函數最多的MFC 類。 CFrameWnd 類是CWnd 類的派生類,主要用來掌管一個窗口,它取代了SDK 應用程序中窗口函數 WndProc()的地位。 CFrameWnd 類的對象是一個框架窗口,包括邊框、標題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。 CDocument 類在應用程序中作為用戶文檔類的基類,它代表了用戶存儲或打開的一個文件。 CView 類是 MFC 中一個很基本的類,它作為其它MFC 視圖類和用戶視圖派生類的基類。 從 API 編程到MFC 編程的過渡:WinMain(){初始化WNDCLASS 注冊窗體結構創建窗口-應用程序類CWinApp 顯示窗口消息循環}WndProc(){switch(…){case:…}- 框架窗口類CFrameWnd}MFC Object 和Windows Object 的對應關系:描述 Windows 句柄MFC Object 窗口HWND CWnd 設備上下文HDC CDC 菜單HMENU CMenu 筆HPEN CPen 刷子HBRUSH CBrush 字體HFONT CFont 位圖HBITMAP CBitmap 套接字SOCKET CSocket 三、手工創建一個MFC 應用程序:注意:創建 MFC 程序,要創建一個Win32 空項目,并要選擇項目屬性中的在共享DLL 文件中使用MFC,然后新建我們的文件例子:在hello.h頭文件中添寫如下代碼: class CMyApp:public CWinApp{public:virtual BOOL InitInstance();// 虛函數};class CMainWindow:public CFrameWnd{public:CMainWindow(); protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP();//聲明消息映射};在源文件中添寫如下代碼:#include afxwin.h# myApp;BOOL CMyApp: InitInstance(){m_pMainWnd=new CMainWindow;m_pMainWnd- ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;}BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)ON_WM_PAINT()END_MESSA GE_MAP()//消息映射CMainWindow:CMainWindow()//構造函數初始化 {Create(NULL,我的第一個MFC 應用程序);//創建窗體}void CMainWindow: OnPaint(){CPaintDC dc(this);CRect rect;GetClientRect(&rect); (Hello MFC,- 1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);}CWinApp 是應用程序類,在MFC 應用程序中必須從這個類派生出一個類,該派生類是MFC 應用程序的入口必須定義這個派生類的對象,并且只能有一個這個對象代表整個應用程序。 成員函數:InitInstance()功能:初始化應用程序實例和窗口實例,虛函數 CWinApp:InitInstance 必須在派生類中重寫。 在InitInstance 函數中,編寫初始化代碼,如:創建一個窗口顯示一個窗口CFrameWnd 類作用:為應用程序提供一個窗口,同時實現消息處理功能。 成員函數:Create()功能:創建窗體, 將之賦于CFrameWnd 對象上。 BOOL Create(窗口類型,窗口標題,顯示風格,顯示區域,符窗口句柄,菜單,擴展顯示風格,上下文對象)共有8 個參數,前兩個必須給出,后6 個可以默認。 MFC 應用程序的核心就是基于CWinApp 類的應用程序對象,CWinApp 提供了消息循環來檢索消息并將消息調度給應用程序的窗口.我們在編寫MFC 應用程序時,要包含afxwin.h,一個MFC 應用程序可以有且僅有一個應用程序對象,對象必須聲明為在全局范圍內有效(也就是全局對象), 以便它在程序開始時即在內存中被實例化我們的Hello MFC 的應用程序類被命名為CMyApp,它在 中用如下語句進行了實例化:CMyApp myApp; CMyApp 的類聲明在hello.h 中代碼如下:class CMyApp:public CWinApp{public:virtual BOOL InitInstance();};CMyApp 沒有聲明任何的數據成員,只是重寫了一個從CWinApp 類中繼承來的函數,在應用程序的生存期內InitInstance 的調用比較早,是在應用程序開始運行以后而窗口創建之前,除非InitIstance 創建一個窗口,否則應用程序是不會有窗口,這正是為什么即使最小的MFC 應用程序也必須從CWinApp 派生出一個類并重寫CWinApp: InitIstance 的原因InitInstance 函數:CWinApp:InitInstance 是一個虛函數,其默認操作僅包含一條語句:return TRUE;InitInstance 是用來執行程序每次開始時都需要進行的初始化工作最好的地方在 中,CMyApp 的 InitInstance 通過實例化hello 的CMainWindow 類來創建hello 窗口,語句: m_pMainWnd=new CMainWindow;構造了一個CMainWindow 對象指針,并將其地址復制到了應用程序對象的m_pMainWnd 數據成員中,窗口創建以后,InitInstance 就會通過CMainWindow 指針調用ShowWindow 和UpdateWindow 函數顯示它: m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow(); ShowWindow 和UpdateWindow 是所有窗口對象共用的CWnd 成員函數其中包括 CFrameWnd 類的對象,CMainWindow 就是從CFrameWnd 派生出來的.要從MFC 程序調用一個常規的Windows API 函數,需要在函數名稱前添加一個全局運算符:例如::UpdateWindow();通過生成窗口對象并調用其Create 函數,MFC 應用程序可以創建一個窗口,在CMyApp:InitInstance 中,hello 創建了一個 CMainWindow 對象,CMainWindow 的構造函數生成在屏幕上看到的窗口: Create(NULL,我的第一個MFC 應用程序);CPaintDC dc(this);MFC 的 CPaintDC 類是從MFC 的CDC 類派生的,CDC 類封裝了Windows 設備環境,以及包含了繪制到屏幕、打印機和其他設備的幾十個成員函數在MFC 中如何處理消息呢?在SDK 中我們利用的是消息循環和窗口過程函數對消息進行消息處理.在 MFC 中我們用的是消息映射機制.下面是將消息映射添加到一個類中需要做的全部工作.1 通過將DECLARE_MESSAGE_MAP 語句添加到類聲明中,聲明消息映射.2 通過放置標識消息的宏來執行消息映射,相應的類將在對BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 的調用之間處理消息3 添加成員函數來處理消息1、構造 CWinApp 派生類的對象2、系統調用WinMain()3、WinMain 調用InitInstance, 在該函數中創建CFrameWnd 派生類對象,調用Create 函數創建窗口、調用 ShowWindow 函數顯示窗口。 4、之后內部機制調用Run,接受用戶的消息,并將消息導向默認的處理函數。 當接收到WM_QUIT 消息時,Run 內部調用 ExitInstance,退出程序。 MFC 采用消息映射(Message Map)機制取代C/C++語言中的switch-case 結構來處理消息。 消息映射:在MFC 中把消息處理函數和它所要處理的特定的消息連接起來的一種機制。 它通過宏來實現消息到成員函數的映射,而且這些函數不必是虛擬的成員函數,這樣不需要為消息映射函數生成一個很大的虛擬函數表(V 表),節省內存。 MFC 消息映射機制包括一組消息映射宏。 一條消息映射宏把一個Windows 消息和其消息處理函數聯結起來。 MFC 應用程序框架提供了消息映射功能。 在類的實現源文件中用 BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏來定義消息映射。 在類定義的結尾用DECLARE_MESSAGE_MAP()宏來聲明使用消息映射。
內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://m.sycxjdsbhs.com/article/e2c3fd0d53f95db33039.html,復制請保留版權鏈接!