Используйте член класса как WNDPROC / DLGPROC с или без глобального

Я продолжу и подведу итоги, как я могу использовать диалоговую процедуру, которая является членом класса? Я создаю класс оболочки окна, ноCreateDialogParam нужна процедура глобального диалога, поэтому я попробовал этот обходной путь:

Я сделал немного поиска по этой теме. Я делаюDialog класс, который я подкласс, чтобы сделатьCMainWnd а затем создать экземпляр этого. вDialog класс у меня есть функция-член, определенная какINT_PTR CALLBACK Dialog::cb_proc(HWND,UINT,WPARAM,LPARAM), Теперь я знаю, что окна должны иметь глобальную функцию в качестве процедуры обратного вызова.

Итак, я сделалstd::map<HWND,Dialog*> DlgProcs map, чтобы связать дескриптор окна диалогов с указателем класса Dialog.

ИINT_PTR CALLBACK DlgMainProc(HWND,UINT,WPARAM,LPARAM) чтобы я мог передать этоCreateDialogParam(), В телеDlgMainProc(...) Я ищу карту для использованияhWnd параметр, чтобы найтиDialog* и вернуть егоcb_proc(..) член.

Моя проблема в том, что ни одно из сообщений не обрабатывается, это потому, что процедура-член в моемDialog класс никогда не вызывается. Хотя когда я ставлюMessageBox() вDlgMainProc внутриif (DlgProcs.find(hWnd) != DlgProcs.end()) { утверждение, окно сообщения отображается снова и снова, пока мне не придется прервать программу из Visual Studio 2008. Что говорит мне, что она находитhWnd в моей карте. Странная вещь, это также делает это, если я помещаю это вelse заявление после этого, что противоречиво говорит мне, что это не найтиhWnd на карте.

Если я помещу окно сообщения вcb_proc функция-член не отображается вообще. Но при этом я никогда не получаю никаких ошибок компилятора, компоновщика или времени выполнения. Когда я удаляю из него окно сообщения (так как не нужно было прерывать программу, это было только для целей отладки), программа запускается, но сообщения не обрабатываются, кнопка X не закрывает программу, нажатия кнопок не делают ничего.

Вот код PasteBin:http://pastebin.com/GsGUBpZU Кстати, у меня нет проблем с подклассами этого, мое окно создано нормально, просто сообщения не обрабатываются,cb_proc просто никогда не звонят.

EDIT: Вот соответствующие части кода

map<HWND,Dialog*> 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?

Ответы на вопрос(3)

Ваш ответ на вопрос