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

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте, пытаюсь засунуть 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.02.2015, 21:54
Ответы с готовыми решениями:

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

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

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

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

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
Лучший ответ Сообщение было отмечено 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  [ТС]
Спасибо, пробую использовать первый вариант:

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
Откудаж я знаю что ты там наворотил
0
13 / 13 / 7
Регистрация: 28.01.2012
Сообщений: 549
07.02.2015, 11:55  [ТС]
Посмотрите, пожалуйста
Вложения
Тип файла: rar Source.rar (1.7 Кб, 19 просмотров)
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
07.02.2015, 13:27
Потому что ты скопировал код коряво, где this в CreateWindow ?
1
13 / 13 / 7
Регистрация: 28.01.2012
Сообщений: 549
07.02.2015, 13:40  [ТС]
Спасибо, все заработало
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2015, 13:40
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru