板书:
接下来我们要实现小时钟。涉及到的主要知识点是定时器的使用,涉及到的C知识就是函数指针(回调函数)
使用定时器
回调就是不是你调别人,而是别人调你。
让Windows直接将定时器消息发送给您程序的另一个函数。
我们把以下的callback函数称为TimerProc(您能够选择与其它一些用语不会发生冲突的任何名称),它只处理WM_TIMER消息:
VOID CALLBACK TimerProc (
HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime);
SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;
定时器还有其他两种用法,大家可以参考《Windows》程序设计这本书(不想变成填鸭式教育,课上只讲思想性的东西,会给大家学习资料,希望大家培养自学能力)
19、得到当前日期:
void GetLocalTime(LPSYSTEMTIME);
课上练习:
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);
}
后续的课程会讲得到空余内存、硬盘信息(总大小、空余、类型)、得到当前登录用户名、得到操作系统类型→自己动手写windows优化大师1.0版
菜单、文件处理、windows控件的操作→自己动手写记事本
有人说了“干嘛知道这么多?使用C#、VB、Delphi之类的工具拖拽控件,像搭积木一样就可以搭建出一个程序来”。确实如此,但是这样的程序员恐怕竞争力不强。只有深入了解内部原理,才能让自己对技术融会贯通,也才能让程序员之路走得更稳健、更长久。永远记住价值规律:越容易的东西越便宜。
(6)句柄(Handle,注意这个概念后面要经常用到,需要仔细理解)
句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例、窗口、图片、图标等等。WINDOWS句柄有点象C语言中的文件句柄。在运行时唯一确定一个对象!
为什么要搞句柄这个东西呢?比如我们要加载一个图片,这时就要调用系统的加载图片的API函数,API函数会将图片加载到内存的一个区域,然后通过什么方式将这个区域的地址告诉调用者呢?有的同学会说:直接将内存区域的指针返回不就行了吗?对于图片、文件等对象来说,分配到堆!而不是栈!存在下面的问题:这些对象并不是立即被加载到内存的,只有访问到的时候才加载到内存中;为了高效的利用内存,操作系统可能会移动数据在内存中的位置。因此不能直接返回内存的指针,操作系统会为这个图片、文件对象分配一个唯一的标识号,然后就可以按照这个标识号进行资源的访问了。这个标识号就是句柄,句柄其实就是一个对象的编号,数据类型其实就是整数,只不过用typedef搞了一个别名而已。
怎么得到控件句柄呢?根据id得到。
消息机制、回调函数和函数指针(现在明白C程序设计中的函数指针是做什么用的了吧)
控件句柄和控件id的区别:控件句柄在每次运行的时候都是不一样的,而控件id则是确定的;就像fopen函数返回的句柄一样,每次运行的句柄都不是一样的,但是文件名是确定的。
句柄一般在运行时动态根据id算出来。
hFile = fopen("c:/a.txt")
5、设置、读取控件的文字(文本框、标签、CheckBox、Button)
设置:
方法1:SetDlgItemText(hwnd,IDC_EDTNAME,TEXT("世界你好"));
方法2: HWND hwndEdtName = GetDlgItem(hwnd,IDC_EDTNAME);
SetWindowText(hwndEdtName,TEXT("世界你好"));
读取:
方法1:
HWND hwndEdtName = GetDlgItem(hwnd,IDC_EDTNAME);
TCHAR str[256];
ZeroMemory(str,sizeof(str));
GetWindowText(hwndEdtName,str,sizeof(str));
MessageBox(hwnd,str,"",MB_OK);
方法2:
TCHAR str[256];
ZeroMemory(str,sizeof(str));
GetDlgItemText(hwnd,IDC_EDTNAME,str,sizeof(str));
MessageBox(hwnd,str,"",MB_OK);
SetDlgItemText和GetDlgItem、SetWindowText的关系
我在家里是老大,所以别人要打我的话有两种方式:
1、直接找到我,然后打我。这就是直接抓住我的把柄SetWindowText
2、找到我爸,然后找我爸爸的id=1的儿子,也就是我,然后再打我。这就是通过我把的把柄和我的id=1来定义我
SendDlgItemMessage和SendMessage一个道理。
3、可以使用GetDlgCtrlID来根据控件句柄得到控件的ID,也可以使用GetDlgItem (hwndParent, id)来根据控件的id得到控件的句柄。函数中的「Dlg」部分指的是对话框,但实际上这是一个通用的函数。
文章评论(0条评论)
登录后参与讨论