在类中包装窗口过程
Wrapping up a Window Procedure in a class
我想为透明 WinAPI 标签创建一个简单的C++类(使用标准的"静态"类实现)。为此,我创建了一个静态控件,并将其窗口过程重写为以下控件:
LRESULT CALLBACK WndProc_Override(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
if (Message == WM_PAINT)
{
RECT rc;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rc);
SetBkMode(hdc, TRANSPARENT);
DrawText(hdc, Text, strlen(Text), &rc, DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
}
return CallWindowProc(WndProc_Original, hwnd, Message, wparam, lparam);
}
代码取自 Edward Clements 对这个问题的出色回答: C++ Win32 静态控制透明背景
我想把它包装在一个C++类中,这样我就不必为我想在程序中使用的每个标签创建一个新的窗口过程。我希望被覆盖的窗口过程是一个成员函数,然后使用 this
来使用标签实例的存储数据(要显示的文本,如下所示:DrawText(hdc, this->Text, strlen(this->Text), &rc, DT_CENTER | DT_VCENTER);
)
但是,成员函数要求this
作为第一个参数传递,而由于这是一个回调,因此我无法控制 Windows 如何调用该函数。
有没有其他方法可以将其包装在一个紧凑的类中,这样我就不必为每个标签创建单独的窗口过程?
您可以将指针存储在文本字段的用户数据中:
myTextField->hWnd = CreateWindow( /*parameters*/ );
SetWindowLongPtr(myTextField->hWnd, GWLP_USERDATA, (LONG_PTR)myTextField);
在窗口进程内:
LRESULT CALLBACK WndProc_Override(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
MyTextFieldClass * myTextField = (MyTextFieldClass *)GetWindowLongPtr(hWnd,GWLP_USERDATA);
/* rest of method */
}
如果您需要在窗口构建期间访问您的类,您可以通过以下方式执行此操作:
HWND myTextField = CreateWindow( /*normal parameters*/, myTextField);
并在像这样WM_CREATE期间检索它:
LRESULT CALLBACK WndProc_Override(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
if (WM_CREATE == Message)
{
LONG_PTR myPtr = (LONG_PTR)((CREATESTRUCT *)lparam)->lpCreateParams;
SetWindowLongPtr(hwnd, GWLP_USERDATA, myPtr);
MyTextfieldClass * myTextField = (MyTextfieldClass *)myPtr;
}
}
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- 如何在窗口过程方法中检测击键?
- 如何拒绝一个叫做的过程以写入继承的控制台窗口
- 在窗口过程包装器中阅读访问违规
- 查询/查找启动过程窗口
- 背景过程没有窗口
- 窗口/对话框过程可以在名称空间中吗
- 在类中包装窗口过程
- 挂接WH_CALLWNDPROC后未获取窗口过程消息
- WNDPROC窗口回调过程中接收到的句柄与CreateWindow返回的句柄之间的差异
- 在运行时更改HWND窗口过程
- 消息处理程序未调用窗口过程
- 静态指针不会在子类化窗口过程中初始化?
- 我可以有主窗口过程作为一个lambda在WinMain