接下來我們要實現小時鐘。涉及到的主要知識點是定時器的使用,涉及到的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的含義見上邊
(2)char szFile[MAX_PATH];//定義一個長度爲MAX_PATH的char數組。
MAX_PATH是系統定義的一個宏,260。Windows操作系統文件路徑的最大長度。
(3)ofn.lpstrFile = szFile;
//szFile是一個字符數組,那麼szFile這個名字就代表這個字符數組的首地址
(4)文件類型過濾器
*.*就表示所有文件
*.txt就表示所有文本文件
abc*.*就表示所有以abc開頭的文件
abc*.txt就表示所有以abc開頭的文本文件(txt)
ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0");用“\0”分割出幾個段,每兩段是一組過濾器,每組的第一個段代表過濾器的顯示的值,而第二段表示真正的過濾器
(5)ofn.nFilterIndex = 2;默認選擇第幾個過濾器,是1開始的,不是0.這也是試驗出來的。
(6)windows的一個慣例:結構體的指針類型別名一般是LP+結構體的名字
GetOpenFileName(&ofn)而不是GetOpenFileName(ofn),因爲GetOpenFileName函數要的是OPENFILENAME的指針
(7)用戶關閉對話框,GetOpenFileName函數返回,返回值是BOOL,等於TRUE表示用戶選擇了文件,如果等於FALSE就表示用戶選擇了【取消】按鈕
第三節
(1)GetOpenFileName
希望同學們不要只記我教的結果,而是要跟着我的思路進行思考,看解決問題的方式。否則就又變成“我教同學們學”的填鴨式教育了。
(2)課上練習:打開對話框,用戶選擇一個音樂文件,然後用MCIsendString播放,注意ShortPath的問題。如何讓音樂文件跟着文件走,GetModuleFileName、GetCurrentDirectory
(3)打開多個文件:
增加OFN_ALLOWMULTISELECT選項後測試一下。發現如果選擇一個文件後顯示的還是這個文件的路徑,可是如果選擇多個文件顯示的就只有目錄的路徑,怎麼回事?
調試一下,看看szFile在內存中的樣子。調試的是發現內存中的樣子是目錄的路徑然後加上各個文件名,中間用“\0”分割,現在明白爲啥值顯示目錄的路徑了嗎?
大家明白這一點就可以了,有興趣的可以課後來做多文件選擇的處理。做播放器的時候經常需要這個功能,也就是播放列表。有一篇文章可以參考一下:http://xxkkff.blog.51cto.com/162016/26222
2、GetSaveFileName
保存文件對話框,只要把上邊函數換成GetSaveFileName。OFN本來是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-Free、Pelles C、Dev C++、CodeBlocks。C-Free使用演示(Vista、Win7上資源編輯器可能有問題)。