转载:GetWindowLong函数详解

转载 2007年10月11日 17:47:00

“窗口类的封装,从全局窗口消息处理到窗口对象消息处理的映射方法:

  对界面进行封装,一般都是一个窗口一个类,比如实现一个最基本的窗口类CMyWnd,你一定会把窗口过程作为这个类的成员函数,但是使用WINAPI创建窗口时必须注册类WNDCLASS,里面有个成员数据lpfnWndProc需要WNDPROC的函数指针,一般想法就是把窗口类的消息处理函数指针传过去,但是类成员函数除非是静态的,否则无法转换到WNDPROC,而全局的消息处理函数又无法得到窗口类对象的指针。这里有几种解决办法:

  一种解决方法是用窗口列表,开一个结构数组,窗口类对象创建窗口的时候把窗口HWND和this指针放入数组,全局消息处理函数遍历数组,利用HWND找出this指针,然后定位到对象内部的消息处理函数。这种方法查找对象的时间会随着窗口个数的增多而增长。

  另一种方法比较聪明一点,WNDCLASS里面有个成员数据cbWndExtra一般是不用的,利用这点,注册类时给该成员数据赋值,这样窗口创建时系统会根据该值开辟一块内存与窗口绑定,这时把创建的窗口类的指针放到该块内存,那么在静态的窗口消息循环函数就能利用GetWindowLong(hWnd,GWL_USERDATA)取出该指针,return (CMyWnd*)->WindowProc(...),这样就不用遍历窗口了。但是这样一来就有个致命弱点,对窗口不能调用SetWindowLong(hWnd,GWL_USERDATA,数据),否则就会导致程序崩溃。幸好这个函数(特定这几个参数)是调用几率极低的,对于窗口,由于创建窗口都是调用窗口类的Create函数,不用手工注册WNDCLASS类,也就不会调用SetWindowLong函数。但是毕竟缺乏安全性,而且当一秒钟内处理的窗口消息很多时,这种查找速度也可能不够快。

创建窗口时: SetWindowLong( m_hWnd, GWL_USERDATA, (LONG) this );

 

函数功能描述:用这个函数能够获得指定窗口的信息

函数原型:
LONG GetWindowLong( HWND hWnd,int nIndex )

参数:
hWnd:指定窗口的句柄
nIndex:需要获得的信息的类型
     值            功能

nIndex取值如下:
GWL_EXSTYLE    得到扩展的窗口风格
GWL_STYLE      得到窗口风格
GWL_WNDPROC    得到窗口回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用
GWL_HINSTANCE  得到应用程序运行实例的句柄
GWL_HWNDPARENT 得到父窗口的句柄
GWL_ID         得到窗口的标识符
GWL_USERDATA   得到和窗口相关联的32位的值(每一个窗口都有一个有意留给创建窗口的应用程序是用的32位
               的值)

当hWnd标识一个对话框时可以使用下面的值
Value Action
DWL_DLGPROC   得到对话框回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用
DWL_MSGRESULT 得到对话框回调函数中消息处理过程的返回值
DWL_USER      得到额外的应用程序私有信息,如一些句柄和指针等

返回值:
成功时,返回一个请求的32位的值
失败时,返回0,可以使用GetLastError来取得错误信息

示例:
long nStyle = ::GetWindowLong(hWnd, GWL_STYLE);   // hWnd是一个编辑框的句柄
if(nStyle & ES_PASSWORD)
{
    AfxMessageBox("这是一个密码域");
}

 

C++ 中malloc函数详解(转载)

一、原型:extern void *malloc(unsigned int num_bytes);头文件:#include 或 #include (注意:alloc.h 与 malloc.h 的内...
  • sinat_27456831
  • sinat_27456831
  • 2016年03月09日 14:13
  • 12299

【c/c++】类型转换函数(类型转换运算符重载函数)

用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。 C++提供类型转换函数(ty...
  • lzm18064126848
  • lzm18064126848
  • 2016年01月04日 18:09
  • 2613

[转]sprintf函数用法详解

sprintf() 格式化输出函数(图形) 功能: 函数sprintf()用来作格式化的输出。 用法: 此函数调用方式为int sprintf(char *string,char *format,...
  • hailmy
  • hailmy
  • 2014年07月04日 18:11
  • 12231

GetWindowLong函数(最好的解释资料,绝对值得一看,此函数在子类化技巧时候经常用到)

今天在看一个代码里头写了GetWindowLong (hwnd, 0),我当时就有点费解,靠,上网 搜索函数原型说明,死活找不到第2个参数为0是指什么,MD,很恼火,最近终于在一个 国外网站找到,...
  • zwb8848happy
  • zwb8848happy
  • 2012年03月30日 13:10
  • 2100

GetWindowLong函数

原作者:好好学习,天天向上地址:http://blog.csdn.net/hnhyhongmingjiang/archive/2008/03/06/2154410.aspx 函数功能描述:用这个函数能...
  • vlily
  • vlily
  • 2011年05月23日 10:16
  • 325

GetWindowLong函数(最好的解释资料,绝对值得一看,此函数在子类化技巧时候经常用到)

原文链接 今天在看一个代码里头写了GetWindowLong (hwnd, 0),我当时就有点费解,靠,上网 搜索函数原型说明,死活找不到第2个参数为0是指什么,MD,很恼火,最近终于在一个 国...
  • feidegengao
  • feidegengao
  • 2013年01月22日 12:45
  • 1292

GetWindowLong函数(最好的解释资料,绝对值得一看,此函数在子类化技巧时候经常用到)

今天在看一个代码里头写了GetWindowLong (hwnd, 0),我当时就有点费解,靠,上网 搜索函数原型说明,死活找不到第2个参数为0是指什么,MD,很恼火,最近终于在一个 国外网站找到,...
  • zhdd1234
  • zhdd1234
  • 2011年12月04日 14:59
  • 295

GetWindowLong跨进程获取WndProc、DlgProc。。。

在看雪提问,没人回答,只能自己折腾。。。 标题虽然写是GetWindowLong,其实并不是GetWindowLong,只是按照GetWindowLong的内部实现改了下而已。。 下面代码Win7...
  • a1875566250
  • a1875566250
  • 2013年01月04日 00:12
  • 1969

GetWindowLong与SetWindowLong

GetWindowLong         函数功能:该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值。   函数原型:LONG GetWindowLong(...
  • u010272085
  • u010272085
  • 2013年09月21日 20:26
  • 615

GetWindowLong() 和 SetWindowLong()

GetWindowLong()和SetWindowLong()的用法   SetWindowLong  函数功能:该函数改变指定窗口的属性.函数也将指定的一个32位值设置在窗口...
  • bpy
  • bpy
  • 2011年10月17日 23:11
  • 8134
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:转载:GetWindowLong函数详解
举报原因:
原因补充:

(最多只允许输入30个字)