一、 作業注意事項
A. if else中的代碼哪怕只有一行也要用大括號括起來;
B. TEXT()的應用;
C. while……continue的應用。
二、 C-Free的相關問題
1. 怎麼打開VC6、VC7、DevC++的工程?
從網上下載了別人寫的C語言程序,有可能是用VC寫的,所以要轉換一下。下了VC的程序不用擔心,C-Free是支持的。
A. C-Free4.0用【工具】→【工程轉換】;
B. C-Free4.1的話,直接把工程文件拖進來就可以。
2. 爲什麼代碼自動提示不出來?怎麼增加自動提示的數量?
【工具】→【編輯器選項】→【代碼提示】
顯示最大條數、輸入幾個字符後才激活,建議改成10、1。
3. 怎麼修改新建文件的默認文件名爲*.c?
【工具】→【環境選項】、修改“新建文件類型”
4. 每次都要輸入WinMain以及那些參數,很麻煩,有沒有快捷方式?
添加自己的“模板”:
【工具】→【編輯器選項】→【代碼模板】,點擊【添加】按鈕,爲模板取一個名字,然後將代碼模板粘貼到“代碼”框中。
使用方式:
在編輯器中點擊鼠標右鍵,選擇【模板】,然後選擇創建的代碼模板。
5. 怎麼生成exe程序?怎麼把做好的exe程序發給別人?
主菜單【工具】→【定位到工程文件夾】跳轉到工程的文件夾,也可以在我的電腦裏直接進入工程文件夾。Mingw3.4.1目錄下生成的exe文件就是生成好的可執行文件,發給別人就可以。
三、 播放聲音文件PlaySound
1. 函數介紹
(1) 用途
遊戲裏播放音樂;
自己動手給女友做音樂賀卡(圖片、滾動的字母、溫馨的音樂)。
(2) 函數原型
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
可以使用PlaySound函數播放聲音文件,該函數原型位於mmsystem.h中。因此要使用PlaySound,首先需要添加對這個頭文件的引用。
提示:mm就是MultiMedia的簡寫,即多媒體。
返回值表示是否播放成功;
參數pszSound是要播放聲音的文件名,只支持WAV等格式的文件;
參數hmod是應用程序的實例句柄,一般傳遞NULL就可以;
參數fdwSound是標誌的組合掩碼,可選值有SND_FILENAME、SND_ASYNC、SND_SYNC等。
SND_FILENAME表示pszSound參數指定的是文件名(pszSound還可以指定資源、內存音樂、系統音樂等等);
SND_ASYNC:用異步方式播放聲音,PlaySound函數在開始播放後立即返回;
SND_SYNC:同步播放聲音,在播放完後PlaySound函數才返回;
SND_LOOP一遍遍的重複播放聲音,必須與SND_ASYNC標誌一塊使用。
(3) 使用舉例
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows XP啓動.wav"), NULL, SND_FILENAME | SND_SYNC);
注意的問題:文件名中的反斜線要用“\\”,因爲C語言中“\”默認是轉義符,如果要表示“\”則需要使用“\\”,;對中文字符串要使用TEXT宏。
(4) 爲啥構建不通過?
#include <mmsystem.h>只是保證編譯通過,還要設定link。
解決方案:
工程上點擊右鍵,選“工程設置”,連接,添加“winmm”庫。
解決此問題時參考的文章:http://hi.baidu.com/big_foot/blog/item/4822fcd11a7f7cd6562c84e7.html。它雖然描述的是VC中解決此問題的方式,但是記住“一通百通”這個道理,C-Free中添加Link庫的方式和VC非常相似,只是操作步驟不同而已。
附錄:VC中添加Link庫的方式
project->setting->Link下的Object/library modules里加入winmm.lib即可”,他這裏用的是英文版,中文版應該是主菜單的【工程】→【設置】→【連接】,將“winmm.lib”加入到“對象/庫模塊”中。
關於link庫
一個程序由源代碼變成exe文件有兩步:編譯Compile;連接Link。
編譯是把c文件編譯成*.o、*.obj文件,而連接則是把這些*.o、*.obj、*.lib等文件連接到一起成爲exe文件。
那什麼是*.lib文件呢?以前用TC開發程序的時候用的都是C語言內置的函數,所以不存在使用非內置函數的情況。但是在開發大程序的時候要大量用到非內置的函數,比如PlaySound、MessageBox等等。在使用這些函數的時候需要使用兩部分,一部分是*.h頭文件,它定義了函數的參數和返回值,另一部分是*.lib文件,是用來進行程序鏈接用的。
C程序的構建分爲編譯(Compile)和連接(Link)兩個過程,Compile是把源代碼編譯成*.obj文件,每個源碼文件都對應一個*.obj文件,而連接則是把這些*.obj文件以及使用到的非內置函數的*.lib文件連接成一個*.exe文件。所以無論是忘了include *.h文件,還是丟了*.lib文件,都會構建出錯。從上面的報錯信息可以看出來是Compile成功,但是Link失敗。一定要記得C程序編譯的這兩個過程,面試、筆試的時候常考。
(5) 同步播放音樂
PlaySound("C:\\WINDOWS\\Media\\Windows XP 關機.wav", NULL, SND_FILENAME | SND_SYNC);
(6) 體會同步播放和異步播放的差異
PlaySound("C:\\WINDOWS\\Media\\Windows XP 關機.wav", NULL, SND_FILENAME | SND_SYNC);
MessageBox(NULL,"同步播放完畢","信息",MB_OK);
PlaySound("C:\\WINDOWS\\Media\\Windows XP 關機.wav", NULL, SND_FILENAME | SND_ASYNC);
MessageBox(NULL, "異步播放立即返回", "信息", MB_OK);
A. 同步模式:音樂播放過程中函數不返回,播放完成才返回;
B. 異步模式:在做遊戲等需要播放時間較長的音樂時使用,因爲程序不會在音樂播放過程中有假死的情況。
有沒有同學注意到第二個對話框如果快速關閉的話音樂會中途停止?這是因爲程序退出音樂就中斷播放了。用戶關了遊戲,音樂也不能繼續播放,應該停止,所以很合理!
(7) 循環播放
我可以做一個小程序,別人在我小程序運行的時候一直聽播放的音樂,用異步方式可以保證音樂在後臺播放。可是隻能播放一遍,能不能音樂來回來去的不斷播放呢?答案是使用SND_LOOP標誌。
Loop:循環
PlaySound("C:\\WINDOWS\\Media\\Windows XP 關機.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
(8) 如果我做一個小遊戲,不斷播放音樂,可是到達一個關卡的時候希望停止原來的音樂怎麼辦?
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows XP 啓動.wav"), NULL, SND_FILENAME | SND_ASYNC);
MessageBox(NULL,TEXT(""),TEXT(""),MB_OK);
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows XP 關機.wav"), NULL, SND_FILENAME | SND_ASYNC);
MessageBox(NULL, TEXT(""), TEXT(""), MB_OK);
只能同時播放一段音樂,啓動新的、舊的就被停了!
(9) 如果只是想停止目前的播放而不播放新音樂呢?
只要給PlaySound的第一參數傳遞NULL就可以停止目前的播放了。
PlaySound("C:\\WINDOWS\\Media\\Windows XP 關機.wav", NULL, SND_FILENAME | SND_ASYNC| SND_LOOP);
MessageBox(NULL, "點確定終止音樂", "信息",MB_OK);
PlaySound(NULL, NULL, SND_FILENAME);
MessageBox(NULL, "音樂被終止", "信息", MB_OK);
關於PlaySound函數更多的介紹見:http://zhidao.baidu.com/question/41366091.html
四、 關於API
(1) 什麼是API
API是應用程序接口Application Programming Interface的簡稱。
API就是操作系統提供的一堆庫函數,沒啥稀奇的。printf、scanf是C語言內置的函數,其他的非內置的庫函數都叫API。
(2) 我想找實現某個功能的API怎麼辦?
以“關閉顯示器”爲例講解自學過程。可百度中搜索“關閉顯示器 API”。
關閉顯示器的API函數:
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
彈出和彈入光驅的API函數:
mciSendString("set cdaudio door open",NULL, 0, 0);
mciSendString("Set cdAudio door closed wait", NULL, 0, NULL);
(3) 怎麼我查看MessageBox函數其實是MessageBoxW、MessageBoxA兩個函數的宏定義?
Win32API中還有大量這種風格的函數。W結尾的是把字符當成Unicode處理的,A結尾的是把字符當成ASCII處理的。使用時不要直接調用W結尾的或者A結尾的。編譯器會在編譯時確定調用哪個。
(4) 關於Win32API
Win32API是語言無關的,這點是非常重要的。Win32API是操作系統提供的庫函數,可以在C語言中調用,也可以在C++中調用,還可以在C#、Java、Delphi、Python、彙編等各種語言中調用,因此學會了我們這裏的C語言Windows程序開發以後只要熟悉一下其他語言的語法就可以很快的用其他語言開發Windows程序,VC、C#、Delphi等語言中的程序界面、網絡操作、文件操作等功能都是對Win32API的簡單包裝而已。
學了咱們JSJ321.com的《C語言也能幹大事》以後就掌握了編程開發的“內功心法”,達到了一切語言都是紙老虎的大俠狀態,就可以蔑視那些問“學VC還是學C#?”的菜鳥,你怎能不心動?!
五、 課後作業
改進上節課那個惡搞程序,在問不同問題的時候播放不同的音樂。同學提交作業的方式就是把代碼以回帖的方式回覆本帖。