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上资源编辑器可能有问题)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值