C語言也能幹大事第九節(如鵬基礎)

接下來我們要實現小時鐘。涉及到的主要知識點是定時器的使用,涉及到的C知識就是函數指針(回調函數)

使用定時器

回調就是不是你調別人,而是別人調你。時間到了會叫你,沒到的時候不會煩你。

Windows直接將定時器消息發送給您程序的另一個函數。

我們把以下的callback函數稱爲TimerProc(您能夠選擇與其它一些用語不會發生衝突的任何名稱),它只處理WM_TIMER消息:

VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime);

SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;

19、得到當前日期:

void GetLocalTime(LPSYSTEMTIME); LP指針類型前綴

課上練習:

SYSTEMTIME stLocal;

char chBuf[256];

GetLocalTime(&stLocal);//顯示時間的間隔。

wsprintf(chBuf,TEXT("%u/%u/%u %u:%u:%u:%u %d\r\n"),

stLocal.wYear, stLocal.wMonth, stLocal.wDay,

stLocal.wHour, stLocal.wMinute, stLocal.wSecond,

stLocal.wMilliseconds,stLocal.wDayOfWeek);

MessageBox(NULL,chBuf,"",MB_OK);

SetTimer(hwnd,1,1000,TimerProc);

void CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)

{

SYSTEMTIME time;
GetLocalTime(&time);

TCHAR strTime[256];//%後面的0表示不夠的位數補零,5是總位數,就這樣

wsprintf(strTime,"%04d-%02d-%02d %02d:%02d:%02d",time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);

SetDlgItemText(hwnd,IDC_EDTTIME,strTime);

}

作業:定時關機、定時關閉顯示器,如何編程實現關機、關顯示器。到整天播放音樂。自學!!!“關閉顯示器 API”、“關閉顯示器函數”

9、取得複選按鈕的是否選中:

LRESULT Button_GetCheck(
 HWND hwndCtl);BST_CHECKED BST_UNCHECKED 

設置複選按鈕是否選中:

LRESULT Button_SetCheck(
 HWND hwndCtl, int check);BST_CHECKED BST_UNCHECKED 

9、菜單資源

1)製作好菜單資源後,在對話框的Menu屬性中選擇剛纔製作好的對話框。

2)響應菜單操作。菜單點擊後也會發送WM_COMMAND消息id就是被選擇菜單的id。例子:

case IDM_QUIT:

EndDialog(hwnd,id);

作業:文件操作。自己動手寫記事本。路徑寫固定的路徑。(讀取文件後在後面多出一個|,求解)

下節課內容:作業點評,文件對話框、播放音樂

作業點評文件操作。自己動手寫記事本。

RichEdit控件。LoadLibrary( "riched32.dll" );
參考資料:http://msdn.microsoft.com/en-us/library/bb787605(VS.85).aspx

5、給結構體所有字段置零

複習一下C語言中memset以及結構體的應用。C語言中聲明一個結構體變量之後,在使用這個變量之前要首先用memset來把各個位清零。使用C語言內置的函數memset來完成:

memset(&s1,sizeof(s1),0);

在這裏我們使用ZeroMemory“函數”,ZeroMemory其實並不是函數,其實是memset的宏定義

ZeroMemory其實就是memset,紙老虎而已,不是一個全新的函數。

6、打開文件對話框的使用

首先#include <commdlg.h>

OPENFILENAME ofn;

char szFile[MAX_PATH];

ZeroMemory(&ofn,sizeof(ofn));

ofn.lStructSize = sizeof(ofn);

ofn.lpstrFile = szFile;

ofn.lpstrFile[0] = TEXT('\0');

ofn.nMaxFile = sizeof(szFile);

ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0");

ofn.nFilterIndex = 1;

ofn.lpstrFileTitle = NULL;

ofn.nMaxFileTitle = 0;

ofn.lpstrInitialDir = NULL;

ofn.hwndOwner = hwnd;//自學能力、探索能力、猜測能力

ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn))

{

MessageBox(NULL,szFile,"",MB_OK);

}

 參數太多隻能搞Struct。下面將對這段代碼作解釋:

1)、ZeroMemory的含義見上邊

2char szFile[MAX_PATH];//定義一個長度爲MAX_PATHchar數組。

MAX_PATH是系統定義的一個宏,260Windows操作系統文件路徑的最大長度。

3ofn.lpstrFile = szFile;
//szFile是一個字符數組,那麼szFile這個名字就代表這個字符數組的首地址

4)文件類型過濾器

*.*就表示所有文件

*.txt就表示所有文本文件

abc*.*就表示所有以abc開頭的文件

abc*.txt就表示所有以abc開頭的文本文件(txt

ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0");用“\0”分割出幾個段,每兩段是一組過濾器,每組的第一個段代表過濾器的顯示的值,而第二段表示真正的過濾器

5ofn.nFilterIndex = 2;默認選擇第幾個過濾器,是1開始的,不是0.這也是試驗出來的。

6windows的一個慣例:結構體的指針類型別名一般是LP+結構體的名字

GetOpenFileName(&ofn)而不是GetOpenFileName(ofn),因爲GetOpenFileName函數要的是OPENFILENAME的指針

7)用戶關閉對話框,GetOpenFileName函數返回,返回值是BOOL,等於TRUE表示用戶選擇了文件,如果等於FALSE就表示用戶選擇了【取消】按鈕

第三節

(1)GetOpenFileName

希望同學們不要只記我教的結果,而是要跟着我的思路進行思考,看解決問題的方式。否則就又變成“我教同學們學”的填鴨式教育了。

(2)課上練習:打開對話框,用戶選擇一個音樂文件,然後用MCIsendString播放,注意ShortPath的問題。如何讓音樂文件跟着文件走,GetModuleFileNameGetCurrentDirectory

3)打開多個文件:

增加OFN_ALLOWMULTISELECT選項後測試一下。發現如果選擇一個文件後顯示的還是這個文件的路徑,可是如果選擇多個文件顯示的就只有目錄的路徑,怎麼回事?

調試一下,看看szFile在內存中的樣子。調試的是發現內存中的樣子是目錄的路徑然後加上各個文件名,中間用“\0”分割,現在明白爲啥值顯示目錄的路徑了嗎?
大家明白這一點就可以了,有興趣的可以課後來做多文件選擇的處理。做播放器的時候經常需要這個功能,也就是播放列表。有一篇文章可以參考一下:http://xxkkff.blog.51cto.com/162016/26222 

2GetSaveFileName

保存文件對話框只要把上邊函數換成GetSaveFileNameOFN本來是OpenFileName的簡寫,它SaveFileName也跑來湊熱鬧,吼吼。如果需要保存文件覆蓋提示怎麼辦呢?看看OFN有選項嗎?OFN_OVERWRITEPROMPT

Mcisendstring播放音樂,配合GetOpenFileName實現播放器

GetShortPathName

mciSendString(“play ***”,"",0,NULL);

Mcisendstring更多用法(暫停、繼續、錄音、播放進度控制)參考

http://baike.baidu.com/view/1622810.htm?fr=ala0_1

http://msdn.microsoft.com/en-us/library/dd743572(VS.85).aspx

作業:提供打開、保存功能的記事本

作業:自己動手寫播放器 http://so.rupeng.com/?keyword=C%E8%AF%AD%E8%A8%80+%E6%92%AD%E6%94%BE%E5%99%A8

更多控件用法 http://msdn.microsoft.com/en-us/library/bb773169(VS.85).aspx

VC就是全部、VC不是唯一:C-FreePelles CDev C++CodeBlocksC-Free使用演示(VistaWin7上資源編輯器可能有問題)。


發佈了28 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章