D语言中国主页  D语言编辑器SciTE4D   DWin库 D语言官方网站
D语言编译器1.x最新版 OpenSource   Tango   webnews  Wiki

查看完整版本: 白手起家Win32SDK应用程序3 增加一个回调函数

yidabu 2007-5-5 16:28

白手起家Win32SDK应用程序3 增加一个回调函数

白手起家Win32SDK应用程序3 增加一个回调函数知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070505点击下面网址查看原文:http://bbs.d-programming-language-china.org/thread-561-1.html        by:        白云小飞        D语言论坛 http://www.d-programming-language-china.org 增加D语言实例教程        第三篇 增加一个回调函数                                         白云小飞        1 请再创建一个函数        [Copy to clipboard] [ - ]CODE:                                LRESULT CALLBACK WinProc(HWND hwnd,                        UINT msg,                     WPARAM wparam,                     LPARAM lparam)                {                    //这里可以输入响应消息的代码                    return 0;                }                此函数人称回调函数也称自定义窗口过程函数。但其实它与我们一般函数无异,你千万不要把这个函数想得太复杂了啊!        记住,函数名WinProc及各参数变量名是可以由你来指定,但是参数类型、个数、顺序、及返回值类型是不能改变的。        那么,这个函数是干什么的啊?        它是一个用来与某窗口关联的函数。当我们在窗口上的每一个操作,都会调用这个函数。这在个函数里,我们可以写上代码来完成我们在窗口上操作的相应功能。        先来看参数部分:        UINT msg :UINT类型不是我们在前面也见过吗?就是unsigned int类型了。每次程序运行时用户在窗口上操作所产生的消息都会通过msg传递进来。msg里保存的值就是我们对窗口操作时产生的消息值(即WM_CLOSE、WM_CHAR、WM_COMMAND、……的值)。        HWIND hwnd :哦!这是我在第一篇中讲过的一个窗口句柄类型的变量。我们可以通过传入的hwnd的值知道msg中的消息对应的是哪一个窗口。        WPARAM wparam , LPARAM lparam :wparam和lparam这两个参数变量的类型分别是WPARAM和LPARAM。呵呵,我不是说过,你还会见到许多“新”的数据类型的吗?你可要有心理准备噢。        在windef.h中有定义:        QUOTE:                                typedef UINT WPARAM;    //看,WPARAM其实就是unsigned int。                typedef LONG LPARAM;    //看,LPARAM其实就是long类型                typedef LONG LRESULT;    //LRESULT与LPARAM一样也是长整型long                返回值:类型为LRESULT,看windef.h中的定义可以知道是一个长整型long现在你大体知道这些就行了。至于更进一步的认识,让我们先放到一边去吧!        CALLBACK:这又是什么呢?        在windef.h中的定义如下:        QUOTE:                                #define CALLBACK    __stdcall                #define WINAPI    __stdcall                哦!它与WINAPI是一样的,也是__stdcall了,这个WinProc函数是提供给操作系统调用的。我说过操作系统调用的函数都得在前加__stdcall。        (那为什么不直接用__stdcall呢?)        呵呵,这至少可以增加代码的可读性及易改性。        D语言论坛 http://www.d-programming-language-china.org 按:        在D语言中,只要简单的extern (Windows)就表示采用Windows api调用约定。( 本文出处: http://bbs.d-programming-language-china.org/thread-561-1.html )        我猜也许你还会继续下一个疑问:那我又如何具体地使用这个函数呢?慢慢来,现在你只要输入到你的.cpp文件中就可以了。        到此为止,我们的MyAppMain.cpp文件代码如下:        [Copy to clipboard] [ - ]CODE:                                //Begin MyAppMain.cpp                #include <windows.h>                #include<windowsx.h>                                LRESULT CALLBACK WinProc(HWND hwnd,                                     UINT msg,                                     WPARAM wparam,                                     LPARAM lparam)                {                    //这里可以输入响应消息的代码                    return 0;                }                                int WINAPI WinMain(HINSTANCE hinstance,                             HINSTANCE hprevinstance,                             LPSTR lpcmdline,                             int ncmdshow)                {                    // 将会在这里输入主函数的代码                    return 0;                }                //End MyAppMain.cpp                D语言论坛 http://www.d-programming-language-china.org 注:        简化版的D语言代码是:        [Copy to clipboard] [ - ]CODE:                                //Begin MyAppMain.d                import std.c.windows.windows;                extern (Windows):                LRESULT WinProc(HWND hwnd,                                     UINT msg,                                     WPARAM wparam,                                     LPARAM lparam)                {                    //这里可以输入响应消息的代码                    return 0;                }                extern (Windows):                int WinMain(HINSTANCE hinstance,                             HINSTANCE hprevinstance,                             LPSTR lpcmdline,                             int ncmdshow)                {                    // 将会在这里输入主函数的代码                    return 0;                }                //End MyAppMain.cpp                关于几个参数的数据类型,bbs.d-programming-language-china.org 查了msdn:        QUOTE:                                http://msdn2.microsoft.com/en-us/library/aa383751.aspx                WPARM:    Message parameter. This type is declared in WinDef.h as follows:typedef UINT_PTR WPARAM;                LPARAM:    Message parameter. This type is declared in WinDef.h as follows:typedef LONG_PTR LPARAM;                HANDLE:    Handle to an object. This type is declared in WinNT.h as follows:typedef PVOID HANDLE;                LPSTR:    Pointer to a null-terminated string of 8-bit Windows (ANSI) characters. This type is declared in WinNT.h as follows:typedef CHAR *LPSTR;                LRESULT:    Signed result of message processing. This type is declared in WinDef.h as follows:typedef LONG_PTR LRESULT;                每个参数必须知道其命名由来和数据类型意义。比如:        QUOTE:                                WPARM,W大概是Windows Message,PARAM就是parameter,在D语言里是uint类型。                LPARAM,L大概是Long,在D语言的数据类型是int。                LRESULT,L是Long,RESUL表示结果,也就是消息处理的结果,在D语言的数据类型是int。                LPSTR,LP是指针pointer,STR是string字符串,在D语言的数据类型是char。                目前为止,这个程序还是一个什么事都没做的Win32应用程序。当然它是不会显示任何窗口的,不过我会一点一点地完善它的。        最后请再认真浏览一下上述代码吧!重点回顾各参数的类型和作用。( lastupdate:20070505 最新文章请访问http://www.d-programming-language-china.org )关于一大步成功社区:yidabu提倡在交流中学习,在分享中提高收集感兴趣的知识,写下心得,通过网络与别人一起分享理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台
页: [1]
查看完整版本: 白手起家Win32SDK应用程序3 增加一个回调函数