接下来我们要实现小时钟。涉及到的主要知识点是定时器的使用,涉及到的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上资源编辑器可能有问题)。