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

WndProc доступ к non-static объектам

06.02.2015, 21:54. Показов 1987. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пытаюсь засунуть WndProc в класс, в итоге не получается получить доступ к non-static vector<Element>

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
class Element {
public:
    Element() { }
    HWND Hwnd;
    string Class;
    string Name;
    void(*Clicked)();
    int ID;
};
 
class Window {
 
public:
    Window(HINSTANCE);
 
    void MakeWindow(string, int, int);
 
    void CreateButton(string, string, int, int, int, int);
 
    void CreateTextBox(string, string, int, int, int, int);
 
    void ReadMessages();
 
    void CreateSignal(string, string, void(*f)());
 
private:
    static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    HWND hwnd;
    HINSTANCE hInst;
    int CurID;
    vector<Element> elements;
};
Что можете посоветовать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2015, 21:54
Ответы с готовыми решениями:

Доступ к объектам
Доброго дня! Как получить доступ к элементам управления или другим объектам (итп) которые...

Доступ к объектам
Поддскажите плз как сделать чтоб эта ф-ция function change(){ var select =...

Получить доступ к объектам в each()
Здравствуйте, я новичок в ajax, сильно не критикуйте. В общем возвращаю ответ сервера в виде...

Доступ к объектам sysdba
Привет Есть схема, на ней под обычным пользователем заведены какие-то объекты, и на той же схеме...

7
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
06.02.2015, 22:31 2
Можно поступить следующим образом.

1. Создаете объект Window.

2. Создаете окно (CreateWindowEx/DialogBoxParam/CreateDialogParam),
передавая указатель на только что созданный объект Window через
последний параметр функции.

3. Оконная процедура получает данный указатель в обработчике
WM_CREATE/WM_INITDIALOG (зависит от типа окна, см. документацию) и
сохраняет его во внутренних структурах через SetWindowLongPtr с
кодом GWLP_USERDATA.

После этого на приход любого оконного сообщения указатель на объект
извлекается с помощью GetWindowLongPtr+GWLP_USERDATA и далее
через этот указатель вызывается нужный метод класса Window.

Код не привожу, т.к. он очевидный.
1
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
06.02.2015, 22:43 3
Лучший ответ Сообщение было отмечено hiphone как решение

Решение

Есть 2 варианта

Вариант 1
Когда CreateWindow вызывается внутри функции класса
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
33
34
35
36
37
38
39
40
41
BOOL MyClass::Create()
{
    m_hWnd = CreateWindowEx(..........
                                        NULL,
                                        m_hInstance,
                                        this);
}
 
 
LRESULT CALLBACK MyClass::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LONG dwNewLong;
    MyClass* pWin;
 
    if(uMsg == WM_NCCREATE)
    {
        dwNewLong = (long)(((LPCREATESTRUCT)lParam)->lpCreateParams);
        SetWindowLong(hWnd, GWL_USERDATA, dwNewLong);
        return TRUE;
    }
    else
    {
        pWin = (MyClass *)GetWindowLong(hWnd, GWL_USERDATA);
    }
 
    if(pWin) return pWin->OnMessage(hWnd, uMsg, wParam, lParam);
 
    return 0;
}
 
LRESULT CALLBACK MyClass::OnMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CREATE:      OnCreate(hWnd, wParam, lParam);   break;
        case WM_PAINT:       OnPaint();                        break;
        case WM_DESTROY:     OnDestroy();                      break;
        default:             return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}

Вариант 2
Когда CreateWindow вызывается из любой точки программы.
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 MyClass::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    MyClass *pWin = (MyClass *)GetWindowLongPtr(hWnd, GWL_USERDATA);
 
    switch(uMsg)
    {
        case WM_CREATE:
        {
            pWin = new MyClass(hWnd);
            SetWindowLongPtr(hWnd, GWL_USERDATA, (LONG_PTR)pWin);
        }break;
 
        case WM_DESTROY: if(pWin) delete pWin;
        default:
            if(pWin) return pWin->OnMessage(hWnd, uMsg, wParam, lParam);
            else return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
 
    return 0;
}
 
LRESULT CALLBACK MyClass::OnMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CREATE:      OnCreate(hWnd, wParam, lParam);   break;
        case WM_PAINT:       OnPaint();                        break;
        case WM_DESTROY:     OnDestroy();                      break;
        default:             return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
Добавлено через 7 минут
вот так
2
13 / 13 / 7
Регистрация: 28.01.2012
Сообщений: 549
06.02.2015, 23:47  [ТС] 4
Спасибо, пробую использовать первый вариант:

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
33
34
35
36
37
38
39
40
LRESULT CALLBACK Window::WndProc(HWND ahwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_COMMAND:
        for (int i = 0; i < elements.size(); i++) {
            if (LOWORD(wParam) == elements[i].ID)
                elements[i].Clicked();
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(ahwnd, msg, wParam, lParam);
        break;
    }
 
    return 0;
}
 
LRESULT CALLBACK Window::WndProc2(HWND ahwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    LONG dwNewLong;
    Window* pWin;
 
    if (msg == WM_NCCREATE)
    {
        dwNewLong = (long)(((LPCREATESTRUCT)lParam)->lpCreateParams);
        SetWindowLong(ahwnd, GWL_USERDATA, dwNewLong);
        return TRUE;
    }
    else
    {
        pWin = (Window *)GetWindowLong(ahwnd, GWL_USERDATA);
    }
 
    if (pWin) return pWin->WndProc(ahwnd, msg, wParam, lParam);
 
    return 0;
}
Форма создается, но не появляется и все зависает, идут постоянные сообщения с кодом 15
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
07.02.2015, 06:04 5
Откудаж я знаю что ты там наворотил
0
13 / 13 / 7
Регистрация: 28.01.2012
Сообщений: 549
07.02.2015, 11:55  [ТС] 6
Посмотрите, пожалуйста
Вложения
Тип файла: rar Source.rar (1.7 Кб, 13 просмотров)
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
07.02.2015, 13:27 7
Потому что ты скопировал код коряво, где this в CreateWindow ?
1
13 / 13 / 7
Регистрация: 28.01.2012
Сообщений: 549
07.02.2015, 13:40  [ТС] 8
Спасибо, все заработало
0
07.02.2015, 13:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2015, 13:40
Помогаю со студенческими работами здесь

Доступ к дочерним объектам TableView
Как получить доступ к дочерним объектам TableView ?

Доступ к объектам в другом фрейме
Есть страничка с двумя фреймами. Мне надо чтоб при действиях в одном фрейме (например клике) - во...

Доступ к объектам из другого класса
ДД! В одном классе есть двумерный массив кнопок, унаследованных от QPushButton. Есть другой...

Доступ к объектам другого класса
Доброго времени суток, дамы и господа! Создала модель трехразрядного счётчика (три класса: Main,...


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

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