文章編號:10617時間:2024-09-28人氣:
正好我寫個一個函數(shù)封裝在DLL里了,代碼是這樣的:
C語言是一種計算機程序設(shè)計語言。 它既有高級語言的特點,又具有匯編語言的特點。 它可以作為系統(tǒng)設(shè)計語言,編寫工作系統(tǒng)應(yīng)用程序,也可以作為應(yīng)用程序設(shè)計語言,編寫不依賴計算機硬件的應(yīng)用程序。 因此,它的應(yīng)用范圍廣泛。 C語言對操作系統(tǒng)和系統(tǒng)使用程序以及需要對硬件進行操作的場合,用C語言明顯優(yōu)于其它解釋型高級語言,有一些大型應(yīng)用軟件也是用C語言編寫的。 C語言具有繪圖能力強,可移植性,并具備很強的數(shù)據(jù)處理能力,因此適于編寫系統(tǒng)軟件,三維,二維圖形和動畫。 它是數(shù)值計算的高級語言。 常用的C語言IDE(集成開發(fā)環(huán)境)有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語言的缺點主要是表現(xiàn)在數(shù)據(jù)的封裝性上,這一點使得C在數(shù)據(jù)的安全性上做的有很大缺陷,這也是C和C++的一大區(qū)別。 2. C語言的語法限制不太嚴(yán)格,對變量的類型約束不嚴(yán)格,影響程序的安全性,對數(shù)組下標(biāo)越界不作檢查等。 從應(yīng)用的角度,C語言比其他高級語言較難掌握。 [C語言指針]指針就是C語言的一大特色,可以說C語言優(yōu)于其它高級語言的一個重要原因就是因為它有指針操作可以直接進行靠近硬件的操作,但是C的指針操作也給它帶來了很多不安全的因素。 C++在這方面做了很好的改進,在保留了指針操作的同時又增強了安全性。 Java取消了指針操作,提高了安全性。 C源程序的結(jié)構(gòu)特點1.一個C語言源程序可以由一個或多個源文件組成。 2.每個源文件可由一個或多個函數(shù)組成。 3.一個源程序不論由多少個文件組成,都有一個且只能有一個main函數(shù),即主函數(shù)。 4.源程序中可以有預(yù)處理命令(include 命令僅為其中的一種),預(yù)處理命令通常應(yīng)放在源文件或源程序的最前面。 5.每一個說明,每一個語句都必須以分號結(jié)尾。 但預(yù)處理命令,函數(shù)頭和花括號“}”之后不能加分號。 6.標(biāo)識符,關(guān)鍵字之間必須至少加一個空格以示間隔。 若已有明顯的間隔符,也可不再加空格來間隔。 學(xué)習(xí)C語言在初學(xué)C語言時,可能會遇到有些問題理解不透,或者表達(dá)方式與以往數(shù)學(xué)學(xué)習(xí)中不同(如運算符等),這就要求不氣餒,不明白的地方多問多想,鼓足勇氣進行學(xué)習(xí),待學(xué)完后面的章節(jié)知識,前面的問題也就迎刃而解了,這一方面我感覺是我們同學(xué)最欠缺,大多學(xué)不好的就是因為一開始遇到困難就放棄,曾經(jīng)和好多同學(xué)談他的問題,回答是聽不懂、不想聽、放棄這樣三個過程,我反問,這節(jié)課你聽過課嗎?回答又是沒有,根本就沒聽過課,怎么說自己聽不懂呢?相應(yīng)的根本就沒學(xué)習(xí),又談何學(xué)的好?學(xué)習(xí)C語言始終要記住“曙光在前頭”和“千金難買回頭看”,“千金難買回頭看”是學(xué)習(xí)知識的重要方法,就是說,學(xué)習(xí)后面的知識,不要忘了回頭弄清遺留下的問題和加深理解前面的知識,這是我們學(xué)生最不易做到的,然而卻又是最重要的。 學(xué)習(xí)C語言就是要經(jīng)過幾個反復(fù),才能前后貫穿,積累應(yīng)該掌握的C知識。 那么,我們?nèi)绾螌W(xué)好《C程序設(shè)計》呢?一.學(xué)好C語言的運算符和運算順序這是學(xué)好《C程序設(shè)計》的基礎(chǔ),C語言的運算非常靈活,功能十分豐富,運算種類遠(yuǎn)多于其它程序設(shè)計語言。 在表達(dá)式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達(dá)式更為簡單,但初學(xué)者往往會覺的這種表達(dá)式難讀,關(guān)鍵原因就是對運算符和運算順序理解不透不全。 當(dāng)多種不同運算組成一個運算表達(dá)式,即一個運算式中出現(xiàn)多種運算符時,運算的優(yōu)先順序和結(jié)合規(guī)則顯得十分重要。 在學(xué)習(xí)中,只要我們對此合理進行分類,找出它們與我們在數(shù)學(xué)中所學(xué)到運算之間的不同點之后,記住這些運算也就不困難了,有些運算符在理解后更會牢記心中,將來用起來得心應(yīng)手,而有些可暫時放棄不記,等用到時再記不遲。 先要明確運算符按優(yōu)先級不同分類,《C程序設(shè)計》運算符可分為15種優(yōu)先級,從高到低,優(yōu)先級為1 ~ 15,除第2、3級和第14級為從右至左結(jié)合外,其它都是從左至右結(jié)合,它決定同級運算符的運算順序.二.學(xué)好C語言的四種程序結(jié)構(gòu)(1)順序結(jié)構(gòu)順序結(jié)構(gòu)的程序設(shè)計是最簡單的,只要按照解決問題的順序?qū)懗鱿鄳?yīng)的語句就行,它的執(zhí)行順序是自上而下,依次執(zhí)行。 例如;a = 3,b = 5,現(xiàn)交換a,b的值,這個問題就好像交換兩個杯子水,這當(dāng)然要用到第三個杯子,假如第三個杯子是c,那么正確的程序為: c = a; a = b; b = c; 執(zhí)行結(jié)果是a = 5,b = c = 3如果改變其順序,寫成:a = b; c = a; b = c; 則執(zhí)行結(jié)果就變成a = b = c = 5,不能達(dá)到預(yù)期的目的,初學(xué)者最容易犯這種錯誤。 順序結(jié)構(gòu)可以獨立使用構(gòu)成一個簡單的完整程序,常見的輸入、計算,輸出三步曲的程序就是順序結(jié)構(gòu),例如計算圓的面積,其程序的語句順序就是輸入圓的半徑 r,計算s = 3.*r*r,輸出圓的面積s。 不過大多數(shù)情況下順序結(jié)構(gòu)都是作為程序的一部分,與其它結(jié)構(gòu)一起構(gòu)成一個復(fù)雜的程序,例如分支結(jié)構(gòu)中的復(fù)合語句、循環(huán)結(jié)構(gòu)中的循環(huán)體等。 (2) 分支結(jié)構(gòu)順序結(jié)構(gòu)的程序雖然能解決計算、輸出等問題,但不能做判斷再選擇。 對于要先做判斷再選擇的問題就要使用分支結(jié)構(gòu)。 分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序。 分支結(jié)構(gòu)的程序設(shè)計方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句。 分支結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計算,設(shè)計這類程序時往往都要先繪制其程序流程圖,然后根據(jù)程序流程寫出源程序,這樣做把程序設(shè)計分析與語言分開,使得問題簡單化,易于理解。 程序流程圖是根據(jù)解題分析所繪制的程序執(zhí)行流程圖。 學(xué)習(xí)分支結(jié)構(gòu)不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執(zhí)行的功能,嵌套結(jié)構(gòu)也就不難了。 嵌套只不過是分支中又包括分支語句而已,不是新知識,只要對雙分支的理解清楚,分支嵌套是不難的。 下面我介紹幾種基本的分支結(jié)構(gòu)。 ①if(條件){分支體}這種分支結(jié)構(gòu)中的分支體可以是一條語句,此時“”可以省略,也可以是多條語句即復(fù)合語句。 它有兩條分支路徑可選,一是當(dāng)條件為真,執(zhí)行分支體,否則跳過分支體,這時分支體就不會執(zhí)行。 如:要計算x的絕對值,根據(jù)絕對值定義,我們知道,當(dāng)x>=0時,其絕對值不變,而x<0時其絕對值是為x的反號,因此程序段為:if(x<0) x=-x;②if(條件)else這是典型的分支結(jié)構(gòu),如果條件成立,執(zhí)行分支1,否則執(zhí)行分支2,分支1和分支2都可以是1條或若干條語句構(gòu)成。 如:求ax^2+bx+c=0的根分析:因為當(dāng)b^2-4ac>=0時,方程有兩個實根,否則(b^2-4ac<0)有兩個共軛復(fù)根。 其程序段如下: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重嵌套后,語句結(jié)構(gòu)變得非常復(fù)雜,對于程序的閱讀和理解都極為不便,建議嵌套在3重以內(nèi),超過3重可以用下面的語句。 ④switch開關(guān)語句:該語句也是多分支選擇語句,到底執(zhí)行哪一塊,取決于開關(guān)設(shè)置,也就是表達(dá)式的值與常量表達(dá)式相匹配的那一路,它不同if… else 語句,它的所有分支都是并列的,程序執(zhí)行時,由第一分支開始查找,如果相匹配,執(zhí)行其后的塊,接著執(zhí)行第2分支,第3分支……的塊,直到遇到break語句;如果不匹配,查找下一個分支是否匹配。 這個語句在應(yīng)用時要特別注意開關(guān)條件的合理設(shè)置以及break語句的合理應(yīng)用。 (3)循環(huán)結(jié)構(gòu):循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書寫的工作量,用來描述重復(fù)執(zhí)行某段算法的問題,這是程序設(shè)計中最能發(fā)揮計算機特長的程序結(jié)構(gòu),C語言中提供四種循環(huán),即 goto循環(huán)、while循環(huán)、do –while循環(huán)和for循環(huán)。 四種循環(huán)可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環(huán),因為強制改變程序的順序經(jīng)常會給程序的運行帶來不可預(yù)料的錯誤,在學(xué)習(xí)中我們主要學(xué)習(xí)while、do…while、for三種循環(huán)。 常用的三種循環(huán)結(jié)構(gòu)學(xué)習(xí)的重點在于弄清它們相同與不同之處,以便在不同場合下使用,這就要清楚三種循環(huán)的格式和執(zhí)行順序,將每種循環(huán)的流程圖理解透徹后就會明白如何替換使用,如把while循環(huán)的例題,用for語句重新編寫一個程序,這樣能更好地理解它們的作用。 特別要注意在循環(huán)體內(nèi)應(yīng)包含趨于結(jié)束的語句(即循環(huán)變量值的改變),否則就可能成了一個死循環(huán),這是初學(xué)者的一個常見錯誤。 在學(xué)完這三個循環(huán)后,應(yīng)明確它們的異同點:用while和do…while循環(huán)時,循環(huán)變量的初始化的操作應(yīng)在循環(huán)體之前,而for循環(huán)一般在語句1中進行的;while 循環(huán)和for循環(huán)都是先判斷表達(dá)式,后執(zhí)行循環(huán)體,而do…while循環(huán)是先執(zhí)行循環(huán)體后判斷表達(dá)式,也就是說do…while的循環(huán)體最少被執(zhí)行一次,而while 循環(huán)和for就可能一次都不執(zhí)行。 另外還要注意的是這三種循環(huán)都可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán),而goto語句與 if構(gòu)成的循環(huán),是不能用break和 continue語句進行控制的。 順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)并不彼此孤立的,在循環(huán)中可以有分支、順序結(jié)構(gòu),分支中也可以有循環(huán)、順序結(jié)構(gòu),其實不管哪種結(jié)構(gòu),我們均可廣義的把它們看成一個語句。 在實際編程過程中常將這三種結(jié)構(gòu)相互結(jié)合以實現(xiàn)各種算法,設(shè)計出相應(yīng)程序,但是要編程的問題較大,編寫出的程序就往往很長、結(jié)構(gòu)重復(fù)多,造成可讀性差,難以理解,解決這個問題的方法是將C程序設(shè)計成模塊化結(jié)構(gòu)。 (4)模塊化程序結(jié)構(gòu)C語言的模塊化程序結(jié)構(gòu)用函數(shù)來實現(xiàn),即將復(fù)雜的C程序分為若干模塊,每個模塊都編寫成一個C函數(shù),然后通過主函數(shù)調(diào)用函數(shù)及函數(shù)調(diào)用函數(shù)來實現(xiàn)一大型問題的C程序編寫,因此常說:C程序=主函數(shù)+子函數(shù)。 因此,對函數(shù)的定義、調(diào)用、值的返回等中要尤其注重理解和應(yīng)用,并通過上機調(diào)試加以鞏固。 三.掌握一些簡單的算法編程其實一大部分工作就是分析問題,找到解決問題的方法,再以相應(yīng)的編程語言寫出代碼。 這就要求掌握算法,根據(jù)我們的《C程序設(shè)計》教學(xué)大綱中,只要求我們掌握一些簡單的算法,在掌握這些基本算法后,要完成對問題的分析就容易了。 如兩個數(shù)的交換、三個數(shù)的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些算法的內(nèi)在含義結(jié)語:當(dāng)我們把握好上述幾方面后,只要同學(xué)們能克服畏難、厭學(xué)、上課能專心聽講,做好練習(xí)與上機調(diào)試,其實C語言并不難學(xué)C源程序的關(guān)鍵字---------------------------------------------------------------------------------------所謂關(guān)鍵字就是已被C語言本身使用, 不能作其它用途使用的字。 例如關(guān)鍵字不能用作變量名、函數(shù)名等由ANSI標(biāo)準(zhǔn)定義的C語言關(guān)鍵字共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根據(jù)關(guān)鍵字的作用,可分其為數(shù)據(jù)類型關(guān)鍵字、控制語句關(guān)鍵字、存儲類型關(guān)鍵字和其它關(guān)鍵字四類。 1 數(shù)據(jù)類型關(guān)鍵字(12個):(1) char :聲明字符型變量或函數(shù)(2) double :聲明雙精度變量或函數(shù)(3) enum :聲明枚舉類型(4) float:聲明浮點型變量或函數(shù)(5) int: 聲明整型變量或函數(shù)(6) long :聲明長整型變量或函數(shù)(7) short :聲明短整型變量或函數(shù)(8) signed:聲明有符號類型變量或函數(shù)(9) struct:聲明結(jié)構(gòu)體變量或函數(shù)(10) union:聲明聯(lián)合數(shù)據(jù)類型(11) unsigned:聲明無符號類型變量或函數(shù)(12) void :聲明函數(shù)無返回值或無參數(shù),聲明無類型指針(基本上就這三個作用)(2)控制語句關(guān)鍵字(12個):A循環(huán)語句(1) for:一種循環(huán)語句(可意會不可言傳)(2) do :循環(huán)語句的循環(huán)體(3) while :循環(huán)語句的循環(huán)條件(4) break:跳出當(dāng)前循環(huán)(5) continue:結(jié)束當(dāng)前循環(huán),開始下一輪循環(huán)B條件語句(1)if: 條件語句(2)else :條件語句否定分支(與 if 連用)(3)goto:無條件跳轉(zhuǎn)語句C開關(guān)語句(1)switch :用于開關(guān)語句(2)case:開關(guān)語句分支(3)default:開關(guān)語句中的“其他”分支Dreturn :子程序返回語句(可以帶參數(shù),也看不帶參數(shù))3 存儲類型關(guān)鍵字(4個)(1)auto :聲明自動變量 一般不使用(2)extern:聲明變量是在其他文件正聲明(也可以看做是引用變量)(3)register:聲明積存器變量(4)static :聲明靜態(tài)變量4 其它關(guān)鍵字(4個):(1)const :聲明只讀變量(2)sizeof:計算數(shù)據(jù)類型長度(3)typedef:用以給數(shù)據(jù)類型取別名(當(dāng)然還有其他作用(4)volatile:說明變量在程序執(zhí)行中可被隱含地改變
Electron打包一開始時出現(xiàn)error,去解決真的好累,報錯一個接一個,而且我這和網(wǎng)上一些bug解決方案還有點不同,不能照抄別人的作業(yè)。
本次我使用的electron打包工具是electron-builder(以后就換其他的試試)
當(dāng)然也是我學(xué)藝不精了?
打包正常流程在說自己錯誤經(jīng)歷之前,先走一遍可以正確打包的流程吧
為了讓流程看起來干凈些,創(chuàng)建一個獨立的electron項目
使用yarninit命令創(chuàng)建項目,注意需要寫明author作者和description描述,后續(xù)打包時如果沒有會出現(xiàn)報錯
使用yarnaddelectron-D和yarnaddelectron-builder命令安裝需要的程序包。安裝完程序包后,在中添加運行命令和打包命令
scripts:{start:electron.,electron:build:electron-builder--win--x64},如果yarnaddelectron-D出錯,可以看看是不是和我這篇文章中的錯誤相似:《yarnaddelectron安裝失敗》?
我在之前使用vue和vuecli4創(chuàng)建了一款簡易的小說閱讀器,現(xiàn)在將其使用yarnbuild命令打包出來,生成了一份dist
里面的頁面可以直接在瀏覽器中打開,就能夠直接看到效果。不過現(xiàn)在先將此文件夾改個名字在放入electron項目中,不然的話等等會和打包出來文件夾名字重復(fù)
在同級目錄下創(chuàng)建一個入口文件,該文件是electron所必須的程序進入文件
可以像下面這樣寫,這是一種較為簡單的入口文件寫法:
constelectron=require(electron);//控制應(yīng)用生命周期的模塊。const{app}=electron;//創(chuàng)建原生瀏覽器窗口的模塊。const{BrowserWindow}=electron;letmainWindow;functioncreateWindow(){//創(chuàng)建瀏覽器窗口。mainWindow=newBrowserWindow({width:480,height:670});//加載應(yīng)用的。(`file://${__dirname}/common/`);//啟用開發(fā)工具//();}//Electron會在初始化后并準(zhǔn)備(ready,createWindow);//當(dāng)全部窗口關(guān)閉時退出。(window-all-closed,()=>{//否則絕大部分應(yīng)用及其菜單欄會保持激活。if(!==darwin){();}});(activate,()=>{//絕大部分應(yīng)用會重新創(chuàng)建一個窗口。if(mainWindow===null){createWindow();}});現(xiàn)在就可以嘗試使用yarnstart命令運行electron了,如果不出意外的話,會成功跳出小說閱讀器界面
此時小說閱讀器并沒有打包
接下來,使用yarnelectron:build命令進行打包,一路順利,沒有報錯,就能看到生成了一個dist文件夾
PS:在編寫build去對打包進行配置,我一開始以為這是必須的,后來發(fā)現(xiàn)即使不寫,基礎(chǔ)打包也可以成功。
在此文件夾中,如果使用打開文件,那么將會進行安裝程序,并且桌面會出現(xiàn)程序圖標(biāo),點擊即可打開項目。 此時已經(jīng)是標(biāo)準(zhǔn)的桌面應(yīng)用的了。
當(dāng)然如果不想安裝,只是想看看打包后的結(jié)果,可以打開內(nèi)部的win-unpacked/,這樣能跳過安裝直接啟動程序。
到目前為止,一個正確無誤的打包流程就走完了!
項目打包遇到各種問題那么接下來,就說說我真正的錯誤之路吧:
省略一些中間的步驟,直到上面所說的第四步為止,我一切都還是順利的。
那么問題就出在第五步上,yarnelectron:build
問題1運行此命令時,一開始還是挺順利的,但是很快遇到了第一個問題:
?Get當(dāng)遇到打包報錯,肯定是哪里不會搜哪里了,發(fā)現(xiàn)原因還是和連接有關(guān),根據(jù)網(wǎng)上找到的參考文章,可以通過先將下載下來,然后放到C:\Users\Administrator\AppData\Local\electron\Cache文件夾下。
參考文章:
同時分享一下下載包地址:
但是很尷尬的是,我Local下這并沒有electron文件夾。那么能否自己創(chuàng)建一個然后放入呢?
答案:不行,自己創(chuàng)建了一個electron也沒有用,后來想是不是因為我沒有全局安裝electron,可以把這放入項目的node_modules里,不過還是失敗了,只能另辟蹊徑,在中進行配置。(后面的nsis和winCodeSign也同樣如此)
其實這可能和這臺電腦一開始的配置有關(guān)系,因為后來我使用自己筆記本,發(fā)現(xiàn)Local下是存在electron和electron-builder兩個文件夾的。
在下載文件到本地失敗后,我采用在中進行設(shè)置electron_mirror路徑的方式。
的打開路徑在C:\Users\用戶文件夾下,同時也可以使用cmd命令直接打開此文件:npmconfigedit
然后通過添加一句話:electron_mirror=這樣包就能夠成功安裝了
問題2成功解決了的問題之后,我又遇到了新的問題:
?Get這兩種同樣也是在中進行配置的,添加的是electron-builder-binaries_mirror的路徑:
electron-builder-binaries_mirror=其實一開始我添加的是路徑,但是發(fā)現(xiàn)會出現(xiàn)報錯,沒有這個地址,然后經(jīng)過實際下載才發(fā)現(xiàn)nsis-3.0.4.1.7z的地址是,所以對electron-builder-binaries_mirror進行了重新設(shè)置,然后成功了
現(xiàn)在讓我重新進行打包,發(fā)現(xiàn)到此,沒有出現(xiàn)任何報錯,并且打包成功了
我遇到的問題終于解決了,和網(wǎng)上找到的直接下載包到本地方式不同,解決方案是修改了下載源。最后我發(fā)現(xiàn)成功一次之后,把中的修改下載源注釋掉后續(xù)打包也可以成功了?
總結(jié)這個打包問題當(dāng)時改的我心累,因為我下載到本地也還是不成功,最后修修改改,通過修改成功。 期間甚至想放棄electron-builder這種方式打包,中間我去用了一下ElectronForge。 發(fā)現(xiàn)這個居然輸入命令要在gitbash里,并且會對你的重寫,這還是算了。
現(xiàn)在electron打包應(yīng)該還有一種electron-package的方式,不過我沒有去嘗試,可能也是當(dāng)時對builder已經(jīng)上頭了,一心要解決掉這個報錯。
遇到報錯,努力一把,總會攻克的。(當(dāng)然這個問題困了你一天以上,建議找找其他替代方案)
原文:
cmake vs qmakeqmake 是為 Qt 量身打造的,使用起來非常方便cmake 使用上不如qmake簡單直接,但復(fù)雜換來的是強大的功能內(nèi)置的 out-of source 構(gòu)建。
(目前QtCreator為qmake也默認(rèn)啟用了該功能,稱:shadow build)為各種平臺和場景提供條件編譯可處理多個可執(zhí)行文件情況,和很好配合 QtTest 工作如何選擇?Using CMake to Build Qt Projects 一文中說:對簡單的Qt工程,采用 qmake對復(fù)雜度超過 qmake 處理能力的,采用 cmake盡管如此,如果簡單Qt的工程都不知道怎么用 cmake 構(gòu)建,復(fù)雜的工程,就更不知道如何使用 cmake 了。
還是從簡單的學(xué)起吧簡單的 Qt 程序#include
如何看MFC 程序代碼 看下面內(nèi)容之前,建議你學(xué)學(xué)《深入淺出MFC》,這本書強烈推薦! 現(xiàn)在只是做個了解。 不妨做個知識備份! 在MFC 程序中,我們并不經(jīng)常直接調(diào)用Windows API,而是從MFC 類創(chuàng)建對象并調(diào)用屬于這些對象的成員函數(shù).也就是說MFC 封裝了Windows API 你說你喜歡C++而MFC 換一種說法就是一個用C++寫的一個函數(shù)庫然后你來調(diào)用只不過這個類不是你寫的MFC 提供數(shù)百個類,最重要的、也是編寫任何VC++應(yīng)用程序都必不可少的兩個類CWinApp 和CFrameWnd,這兩個類是編寫復(fù)雜龐大應(yīng)用程序的基石。 1 封裝特性:構(gòu)成MFC 框架的是MFC 類庫而MFC 類庫又是C++的一個類庫。 這些類封裝WIN32 應(yīng)用程序編程接口,OLE(Object Link Embed 對象鏈接嵌入) 特性,ODBC 和DAO 數(shù)據(jù)訪問的功能。 2 繼承特性:MFC 抽象出了眾多類的共同特性,并設(shè)計出一些基類作為實現(xiàn)其他類的基礎(chǔ),這些類中最重要的類是 CObject 類和CCmdTarget 類,程序員可以從適當(dāng)?shù)腗FC 類中派生出自己的類,實現(xiàn)特定的功能達(dá)到編程的目的。 3 虛擬和消息映射:MFC 是以C++為基礎(chǔ),當(dāng)然支持虛函數(shù),但作為一個編程框架必須要解決的是效率問題:如果MFC 僅僅通過虛函數(shù)來支持動態(tài)約束必然會產(chǎn)生大量的虛函數(shù)表這樣編程框架過于臃腫而且消耗更多的內(nèi)存。 但是MFC 建立了消息映射機制這樣降低了內(nèi)存的使用卻大大提高了效率消息映射是一個將消息和成員函數(shù)相互關(guān)聯(lián)的表,當(dāng)應(yīng)用程序的框架窗口接收到一個消息時,MFC 將搜索該窗口的消息映射,如果存在一個處理消息的處理程序,那么就調(diào)用該處理程序.它通過宏來實現(xiàn)消息到成員函數(shù)的映射,而且這些函數(shù)不必是虛擬的成員函數(shù),這樣不需要為消息映射函數(shù)生成一個很大的虛擬函數(shù)表(V 表),節(jié)省內(nèi)存。 MFC 消息映射機制:將消息與消息處理函數(shù)聯(lián)系起來,形成一一對應(yīng)的機制。 消息映射宏聲明:DECLARE_MESSAGE_MAP 定義:BEGIN_MESSAGE_MAP ON_COMMAND ON_CONTROL ON_MESSAGE END_MESSAGE_MAP MFC 主要組成部分:類、宏和全局函數(shù)。 類是MFC 中最主要的內(nèi)容。 MFC 類是以層次結(jié)構(gòu)方式組織起來的。 MFC 中的類分成兩部分,除了一些輔助類,大多數(shù)的MFC 類是直接或間接從根類CObject 派生而來。 MFC 宏主要功能:消息映射、運行時對象類型服務(wù)、診斷服務(wù)、異常處理。 MFC 約定:全局函數(shù)以Afx為前綴,全局變量以afx為前綴MFC 類的層次關(guān)系CObject 項目類)-CCmdTarget(消息響應(yīng)類)-{CWinThread(線程類)-CWinApp(Window 應(yīng)用程序類)CDocument(文檔類)CWnd(窗體類)-[CFrameWnd(框架類)CView(視圖類)]}CObject 類由于MFC 中大部分類是從CObject 類繼承而來的,CObject 類描述了幾乎所有的MFC 類的一些公共特性,CObject 類為程序員提供了對象診斷、運行時類型識別和序列化等功能。 CCmdTarget 類由CObject 類直接派生而來,它負(fù)責(zé)將消息發(fā)送到能夠響應(yīng)這些消息的對象。 它是所有能進行消息映射的MFC 類的基類。 CWinApp 類在任何MFC 應(yīng)用程序中有且僅有一個CWinApp 派生類的對象,它代表了程序中運行的主線程,也代表了應(yīng)用程序本身。 CWinApp 類取代了WinMain()主函數(shù)在SDK 應(yīng)用程序中的地位。 傳統(tǒng)SDK 應(yīng)用程序 WinMain()函數(shù)完成的工作。 現(xiàn)在由類CWinApp 的InitApplication(), InitInstance()和Run()三個成員函數(shù)承擔(dān)。 CWnd 類由CCmdTarget 類直接派生而來,該類及其派生類的實例是一個窗口。 CWnd 類代表了MFC 中最基本的GUI 對象,它是一個功能最完善、成員函數(shù)最多的MFC 類。 CFrameWnd 類是CWnd 類的派生類,主要用來掌管一個窗口,它取代了SDK 應(yīng)用程序中窗口函數(shù) WndProc()的地位。 CFrameWnd 類的對象是一個框架窗口,包括邊框、標(biāo)題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。 CDocument 類在應(yīng)用程序中作為用戶文檔類的基類,它代表了用戶存儲或打開的一個文件。 CView 類是 MFC 中一個很基本的類,它作為其它MFC 視圖類和用戶視圖派生類的基類。 從 API 編程到MFC 編程的過渡:WinMain(){初始化WNDCLASS 注冊窗體結(jié)構(gòu)創(chuàng)建窗口-應(yīng)用程序類CWinApp 顯示窗口消息循環(huán)}WndProc(){switch(…){case:…}- 框架窗口類CFrameWnd}MFC Object 和Windows Object 的對應(yīng)關(guān)系:描述 Windows 句柄MFC Object 窗口HWND CWnd 設(shè)備上下文HDC CDC 菜單HMENU CMenu 筆HPEN CPen 刷子HBRUSH CBrush 字體HFONT CFont 位圖HBITMAP CBitmap 套接字SOCKET CSocket 三、手工創(chuàng)建一個MFC 應(yīng)用程序:注意:創(chuàng)建 MFC 程序,要創(chuàng)建一個Win32 空項目,并要選擇項目屬性中的在共享DLL 文件中使用MFC,然后新建我們的文件例子:在hello.h頭文件中添寫如下代碼: class CMyApp:public CWinApp{public:virtual BOOL InitInstance();// 虛函數(shù)};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()//構(gòu)造函數(shù)初始化 {Create(NULL,我的第一個MFC 應(yīng)用程序);//創(chuàng)建窗體}void CMainWindow: OnPaint(){CPaintDC dc(this);CRect rect;GetClientRect(&rect); (Hello MFC,- 1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);}CWinApp 是應(yīng)用程序類,在MFC 應(yīng)用程序中必須從這個類派生出一個類,該派生類是MFC 應(yīng)用程序的入口必須定義這個派生類的對象,并且只能有一個這個對象代表整個應(yīng)用程序。 成員函數(shù):InitInstance()功能:初始化應(yīng)用程序?qū)嵗痛翱趯嵗摵瘮?shù) CWinApp:InitInstance 必須在派生類中重寫。 在InitInstance 函數(shù)中,編寫初始化代碼,如:創(chuàng)建一個窗口顯示一個窗口CFrameWnd 類作用:為應(yīng)用程序提供一個窗口,同時實現(xiàn)消息處理功能。 成員函數(shù):Create()功能:創(chuàng)建窗體, 將之賦于CFrameWnd 對象上。 BOOL Create(窗口類型,窗口標(biāo)題,顯示風(fēng)格,顯示區(qū)域,符窗口句柄,菜單,擴展顯示風(fēng)格,上下文對象)共有8 個參數(shù),前兩個必須給出,后6 個可以默認(rèn)。 MFC 應(yīng)用程序的核心就是基于CWinApp 類的應(yīng)用程序?qū)ο?CWinApp 提供了消息循環(huán)來檢索消息并將消息調(diào)度給應(yīng)用程序的窗口.我們在編寫MFC 應(yīng)用程序時,要包含afxwin.h,一個MFC 應(yīng)用程序可以有且僅有一個應(yīng)用程序?qū)ο?對象必須聲明為在全局范圍內(nèi)有效(也就是全局對象), 以便它在程序開始時即在內(nèi)存中被實例化我們的Hello MFC 的應(yīng)用程序類被命名為CMyApp,它在 中用如下語句進行了實例化:CMyApp myApp; CMyApp 的類聲明在hello.h 中代碼如下:class CMyApp:public CWinApp{public:virtual BOOL InitInstance();};CMyApp 沒有聲明任何的數(shù)據(jù)成員,只是重寫了一個從CWinApp 類中繼承來的函數(shù),在應(yīng)用程序的生存期內(nèi)InitInstance 的調(diào)用比較早,是在應(yīng)用程序開始運行以后而窗口創(chuàng)建之前,除非InitIstance 創(chuàng)建一個窗口,否則應(yīng)用程序是不會有窗口,這正是為什么即使最小的MFC 應(yīng)用程序也必須從CWinApp 派生出一個類并重寫CWinApp: InitIstance 的原因InitInstance 函數(shù):CWinApp:InitInstance 是一個虛函數(shù),其默認(rèn)操作僅包含一條語句:return TRUE;InitInstance 是用來執(zhí)行程序每次開始時都需要進行的初始化工作最好的地方在 中,CMyApp 的 InitInstance 通過實例化hello 的CMainWindow 類來創(chuàng)建hello 窗口,語句: m_pMainWnd=new CMainWindow;構(gòu)造了一個CMainWindow 對象指針,并將其地址復(fù)制到了應(yīng)用程序?qū)ο蟮膍_pMainWnd 數(shù)據(jù)成員中,窗口創(chuàng)建以后,InitInstance 就會通過CMainWindow 指針調(diào)用ShowWindow 和UpdateWindow 函數(shù)顯示它: m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow(); ShowWindow 和UpdateWindow 是所有窗口對象共用的CWnd 成員函數(shù)其中包括 CFrameWnd 類的對象,CMainWindow 就是從CFrameWnd 派生出來的.要從MFC 程序調(diào)用一個常規(guī)的Windows API 函數(shù),需要在函數(shù)名稱前添加一個全局運算符:例如::UpdateWindow();通過生成窗口對象并調(diào)用其Create 函數(shù),MFC 應(yīng)用程序可以創(chuàng)建一個窗口,在CMyApp:InitInstance 中,hello 創(chuàng)建了一個 CMainWindow 對象,CMainWindow 的構(gòu)造函數(shù)生成在屏幕上看到的窗口: Create(NULL,我的第一個MFC 應(yīng)用程序);CPaintDC dc(this);MFC 的 CPaintDC 類是從MFC 的CDC 類派生的,CDC 類封裝了Windows 設(shè)備環(huán)境,以及包含了繪制到屏幕、打印機和其他設(shè)備的幾十個成員函數(shù)在MFC 中如何處理消息呢?在SDK 中我們利用的是消息循環(huán)和窗口過程函數(shù)對消息進行消息處理.在 MFC 中我們用的是消息映射機制.下面是將消息映射添加到一個類中需要做的全部工作.1 通過將DECLARE_MESSAGE_MAP 語句添加到類聲明中,聲明消息映射.2 通過放置標(biāo)識消息的宏來執(zhí)行消息映射,相應(yīng)的類將在對BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 的調(diào)用之間處理消息3 添加成員函數(shù)來處理消息1、構(gòu)造 CWinApp 派生類的對象2、系統(tǒng)調(diào)用WinMain()3、WinMain 調(diào)用InitInstance, 在該函數(shù)中創(chuàng)建CFrameWnd 派生類對象,調(diào)用Create 函數(shù)創(chuàng)建窗口、調(diào)用 ShowWindow 函數(shù)顯示窗口。 4、之后內(nèi)部機制調(diào)用Run,接受用戶的消息,并將消息導(dǎo)向默認(rèn)的處理函數(shù)。 當(dāng)接收到WM_QUIT 消息時,Run 內(nèi)部調(diào)用 ExitInstance,退出程序。 MFC 采用消息映射(Message Map)機制取代C/C++語言中的switch-case 結(jié)構(gòu)來處理消息。 消息映射:在MFC 中把消息處理函數(shù)和它所要處理的特定的消息連接起來的一種機制。 它通過宏來實現(xiàn)消息到成員函數(shù)的映射,而且這些函數(shù)不必是虛擬的成員函數(shù),這樣不需要為消息映射函數(shù)生成一個很大的虛擬函數(shù)表(V 表),節(jié)省內(nèi)存。 MFC 消息映射機制包括一組消息映射宏。 一條消息映射宏把一個Windows 消息和其消息處理函數(shù)聯(lián)結(jié)起來。 MFC 應(yīng)用程序框架提供了消息映射功能。 在類的實現(xiàn)源文件中用 BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏來定義消息映射。 在類定義的結(jié)尾用DECLARE_MESSAGE_MAP()宏來聲明使用消息映射。
內(nèi)容聲明:
1、本站收錄的內(nèi)容來源于大數(shù)據(jù)收集,版權(quán)歸原網(wǎng)站所有!
2、本站收錄的內(nèi)容若侵害到您的利益,請聯(lián)系我們進行刪除處理!
3、本站不接受違法信息,如您發(fā)現(xiàn)違法內(nèi)容,請聯(lián)系我們進行舉報處理!
4、本文地址:http://www.hudongshop.com/article/e2c3fd0d53f95db33039.html,復(fù)制請保留版權(quán)鏈接!
PDF,便攜式文檔格式,是一種流行的文件格式,用于在各種設(shè)備上創(chuàng)建和共享文檔,但是,PDF文檔通常是不可編輯的,這可能會給編輯或重新使用其內(nèi)容帶來困難,幸運的是,有許多工具和技術(shù)可以讓您提取PDF文檔中的文本,從而使您可以編輯和重新使用內(nèi)容,本文將探討一些流行的PDF文本提取方法,并提供分步指南,幫助您從PDF文檔中提取可編輯文本,P...。
最新資訊 2024-09-27 10:54:21
引言存儲過程是預(yù)編譯的、可重復(fù)使用的數(shù)據(jù)庫對象,可以封裝復(fù)雜的數(shù)據(jù)庫操作,雖然它們提供了許多好處,包括可重用性、性能和代碼模塊化,但它們的安全性也至關(guān)重要,因為它們可以訪問敏感數(shù)據(jù)并執(zhí)行特權(quán)操作,在本文中,我們將深入探討存儲過程安全性,了解潛在威脅并探索最佳實踐,以保護數(shù)據(jù)庫免受存儲過程可能帶來的威脅,存儲過程的潛在威脅SQL注入攻擊...。
最新資訊 2024-09-26 18:59:18
在當(dāng)今競爭激烈的商業(yè)環(huán)境中,持續(xù)學(xué)習(xí)和提高技能至關(guān)重要,在線教程為我們提供了一種方便快捷的方式,可以與來自世界各地的專家建立聯(lián)系,獲取寶貴的見解和指導(dǎo),在線教程的優(yōu)勢靈活性和便利性,在線教程允許您隨時隨地學(xué)習(xí),無需去教室或遵循固定的時間表,廣泛的課程選擇,在線平臺提供各種各樣的課程,從技術(shù)技能到軟技能,涵蓋廣泛的主題,與專家直接聯(lián)系,...。
技術(shù)教程 2024-09-23 08:04:05
constbox=document.querySelector,.box,box.addEventListener,mouseover,=,box.style.filter=blur,10px,box.addEventListener,mouseout,=,box.style.filter=none,使用C...。
技術(shù)教程 2024-09-15 16:21:36
服務(wù)器端編程語言簡介服務(wù)器端編程語言是一種用于在服務(wù)器上運行的代碼的編程語言,這些語言可用于處理應(yīng)用程序的邏輯并與數(shù)據(jù)庫和其他服務(wù)進行交互,與客戶端編程語言,在用戶設(shè)備上運行,不同,服務(wù)器端編程語言不負(fù)責(zé)用戶界面或交互,服務(wù)器端編程語言的應(yīng)用服務(wù)器端編程語言在現(xiàn)代應(yīng)用程序開發(fā)中有著廣泛的應(yīng)用,包括,Web應(yīng)用程序,處理用戶請求、生成動...。
互聯(lián)網(wǎng)資訊 2024-09-12 09:01:37
1.簡介C語言是一種通用高級編程語言,由丹尼斯·里奇,DennisRitchie,于1972年開發(fā),它是一種結(jié)構(gòu)化編程語言,廣泛用于開發(fā)操作系統(tǒng)、嵌入式系統(tǒng)和軟件應(yīng)用程序,C語言以其高效、可移植性和靈活性而聞名,它被認(rèn)為是學(xué)習(xí)編程語言的堅實基礎(chǔ),因為它提供了對編程概念和計算機體系結(jié)構(gòu)的深入理解,2.安裝和配置要在計算機上使用C語言,您...。
本站公告 2024-09-10 22:45:51
滾動圖片是一種交互式圖形元素,允許用戶通過滾動或拖動來探索圖像的各種部分,它們是創(chuàng)建引人入勝且引人注目的移動和桌面體驗的強大工具,滾動圖片的優(yōu)勢吸引人的內(nèi)容體驗,滾動圖片可以通過允許用戶以獨特而互動的方式探索圖像來創(chuàng)建更吸引人的內(nèi)容體驗,提高用戶參與度,滾動圖片需要用戶js或LocomotiveScroll,在工具中創(chuàng)建新的滾動圖片,...。
互聯(lián)網(wǎng)資訊 2024-09-06 22:01:26
在Java中,trim,函數(shù)是用于移除字符串兩端的空白字符,包括空格、制表符和換行符,的強大工具,掌握trim,函數(shù)的各種用法和應(yīng)用場景對于處理字符串至關(guān)重要,移除字符串兩端的空白字符最基本的使用trim,函數(shù)是移除字符串兩端的空白字符,例如,Strings=Hello,World,Stringtrimmed=s.trim,...。
互聯(lián)網(wǎng)資訊 2024-09-06 20:50:37
引言Java是一種功能強大且用途廣泛的編程語言,被廣泛用于各種應(yīng)用程序和解決方案的開發(fā)中,隨著技術(shù)的不斷發(fā)展,Java的作用也越來越重要,它正成為塑造我們數(shù)字世界的關(guān)鍵力量,Java的優(yōu)勢Java擁有許多優(yōu)勢,使其成為開發(fā)人員的首選語言,包括,平臺獨立性,Java遵循一次編寫,隨處運行的原則,使其可在各種操作系統(tǒng)上運行,包括Windo...。
技術(shù)教程 2024-09-05 14:42:21
校園,一個充滿了青春與活力的場所,卻也流傳著許多靈異傳說,這些傳說往往令人毛骨悚然,但又讓人難以抗拒,它們究竟是科學(xué)現(xiàn)象還是玄學(xué)迷信,本文將帶你探索校園靈異之謎的真相,科學(xué)解釋對于校園靈異事件,科學(xué)家們給出了以下解釋,光學(xué)錯覺,昏暗的環(huán)境、閃爍的燈光以及陰影的移動都會產(chǎn)生光學(xué)錯覺,讓人誤認(rèn)為看到了鬼魂,聲音錯覺,老建筑物中的管道聲、風(fēng)...。
互聯(lián)網(wǎng)資訊 2024-09-04 02:57:09
2022年10月28日南京碎尸案于2022年7月21日發(fā)生,是一起令人發(fā)指的兇殺案,該案的犯罪嫌疑人洪某因涉嫌故意殺人罪已被警方逮捕,案件經(jīng)過2022年7月21日,南京警方接到報警稱,在某小區(qū)內(nèi)發(fā)現(xiàn)一名被肢解的女性尸體,經(jīng)過調(diào)查,警方確定受害人系28歲的李某某,經(jīng)過縝密偵查,警方很快鎖定犯罪嫌疑人洪某,并于當(dāng)日將其抓獲,經(jīng)審訊,洪某對...。
互聯(lián)網(wǎng)資訊 2024-09-03 05:13:46
建議進行以下操作,1.檢查手機網(wǎng)絡(luò)連接是否穩(wěn)定,建議更換無線網(wǎng)絡(luò)嘗試,2.更新軟件版本嘗試,3.點擊手機應(yīng)用程序,設(shè)定,應(yīng)用程序管理器,已下載,選擇出現(xiàn)問題的應(yīng)用,清除數(shù)據(jù)4.將數(shù)據(jù)備份,聯(lián)系人,短信,圖片等,,恢復(fù)出廠設(shè)置重新安裝嘗試5.更新下手機系統(tǒng)版本,美圖丨一些尋找無水印圖片的個人經(jīng)驗對于大部分動漫迷來說,平時都喜歡收集圖片,...。
技術(shù)教程 2024-09-02 01:53:59