Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
1

Передать WndProc свой параметр

25.06.2013, 18:06. Показов 2617. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть необходимость завести три обработчика окна выполняющих почти то же самое: первый будет рисовать прямоугольники, второй - круги, а третий - треугольники. При создании окна набор аргументов естественно фиксирован, как мне исхтриться и зная hwnd окна передать обработчику аргумент (желательно один раз) чтобы оно потом смотрело что надо рисовать

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
LRESULT CALLBACK WndProcRectangle(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    int windowType;//как-то инициализировать это зная hwnd окна, возможные значения = 1, 2 или 3
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
 
    switch(uMsg)
    {
    case WM_CREATE:
        windowsCount++;
        break;
 
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        switch(windowType)
        //здесь я нарисую что надо в зависимости от типа окна
        EndPaint(hWnd, &ps);
        break;
    case WM_CLOSE:
        //уменьшаем кол-во открытых окон
        ::EnterCriticalSection(&m_lock);
        windowsCount--;
        ::LeaveCriticalSection(&m_lock);
        DestroyWindow(hWnd);
        break;
    case WM_DESTROY:
        //если окон 0 то завершаем работу приложения
        ::EnterCriticalSection(&m_lock);
        if(!windowsCount)
            PostQuitMessage(0);
        ::LeaveCriticalSection(&m_lock);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }   
    return 0;
}
Подскажите пожалуйста как здесь лучше поступить, хотя у меня что-то такое предчувствие что здесь так исхитриться не получиться и придёться мне дублировать код и делать 3 WndProc'а
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2013, 18:06
Ответы с готовыми решениями:

Можно ли в WndProc передать свой параметр?
Тоесть, в оконную процедуру прилетаю всякие сообщения типа WM_LBUTTONDOWN, WM_KEYDOWN и тд, мне...

Передача дополнительных параметров в обработчик WndProc через свой класс функциями Get/SetWindowLong
Все доброго здоровья. Задумываю для себя небольшое удобство в виде разработки классов...

Для чего служит первый параметр (HWND hWnd) в функции WndProc?
// функция обработки сообщений LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM...

Окно на WinAPI, параметр функции WndProc (HWND hWnd,.)
Пытаюсь понять какое значение хранит первый параметр HWND hWnd в функции WndProc. В Windows в...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32990 / 21296 / 8180
Регистрация: 22.10.2011
Сообщений: 36,589
Записей в блоге: 8
25.06.2013, 18:26 2
Передать один раз - это вообще не проблема: есть последний параметр функции CreateWindow, который потом при WM_CREATE ловится в lparam... А дальше что будешь делать? При следующем заходе в функцию окна в переменной windowType что будет?

Лучше SetWindowLong + GWL_USERDATA (или SetWindowLong + GWLP_USERDATA), потом это значение можно вытащить через GetWindowLong(Ptr)
1
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
25.06.2013, 19:28  [ТС] 3
Цитата Сообщение от UI Посмотреть сообщение
При следующем заходе в функцию окна в переменной windowType что будет?
Да вот и я так подумал же, ладно, пускай будет через задницу - сделаю чуть позже 3 обработчика, я там на другой подводный камень наткнулся - создание окон жутко тормозит (ну это ещё ладно) + удаление окон тормозит (вообще не понял почему)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32990 / 21296 / 8180
Регистрация: 22.10.2011
Сообщений: 36,589
Записей в блоге: 8
25.06.2013, 19:47 4
@Gepar, ты б код минимальный для теста выложил, чтоб можно было поиграться, и посмотреть, что и почему тормозит...
1
Заблокирован
25.06.2013, 21:01 5
WM_USER же.
1
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
25.06.2013, 21:08  [ТС] 6
@UI, да собирался создать тему, но потом решил что это из-за динамического создания окон с входом в критическую секцию и решил всё упростить сделав такой себе прекальк, но это не привело ни к чему хорошему, правда в этот раз я своей вины не вижу так как жутко странная проблема получилась (описал её в теме рядышком).
0
25.06.2013, 21:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2013, 21:08
Помогаю со студенческими работами здесь

Передать параметр в поток
Здравствуйте! Потребовалось передать указатель на переменную в поток (для последующего изменения...

Передать указатель на класс (как параметр) окну
1) Расскажите,пожалуйста,как передать указатель на какой-л. класс в качестве параметра WPARAM или...

Как передать свой параметр в ToolStripItem.Click ?
Привет! В классе App есть коллекция private ObservableCollection<CommandItem> commands = new...

Как Передать Свой Параметр Для Обработки В Ssjs
Никак не могу понять до конца что именно сабмитится для обработки в ssjs. Может кто то на пальцах...


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

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