gpt4 book ai didi

c++ - 调用 win32 API 并回调类函数

转载 作者:行者123 更新时间:2023-12-04 23:21:20 24 4
gpt4 key购买 nike

我试图通过将其放入一个类来清理一些现有的 win32 UI 代码。以前我有一个这样的 AppDlgProc 函数:

BOOL CALLBACK AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { ... }

我像这样使用:
DialogBoxParam(hInstance, (LPCTSTR)IDD_SETTINGS, 0, AppDlgProc, 0);

现在我把所有这些都放在一个 SettingsWindow 对象中,我调用 settingsWindow->show() 来启动这个:
void SettingsWindow::show(HINSTANCE hInstance) {
DialogBoxParam(hInstance, (LPCTSTR)IDD_SETTINGS, 0, &SettingsWindow::AppDlgProc, 0);
}

我很确定我在这里错误地提供了回调方法。 Visual Studio 告诉我“Intellisense:类型参数......与类型 DLGPROC 的参数不兼容”。谷歌搜索似乎告诉我似乎告诉我 I need another argument ——没有别的办法了吗?

作为引用,我的 AppDlgProc 函数现在看起来像这样:
BOOL CALLBACK SettingsWindow::AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {  ... }

最佳答案

窗口和对话框过程(以及其他 Win32 回调函数)需要是静态或全局函数——它们不能是非静态类函数。 Win32 本质上是一个基于 C 的 API,它没有隐藏的概念 this类函数需要的指针。

执行此操作的正常方法是将函数声明为静态并将指向类实例的指针存储在 window 属性中。例如,

struct SettingsWindow
{
// static wrapper that manages the "this" pointer
static INT_PTR CALLBACK AppDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_INITDIALOG)
SetProp(hWnd, L"my_class_data", (HANDLE)lParam);
else
if (uMsg == WM_NCDESTROY)
RemoveProp(hWnd, L"my_class_data");

SettingsWindow* pThis = (SettingsWindow*)GetProp(hWnd, L"my_class_data");
return pThis ? pThis->AppDlgFunc(hWnd, uMsg, wParam, lParam) : FALSE;
}

INT_PTR AppDlgFunc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// the real dialog procedure goes in here
}
};


// to show the dialog - pass "this" as the dialog parameter
DialogBoxParam(hInstance, (LPCTSTR)IDD_SETTINGS, 0, SettingsWindow::AppDlgProc,
(LPARAM)this);

关于c++ - 调用 win32 API 并回调类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25678892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com