【win32学习】对GetWindowLong(hwnd, 0)和SetWindowLong(hwnd, 0, 0)的学习理解
来源:互联网 发布:淘宝卖充值卡进货渠道 编辑:程序博客网 时间:2024/04/30 19:00
阅读Windows程序设计第5版中的CHECKER3.c程序时,对于GetWindowLong(hwnd, 0)和SetWindowLong(hwnd, 0, 0)不太理解
CHECKER3部分代码:
case WM_CREATE : <span style="color:#ff0000;">SetWindowLong (hwnd, 0, 0) </span>; // on/off flag return 0 ; case WM_LBUTTONDOWN : <span style="color:#ff0000;"> SetWindowLong (hwnd, 0, 1 ^ GetWindowLong (hwnd, 0)) ;</span> InvalidateRect (hwnd, NULL, FALSE) ; return 0 ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; Rectangle (hdc, 0, 0, rect.right, rect.bottom) ; if (<span style="color:#ff0000;">GetWindowLong (hwnd, 0)</span>) { <span style="white-space:pre"></span>//..... }对于第二个参数为什么为0,网上搜了度娘搜了很多也没有满意答案,后来仔细看MSDN终于理解了,看MSDN关于SetWindowLong说明
SetWindowLong是一个Windows API函数。该函数用来改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。
LONGSetWindowLong(
HWND
hWnd,
//handletowindow
int
nlndex,
//offsetofvaluetoset
LONG
dwNewLong
//newvalue
);
hWnd 窗口句柄及间接给出的窗口所属的类
nlndex
度娘找了很多资料都没看明白,其实msdn已经说的很清楚了,只是我第一遍看得不仔细没看懂,SetWindowLong和GetWindowLong其实是操作额外存储空间的值,同时windows也设置了一些负数的宏让这个额外空间具有相应的含义,在CHECKER3程序中用wndclass.cbWndExtra = sizeof(long);指定了额外存储空间为4个字节,第二个参数为0则SetWindowLong将第三个参数的值放入额外空间偏移为0的位置,32位值刚好占据了分配的4个字节,msdn里面说了最大偏移量为额外空间大小减4,所以第二个参数的偏移量最大值为0,如果设置1、2等函数就会返回错误0.
不过如果你增大额外存储空间大小,就可以增加偏移量的范围,比如wndclass.cbWndExtra = 2*sizeof(long); 则偏移量的范围就可以设置成(0-4)。
SetWindowLong设置值放入偏移处4个字节的存储空间,可以测试一下:
case WM_CREATE :SetWindowLong (hwnd, 3, 1) ; // on/off flagreturn 0 ;//......case WM_PAINT:hdc = BeginPaint(hwnd, &ps);offsetValue0 = GetWindowLong(hwnd, 0); //获取偏移量0的值offsetValue1 = GetWindowLong(hwnd, 1); //获取偏移量1的值offsetValue2 = GetWindowLong(hwnd, 2); //获取偏移量2的值offsetValue3 = GetWindowLong(hwnd, 3); //获取偏移量3的值TextOut(hdc, 0, 0, szBuffer, wsprintf(szBuffer, TEXT("%d"), offsetValue0));TextOut(hdc, 0, 20, szBuffer, wsprintf(szBuffer, TEXT("%d"), offsetValue1));TextOut(hdc, 0, 40, szBuffer, wsprintf(szBuffer, TEXT("%d"), offsetValue2));TextOut(hdc, 0, 60, szBuffer, wsprintf(szBuffer, TEXT("%d"), offsetValue3));EndPaint(hwnd, &ps);return 0;
结果为:16777216
65536
256
1
SetWindowLong(hwnd, 3, 1)将偏移量3的空间设置为1,即是将额外存储空间第24位设置为1,相对于偏移量0的位置是第24位,相对偏移量1的位置是第16位,相对于偏移量2的位置是第8位,所以用GetWindowLong获得以上结果。
- 【win32学习】对GetWindowLong(hwnd, 0)和SetWindowLong(hwnd, 0, 0)的学习理解
- GetWindowLong (hwnd, 0)
- SetWindowLong(hwnd,GWL_USERDATA,lParam); puser1=(PUserInfo)GetWindowLong(hwnd,GWL_USERDATA);
- GetWindowLong() 和 SetWindowLong()
- GetWindowLong 和 SetWindowLong函数
- GetWindowLong() 和 SetWindowLong()
- 怎么获得主窗口的CWnd*?怎么把CWnd*变成HWND?怎么给HWND发送WM_USER消息?SendMessage(hwnd,WM_USER,0,0);可是主窗口接收不到
- GetMessage和PeekMessage的区别及PostMessage(hWnd, WM_QUIT, 0, 0)消息
- SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)"ccc");
- Hwnd和Handle的区别
- hdc和hwnd的区别
- CWnd和HWND的区别
- HINSTANCE和HWND的区别
- win32 API窗口句柄 HWND
- win32 api HWND去除边框
- SetWindowLong GetWindowLong
- InvalidateRect(HWND) 与 ValidateRect(HWND)的区别
- InvalidateRect(HWND) 与 ValidateRect(HWND)的区别
- Ubuntu 查找文件夹中内容包含关键字的文件
- 安卓与互联网连接之HTTTP请求
- count的初始化和count++的位置很重要
- c++接触到的error(不定期更新中)
- 使用Scroller制作滑块开关ToggleButton
- 【win32学习】对GetWindowLong(hwnd, 0)和SetWindowLong(hwnd, 0, 0)的学习理解
- org.hibernate.tool.hbm2ddl.SchemaUpdate execute ERROR: HHH000319: Could not get database metadata
- VirtualBox VMware Accelerated AMD PCNet Adapter驱动问题)
- Linux普通账户下使用svn进行版本管理
- C# winform 查找指定节点值
- NYOJ 570 欧拉函数求和【欧拉函数求和】
- 二、struts2.0相关配置问题
- Tomcat启动报Error listenerStart错误
- Vs2010无法打开文件“Kernel32.lib”、无法打开“libcpmt.lib”"msvcprt.lib"