Windows Api编程开发记录

该博文皆在于记录在Windows api开发过程中遇到的一些函数以及用法

reinterpret_cast(expression)

这是在setWindowLongPtr函数运用的同时需要用到的转换符

reinterpret_cast是C++中的一个强制类型转换运算符,类似的还有static_castreinterpret_castconst_castdynamic_cast

reinterpret_cast用于进行无关类型之间的转换,会产生一个新值与原始参数的比特位完全相同,它是一个编译时的命令,用于指示编译器将表达式视为具有new_type的类型

使用场景:

  • 指针类型到足够大的整数类型
  • 整数类型或枚举类型到指针类型
  • 指向函数的指针到另一个不同类型的指向函数的指针
  • 指向对象的指针到另一个不同类型的指向对象的指针
  • 指向类函数成员的指针到另一个指向不同类型的函数成员的指针
  • 指向类数据成员的指针到另一个指向不同类型的数据成员的指针

SetWindowLongPtr及GetWindowLongPtr函数

SetWindowLongPtr

这个函数是参考Notepad++的源代码看到的。遇到的一个问题是窗口在注册时需要一个回调函数,但是这个回调函数在封装的对象中是static属性,这也就导致了这个回调函数不能访问对象的窗口句柄。而Notepad++中还定义了一个回调函数runProc用于处理和窗口自身句柄有关的东西,同时也在窗口创建的create函数或是WM_NCCREATE消息中用到了这个函数。

1
2
::SetWindowLongPtr(_hSelf, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this));
_tabBarDefaultProc = reinterpret_cast<WNDPROC>(::SetWindowLongPtr(_hSelf, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(TabBarPlus_Proc)

API文档描述:Changes an attribute of the specified window. The function also sets a value at the specified offset in the extra window memory.

函数句法:

1
2
3
4
5
LONG_PTR SetWindowLongPtrA(
HWND hWnd,
int nIndex,
LONG_PTR dwNewLong
);

hWnd自然是要修改的窗口的句柄,nIndex是偏移量,而不同的偏移量有不同的意义,参考SetWindowLongPtrA function

上面代码中的GWLP_USERDATA代表偏移量为-21,用于设置与窗口关联的数据

其代码意义在于将对象自身的指针转换后存入窗口的对应偏移量处,而在static类的WinProc回调函数中获取该对象指针以调用其runProc函数,以实现窗口对消息的响应

该函数在调用成功之后会返回一个指定偏移量的前一个值,否则返回0

GetWindowLongPtr

Retrieves information about the specified window. The function also retrieves the value at a specified offset into the extra window memory.

函数句法:

1
2
3
4
LONG_PTR GetWindowLongPtrA(
HWND hWnd,
int nIndex
);

该函数用于检索对应偏移量中存储的值,在函数调用成功的情况下会返回所请求的值。

用于与SetWindowLongPtr函数搭配使用,在存储指针之后,使用该函数获取指针用以调用,在notepad++中的例子:

1
2
3
4
pSplitterContainer = (SplitterContainer *)::GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (!pSplitterContainer)
return ::DefWindowProc(hwnd, message, wParam, lParam);
return pSplitterContainer->runProc(message, wParam, lParam)