写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. es6 import 报错

    现在绝大多数的浏览器都不支持ES6,所以使用es6时需要使用bebal把es6转化为es5, 项目目录: demo1:单个js文件的转化 src文件下的 test1.js const aa=" ...

  2. ASP.NET Core会议管理平台实战_汇总贴

    ASP.NET Core会议管理平台实战 课程地址:https://ke.qq.com/course/389673?from=800004097#term_id=100464670 ASP.NET C ...

  3. ecplise常见的一些问题

    修改注释的字体,默认的字体太小了.

  4. HDU - 3410 Passing the Message 单调递减栈

    Passing the Message What a sunny day! Let’s go picnic and have barbecue! Today, all kids in “Sun Flo ...

  5. laravel定义全局变量并输出(实例)

    在config目录创建一个 bl.php ,内容如下 <?php return [ 'IND' => "1321232", 'das' => "奥术大师 ...

  6. Unity2016 Unity3D开发VR游戏的经验

    http://z.youxiputao.com/articles/8313 在4月12日的Unite 2016大会上,暴风魔镜高级产品经理吴涛分享他用Unity3D开发VR游戏的经验,以下为分享实录: ...

  7. hoj2665 Factory of XiaoE

    Factory of XiaoE My Tags   (Edit)   Source : zhouguyue & lilu0355 & xiaoE   Time limit : 1 s ...

  8. Java 虚拟机(Java Virtual Machine)

    Java 编译器将 Java 程序编译成虚拟机能够识别的二进制代码,这种代码称为字节码(Bytecode).字节码就是虚拟机的机器指令,它与平台无关,有统一的格式,不依赖于具体的硬件环境,只运行在 J ...

  9. 快速对接payjs的个人支付接口(收银台模式)

    近期在了解个人支付接口,希望能解决我在微信上支付的问题.找了很多平台对比再三,感觉payjs比较专业,其它多是模仿payjs的东西.同时支持支付宝和微信,由于本人支付宝还没开通(需要有一定流量才给开通 ...

  10. Java并发编程面试题1

    package com.mozq.thread.producer2; /* * 面试题2:以下代码是否存在错误 class ThreadTest implements Runnable{ public ...