SetWindowLong()和 GetWindowLong() 使用解详

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SetWindowLong()和 GetWindowLong() 使用解详相关的知识,希望对你有一定的参考价值。

OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll
[i],GWL_WNDPROC, (LONG)ScrollProc ) ;

i = GetWindowLong ((HWND) lParam, GWL_ID) ;

问题:
1:详细说明SetWindowLong各个参数的作用,特别是第二和第三个参数重点说明一下:为什么要写 GWL_WNDPROC,而不能写GWL_ID;还有第三个参数为什么要写 ScrollProc 这个 LRESULT CALLBACK类型 函数,换其它类型的函数就不行,为什么加(WNDPROC)这个宏.
2,GetWindowLong 这个函数是取得的什么值,还能取得其它的值吗?

//部分源码
for (i = 0 ; i < 3 ; i++)

// The three scroll bars have IDs 0, 1, and 2, with
// scroll bar ranges from 0 through 255.

hwndScroll[i] = CreateWindow (TEXT ("scrollbar"), NULL,
WS_CHILD | WS_VISIBLE |
WS_TABSTOP | SBS_VERT,
0, 0, 0, 0,
hwnd,
(HMENU) i,
hInstance,
NULL) ;

SetScrollRange (hwndScroll[i], SB_CTL, 0, 255, FALSE) ;
SetScrollPos (hwndScroll[i], SB_CTL, 0, FALSE) ;

// The three color-name labels have IDs 3, 4, and 5,
// and text strings "Red", "Green", and "Blue".

hwndLabel [i] = CreateWindow (TEXT ("static"), szColorLabel[i],
WS_CHILD | WS_VISIBLE | SS_CENTER,
0, 0, 0, 0,
hwnd, (HMENU) (i + 3),
hInstance, NULL) ;

// The three color-value text fields have IDs 6, 7,
// and 8, and initial text strings of "0".

hwndValue [i] = CreateWindow (TEXT ("static"), TEXT ("0"),
WS_CHILD | WS_VISIBLE | SS_CENTER,
0, 0, 0, 0,
hwnd, (HMENU) (i + 6),
hInstance, NULL) ;


LRESULT CALLBACK ScrollProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)

int id = GetWindowLong (hwnd, GWL_ID) ;
switch (message)

case WM_KEYDOWN :
if (wParam == VK_TAB)
SetFocus (GetDlgItem (GetParent (hwnd),
(id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ;
break ;
case WM_SETFOCUS :
idFocus = id ;
break ;

return CallWindowProc (OldScroll[id], hwnd, message, wParam,lParam) ;

1.

LONG SetWindowLong( HWND hWnd,

int nIndex,

LONG dwNewLong

);

这个函数根据nIndex的取值不同,可以实现不同的功能.

其中nInde可以取:

GWL_EXSTYLE: 设置窗口扩展风格,即CreateWindowEx的DWORD wExStyle 参数

GWL_STYLE: 设置窗口风格,即CreateWindow的DWORD dwStyle参数

GWL_WNDPROC: 设置窗口的处理函数,即RegisterClass的WNDCLASSEX的WNDPROC lpfnWndProc成员

GWL_HINSTANCE: 设置窗口所属的应用程序句柄,即RegisterClass的WNDCLASSEX的HINSTANCE hInstance成员

GWL_ID 设置窗口的ID(对于控件,就是控件ID)

GWL_USERDATA: 设置窗口的用户自定义数据

DWL_DLGPROC: 设置对话框处理函数

DWL_MSGRESULT: 设置对话框消息处理的结果值

DWL_USER: 设置扩展区域数据

你这里是要修改原窗口的回调函数,所以指定的类型为GWL_WNDPROC,参数是你自定义的回调函数名,转为LONG型,而返回值是以前的回调函数,因为是LONG型的,要强转成WNDPROC然后保存起来

2.LONG GetWindowLong(HWND hWnd,int nlndex)
第二个参数和SetWindowLong的第二个参数一样
取出对应的属性值
参考技术A LONG SetWindowLong( HWND hWnd,

int nIndex,

LONG dwNewLong

);
是用来改变和设置窗口的一些属性的,第一个参数是你窗口的句柄,第二个就是你要修改的东东 例如要修改过程处理函数 就用参数 GWL_WNDPROC 而最后一个参数就是你自己定义的过程函数的名字 但是一定要注意那个是长整形的一个类型所以要强制转化 他返回的也是一个长整形 如果你定义的是一个WNDPROC的指针 这个返回的地方同样也需要强制转化类型

VC++ SetWindowLong/GetWindowLong函数疑问

参考技术A SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
原始函数如下所示
LONG
SetWindowLong(
HWND
hWnd,
当前窗口的句柄
int
nIndex,
包含:[GWL_EXSTYLE,GWL_STYLE,GWL_WNDPROC,GWL_HINSTANCE
,GWL_ID,GWL_USERDATA]
0x80000是这些里面其中的一个的十六进行显示
LONG
dwNewLong
新的窗口显示值
);
更详细的内容你可以去查一下MSDN

以上是关于SetWindowLong()和 GetWindowLong() 使用解详的主要内容,如果未能解决你的问题,请参考以下文章

VC++ SetWindowLong/GetWindowLong函数疑问

CustomDraw 中的 SetWindowLong 导致未处理的异常

修改窗口属性(全部都是SetWindowLong设置)

从任务栏中隐藏应用程序

delphi窗体按钮灰化禁用

VC MFC中如何制作无边框窗口