写Windows程序不可避免要使用自定义的消息,也就是从WM_USER开始定义的消息。在定义一个消息后,往往我们还要定义针对该消息的WPARAM甚至是LPARAM。WPARAM和LPARAM是什么,可以参考MSDN的SendMessage或者WindowProc。归结成一点就是对应消息的额外附带信息。

从我个人的经历来看,当定义了一个消息并且还需要定义额外的附加信息时,往往该附加信息会被先定义到WPARAM上。为什么?很简单,因为SendMessage(HWND, UINT, WPARAM, LPARAM)中,WPARAM排地比较前面,写起来方便。特别是用多了MFC后,CWnd::SendMessage中WPARAM和LPARAM都默认是0,定义在WPARAM上,代码都可以少些几个字符。

但是,我不得不说,有时候我还挺困惑一个问题的,就是WPARAM和LPARAM中的W和L到底指代什么?既然两个参数都附带信息,并且被标注成不同的名字,那么区别又在哪里?在实际使用中进行混用或者怎么用怎么方便是否合适?

今天,写这篇文章就是我觉得日子不能这么浑浑噩噩地过啊。。。这些看似简单的问题,也许不简单啊。所以google和bing了一把。这里就把找到的一些资料汇总一下。

WPARAM和LPARAM在现今看来,其实区别不是很大。至少从所占用的字节数来看是一样的。32位的程序里都是32位的,64位的程序里都是64位。他们在系统头文件里一般是这么定义的:

1 typedef UINT_PTR            WPARAM;
2 typedef LONG_PTR LPARAM;

他们的不同主要还是在16位Windows系统里。在16位的Windows系统里,WPARAM是16位,W指代“word”,而LPARAM是32位的,L指代“long”。

那么在使用上,他们有什么区别呢?从我找到的资料来看,当初消息的设计时,WPARAM主要用来作为句柄和整数的载体,而LPARAM用来传递指针或者复合型的数据,比方说WM_CREATEWM_MOVE

现在,我个人觉得两者在使用上的区别应该不大。但是看了这些设计想法,以后我会考虑把指针这些额外数据定义到LPARAM上。

自定义消息中如果需要定义WPARAM和LPARAM,该怎么使用和分配?的更多相关文章

  1. LRESULT与wParam和lParam的问题

    在微软vc提供的头文件中有定义在winnt.h中typedef long LONG;在windef.h中typedef LONG LRESULT; 所以LRESULT就是long,也就是长整形之所以取 ...

  2. wParam与lParam的区别

    wParam与lParam的区别 lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数. LRESULT CALLBACK WindowProc(H ...

  3. wParam和lParam两个参数到底是什么意思?

    在Windows的消息函数中,有两个非常熟悉的参数:wParam,lParam. 这两个参数的字面意义对于现在的程序来说已经不重要了,因为它是16位系统的产物,为了保持程序的可移植性,就将它保存了下来 ...

  4. SendMessage和PostMessage区别以及WPARAM 和 LPARAM区别

    WPARAM 和 LPARAM wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数:一个是WORD类型的16位整型变量:另一个是LONG类型 ...

  5. WPARAM和LPARAM的含义

    lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uM ...

  6. 利用自定义消息处理函数的WPARAM或LPARAM参数传递指针

    有自定义消息: #define WM_TEST WM_USER+121 消息处理函数: afx_msg void OnTest(WPARAM wParam,LPARAM lParam); 该消息是一个 ...

  7. ArcGIS中的坐标系统定义与投影转换【转】

    ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...

  8. 【转】+【举例】ArcGIS中的坐标系统定义与投影转换

    背景知识: UTM (Universal Transverse Mercator)坐标系是由美国军方在1947提出的.虽然我们仍然将其看作与"高斯-克吕格"相似的坐标系统,但实际上 ...

  9. ArcGIS中的坐标系定义与转换 (转载)

    原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念:  GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐 ...

随机推荐

  1. Quicklz压缩算法

    以前对压缩算法一无所知,只是知道哈弗曼编码能做这种事情,但是感觉这样的方法奇慢无比.昨天下午看了下号称世界上最快的压缩算法Quicklz,对压缩的基本思路有了一定的了解.一般的压缩程序的要求读入文件之 ...

  2. centos7 安装 python3.5

    centos7 安装 python3.5 一. python虚拟环境virtualenv VirtualEnv用于在一台机器上创建多个独立的python运行环境,VirtualEnvWrapper为前 ...

  3. Dynamic Gcd

    树链剖分+差分 直接区间加显然是不行的,由于gcd(a,b,c)=gcd(a,a-b,b-c),那么我们对这些数差分,然后就变成单点修改.原本以为这道题很简单,没想到这么麻烦,就膜了发代码. 首先我们 ...

  4. git add . 的时候遇到warning: LF will be replaced by CRLF inXXX 解决办法

    $ git add . warning: LF will be replaced by CRLF in shop/Runtime/Cache/86bbc820c9ec1 d314a9c71cf5651 ...

  5. $.ajax数据传输成功却执行失败的回调函数

    这个问题迷惑了我好几天,都快要放弃了,功夫不负有心人,最终成功解决,下面写一下我的解决方法. 我传的数据是json类型的,执行失败的回调函数是因为从后台传过来的数据不是严格的json类型,所以才会不执 ...

  6. 2.13 Hive中自带Function使用及自定义UDF编程

    UDF:User Definition Function 一.function #查看自带的函数 hive (db_hive)> show functions; #查看一个函数的详细用法 hiv ...

  7. 洛谷 - SP3871 GCDEX - GCD Extreme - 莫比乌斯反演

    易得 $\sum\limits_{g=1}^{n} g \sum\limits_{k=1}^{n} \mu(k) \lfloor\frac{n}{gk}\rfloor \lfloor\frac{n}{ ...

  8. Legacy C++ MongoDB Driver

    https://docs.mongodb.com/ecosystem/drivers/cpp/

  9. HDU3065【AC自动机-AC感言】

    Fourth AC zi dong ji(Aho-Corasick Automation) of life 9A(其实不止交了10发...) 感言: 一开始多组数据这种小数据还是...无伤大局,因为改 ...

  10. js函数和变量的执行顺序【易错】

    js函数和变量的声明与执行顺序 一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); // ...