Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 12.03.2015
Сообщений: 24
1

Указатель на функцию LRESULT _stdcall WndProc

09.07.2016, 12:00. Показов 1399. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь сделать единую функцию создания дочерних окон. Одна проблема в том, что для каждого окна нужна своя WndProc. В примере ниже, пытаюсь передать ее через указатель на функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
LRESULT CALLBACK LogInDlg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC         hdc;
    LPCWSTR     name;
    LPCWSTR     password;
    SIZE        nameWH;
    LRESULT (_stdcall *p)(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    p = WndProc1;
 
    switch (message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT));
        name     = L"Имя Фамилия:";
        password = L"Ваш пароль:";
        TextOut(hdc, 8, 4, name, 12);
        GetTextExtentPoint32W(hdc, name, 12, &nameWH);
        TextOut(hdc, 8, nameWH.cy + 4 + 12, password, 15);
        UniWind enterText1(p, hWnd, hInst, L"enterText1", RGB(253,253,253),
            nameWH.cx + 8 + 10, 4, NULL, 150, 25);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Но тут возникает три ошибки:
1. Switch ругается: Передача управления в обход инициализации(не понимаю, что это значит вообще)
2. Указатель p: отсутствуют экземпляры конструктора WndProc1, соответствующие списку аргументов:...
3. Это по-моему несовместимый calling conversion, когда LRESULT не может преобразоваться в WNDPROC.
Что посоветуете?

Добавлено через 12 часов 33 минуты
Вопрос решен. Пример кода:
C++
1
2
3
4
5
6
7
8
                TextOut(hdc, 8, 4, name, 12);
        GetTextExtentPoint32W(hdc, name, 12, &nameWH);
        TextOut(hdc, 8, nameWH.cy + 4 + 12, password, 15);
        EndPaint(hWnd, &ps);
        {
            UniWind enterText1("WndProc1", hInst, L"enterText1", RGB(150,150,150));
            enterText1.InitInstance(nameWH.cx + 8 + 10, 4, 150, 25, hWnd, hInst, NULL);
        }
1. Как видите, чтобы switch, if else, while не ругались, всего-то нужно отдельную память выделить посредством круглых скобок.
2. Я разделил функцию на 2 части, потому что похоже я не могу сделать ее больше чем с 10 параметрами.
А чтобы решить какую WndProc использовать я сделал так:
C++
1
2
if (wndproc == "WndProc1") loginWND.lpfnWndProc = WndProc1;
else if(wndproc == ...)... и т.д.
Всего-то передаю текстовую строку. И теперь calling conversion не ругается. Вообще говорят, что можно его обходить, но если VS не нравится, я думаю, лучше этого не делать.
Интересно, мой указатель смог бы работать в другом месте?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2016, 12:00
Ответы с готовыми решениями:

Ivalid conversion from 'LRESULT' to 'WNDPROC'
Не понимаю, почему не хочет компилиться#include <windows.h> LRESULT WINAPI WndProc(HWND, UINT,...

error C2440: не конвертируется 'LRESULT (__stdcall General::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'
Здравствуйте! Подскажите, пожалуйста, как исправить эту ошибку в этой строчке: ...

Error C2440: =: невозможно преобразовать "LRESULT (__cdecl *)(HWND,UINT,UINT,LONG)" в "WNDPROC"
MV Studio Express 2012. Для преобразования требуется reinterpret_cast, приведение в стиле С или...

Используя соглашение stdcall вызвать функцию на ассемблере
надо используя соглашения stdcall вызвать функцию на ассемблере и используя соглашения cdecl и...

1
Заблокирован
09.07.2016, 15:23 2
C#
1
2
UniWind enterText1(p, hWnd, hInst, L"enterText1", RGB(253,253,253),
            nameWH.cx + 8 + 10, 4, NULL, 150, 25);
так незя в свиче.


C#
1
2
enterText1 = UniWind(p, hWnd, hInst, L"enterText1", RGB(253,253,253),
            nameWH.cx + 8 + 10, 4, NULL, 150, 25);
Добавлено через 10 минут
enterText1 = UniWind();
Цитата Сообщение от supvlmail Посмотреть сообщение
EndPaint(hWnd, &ps);
* * * * {
* * * * * * UniWind enterText1("WndProc1", hInst, L"enterText1", RGB(150,150,150));
* * * * * * enterText1.InitInstance(nameWH.cx + 8 + 10, 4, 150, 25, hWnd, hInst, NULL);
* * * * }
а смысл ? теперь enterText1 в области видимости твоих скобок.

такие вещи лучше делать глобальными.

___________________

а так че не пашет ?

C++
1
LRESULT (*p)(HWND , UINT , WPARAM , LPARAM ) = WndProc1;
1
09.07.2016, 15:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2016, 15:23
Помогаю со студенческими работами здесь

Передача дополнительного аргумента в функцию stdcall/cdecl?
Всем доброго дня! Есть функция func вида: __stdcall void func() { cout<<"func"<<endl;...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая...

Передача параметров в функцию WndProc
Начал осваивать WinAPI и столкнулся со следующей проблемой - необходимо передать в качестве...

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru