VC++中窗口过程函数的wParam和lParam区别??是什么希望解析
我要告诉你的是方法,怎么去自学,而不是结论:
看到 https://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx 这里(google 搜索wm_keydown msdn第一个结果)
wParam
The virtual-key code of the nonsystem key. See Virtual-Key Codes.
wparam是非系统键的虚拟键码
lParam
The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown following.
重复的次数、扩展键旗标,上下文码,之前的按键状态旗标
下面的表格告诉你每一位的作用。
WPARAM 和 LPARAM,消息响应机制
wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数:
一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。因此根据匈牙利命名法,16位的变量就被命名为wParam, 32位的变量就被命名为lParam。
到了Win32API中,原来的16位变量也被扩展为32位,因此此时wParam和lParam的大小完全相同。
在Win32API的早期,为了保证和Win16API的代码可移植性MS定义了WPARAM和LPARAM两个宏。
当时保留了w前缀的原因一方面是由于WPARAM宏也已W开头,还有也因为要提醒程序员注意到可移植性,当然到了现在Win16早已退出历史舞台,这个前缀也就约定俗成的沿用下来了。
wParem和lParam是两个通用的参数。
在不同的消息中,作用各不相同。具体要看是哪条消息。
你可以理解为表格上的“备注”,SendMessage发送的消息如同一个表格:
发给什么窗口,消息名,备注1,备注2。
比如说对于WM_SETTEXT这个消息,它只用了lparam参数,用于传递设置的文本,而wparam传0。
WM_LBUTTONDOWN消息两个参数都用上了,wparam用来存放是否按下shift,是否同时按下ctrl,按的是鼠标哪个按钮
lparam存放的是坐标(高位低位各存x y坐标)
你要问,有时候2个参数不够怎么办,有的消息非常复杂,WM_INITDIALOG的lparam就指向了一个结构体。具体的参数还可以通过它扩展。
也有的消息,lparam wparam都不需要。
顺便说下,要学会查msdn,比如我提到的3个消息,你可以看msdn去看它们的lparam和wparam各种是干嘛的,比如WM_LBUTTONDOWN
https://msdn.microsoft.com/en-us/library/ms645607.aspx
这里就写得很清楚
Parameters
wParam
Indicates whether various virtual keys are down. This parameter can be one or more of the following values.
...
lParam
The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
//MessageBox(NULL,L"2",L"消息窗口",0);//
ValidateRect(hwnd,NULL);
break;
case WM_KEYDOWN:
if(wParam==VK_ESCAPE)
{
DestroyWindow(hwnd);
//MessageBox(NULL,L"ESC",L"消息窗口",0);//
}
break;
这里wParam接受到了按键的信息,而lparam没有,不过这个lParam是做什么用的,举个例
我刚开始接触VC++的windows编程,不是很清楚
在wparam的说明后面有个跳转,可以看到
https://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx
这里有具体的虚拟键码
比如:
VK_ESCAPE
0x1B
ESC key
就是键盘上左上角的esc。
别的你也可以类似去查,明白么?
下载一个本地的MSDN帮助文档,每个窗口过程的WPARAM和LPARAM代表不同的含义,具体需要查。
消息不同,wparam/lparam代表的含义就不一样,它们与具体的消息相关。具体请参考MSDN文档