c语言Wndproc未定义,c – 使用类成员作为WNDPROC / DLGPROC,有或没有全局

我将继续并对此进行总结,如何使用作为类成员的对话程序?我正在创建一个窗口包装类,但CreateDialogParam需要一个全局对话框程序,所以我尝试了这个解决方法:

我已经对这个主题进行了一些搜索.我正在创建一个Dialog类,我将其子类化为一个CMainWnd然后实例化它.在Dialog类中,我有一个成员函数,定义为INT_PTR CALLBACK Dialog :: cb_proc(HWND,UINT,WPARAM,LPARAM).现在,我知道windows必须具有全局函数作为回调过程.

所以我做了一个std :: map< HWND,Dialog *> DlgProcs映射将对话框窗口句柄与其Dialog类指针相关联.

和INT_PTR CALLBACK DlgMainProc(HWND,UINT,WPARAM,LPARAM)所以我可以将它传递给CreateDialogParam().在DlgMainProc(…)的主体中,我搜索地图以使用hWnd参数找到Dialog *并返回其cb_proc(..)成员.

我的问题是没有消息得到处理,这是因为我的Dialog类中的成员过程永远不会被调用.即使我在DlgMainProc中将一个MessageBox()放在if(DlgProcs.find(hWnd)!= DlgProcs.end()){语句中,也会一遍又一遍地显示消息框,直到我不得不从Visual中止程序Studio 2008.这告诉我它正在我的地图中找到hWnd.奇怪的是,如果我把它放在else语句之后它也会这样做,这相反地告诉我它没有在地图中找到hWnd.

如果我在cb_proc成员函数中放入一个消息框,它根本不会显示.但在此期间,我从未得到任何编译器,链接器或运行时错误.当我从中删除消息框(因为不必中止程序,它只是为了调试目的)程序运行但没有消息得到处理,X按钮不关闭程序,按钮单击不执行任何操作.

这是PasteBin代码:http://pastebin.com/GsGUBpZU

顺便说一句,我没有问题继承这个,我的窗口创建正常,只是没有处理消息,cb_proc永远不会被调用.

编辑:这是代码的相关部分

map g_DlgProcs;

INT_PTR CALLBACK g_MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {

if (g_DlgProcs.find(hWnd) != g_DlgProcs.end()) {

Alert("blah"); // Gets executed repeatedly

return g_DlgProcs[hWnd]->cb_proc(hWnd, msg, wParam, lParam);

} else {

Alert("blah"); // Removing the above alert, this gets

// executed repeatedly, erm, as well.. O.o strange

return FALSE;

}

}

Dialog::Dialog(int id, HWND parent /* = HWND_DESKTOP */) {

_id = id;

_parent = parent;

// Tried this before CreateDialogParam

g_DlgProcs.insert(make_pair(_handle, this));

_handle = CreateDialogParam(

(HINSTANCE)GetModuleHandle(NULL),

MAKEINTRESOURCE(id), _parent,

(DLGPROC)g_MainDlgProc, NULL

);

// Then tried it after CreateDialogParam

g_DlgProcs.insert(make_pair(_handle, this));

}

INT_PTR CALLBACK Dialog::cb_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {

Alert("blah"); // Never gets executed

bool handled = true;

switch (msg)

{

case WM_INITDIALOG:

OnInitialize();

break;

case WM_COMMAND:

if (HIWORD(wParam) == 0 || HIWORD(wParam) == 1) {

OnMenuCommand((HIWORD(wParam) == 1), (int)LOWORD(wParam));

} else {

OnCtrlCommand((int)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam);

}

break;

case WM_NOTIFY:

{

LPNMHDR head = (LPNMHDR)lParam;

OnNotification(head->code, head->idFrom, head->hwndFrom);

}

break;

case WM_CLOSE:

OnClose(); // DestroyWindow(_handle)

break;

case WM_DESTROY:

OnDestroy(); // PostQuitMessage(0)

default:

handled = ProcessMsg(msg, wParam, lParam);

}

// Convert bool to Windows BOOL enum

return ((handled == true) ? TRUE : FALSE);

}

有谁知道为什么它永远不会被召唤?或者只是引导我使用成员函数作为DLGPROC的另一种方式?

解决方法:

我尝试了你的代码并且它有效:cb_proc被调用.您将错过在CreateDialogParam返回之前发送的任何消息(例如WM_INITDIALOG).

您可以通过在g_MainDlgProc中将窗口句柄和对象添加到地图来解决后一个问题.如果您收到未知窗口的消息,则表示它属于您正在创建的窗口;将对象放在全局中,您可以将句柄/对象添加到地图中.

标签:wndproc,c,wrapper,winapi,callback

来源: https://codeday.me/bug/20191002/1844668.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值