原创 控件基本操作、回调及自己动手写小时钟(转自如鹏网)

2010-1-31 13:26 2140 2 2 分类: 软件与OS

板书:
接下来我们要实现小时钟。涉及到的主要知识点是定时器的使用,涉及到的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#VBDelphi之类的工具拖拽控件,像搭积木一样就可以搭建出一个程序来”。确实如此,但是这样的程序员恐怕竞争力不强。只有深入了解内部原理,才能让自己对技术融会贯通,也才能让程序员之路走得更稳健、更长久。永远记住价值规律:越容易的东西越便宜。


6)句柄(Handle,注意这个概念后面要经常用到,需要仔细理解)
         句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例、窗口、图片、图标等等。WINDOWS句柄有点象C语言中的文件句柄。在运行时唯一确定一个对象!

         为什么要搞句柄这个东西呢?比如我们要加载一个图片,这时就要调用系统的加载图片的API函数,API函数会将图片加载到内存的一个区域,然后通过什么方式将这个区域的地址告诉调用者呢?有的同学会说:直接将内存区域的指针返回不就行了吗?对于图片、文件等对象来说,分配到堆!而不是栈!存在下面的问题:这些对象并不是立即被加载到内存的,只有访问到的时候才加载到内存中;为了高效的利用内存,操作系统可能会移动数据在内存中的位置。因此不能直接返回内存的指针,操作系统会为这个图片、文件对象分配一个唯一的标识号,然后就可以按照这个标识号进行资源的访问了。这个标识号就是句柄,句柄其实就是一个对象的编号,数据类型其实就是整数,只不过用typedef搞了一个别名而已。
怎么得到控件句柄呢?根据id得到。

消息机制、回调函数和函数指针(现在明白C程序设计中的函数指针是做什么用的了吧)

控件句柄和控件id的区别:控件句柄在每次运行的时候都是不一样的,而控件id则是确定的;就像fopen函数返回的句柄一样,每次运行的句柄都不是一样的,但是文件名是确定的。
句柄一般在运行时动态根据id算出来。

hFile = fopen("c:/a.txt")

5、设置、读取控件的文字(文本框、标签、CheckBoxButton
设置:
方法1SetDlgItemText(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);



SetDlgItemTextGetDlgItemSetWindowText的关系
我在家里是老大,所以别人要打我的话有两种方式:
1、直接找到我,然后打我。这就是直接抓住我的把柄SetWindowText
2、找到我爸,然后找我爸爸的id=1的儿子,也就是我,然后再打我。这就是通过我把的把柄和我的id=1来定义我
SendDlgItemMessageSendMessage一个道理。

3、可以使用GetDlgCtrlID来根据控件句柄得到控件的ID,也可以使用GetDlgItem (hwndParent, id)来根据控件的id得到控件的句柄。函数中的「Dlg」部分指的是对话框,但实际上这是一个通用的函数。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条