Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2019, 07:24   #1
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию Как разместить в окне несколько дополнительных данных?

Код:
WindowClass.cbWndExtra   =        sizeof(HWND)*3;
Как теперь записать и прочитать каждый из дескпритовров?
Код:
hwnd=GetWindowLongPtr(Window,  GWLP_USERDATA);
и
Код:
SetWindowLongPtr(Window,  GWLP_USERDATA, hwnd);
работают лишь с одним данным, а мне нужны несколько.

Последний раз редактировалось taras-proger77; 15.04.2019 в 07:28.
taras-proger77 вне форума Ответить с цитированием
Старый 15.04.2019, 07:50   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
HWND hwnd[100];
SetWindowLongPtr(Window,  GWLP_USERDATA, hwnd);
Уже не работает?
p51x вне форума Ответить с цитированием
Старый 15.04.2019, 10:03   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

SetWindowLongPtr(Window, 0, hwnd[0]);
SetWindowLongPtr(Window, 4, hwnd[1]);
SetWindowLongPtr(Window, 8, hwnd[2]);
И далее по списку.
Вместо 0, 4, 8 лучше использовать sizeof.


Цитата:
Сообщение от p51x Посмотреть сообщение
Уже не работает?
Оно может и работает, но требует самостоятельного выделения памяти, тогда как с использованием wndextra система делает это за нас.
waleri вне форума Ответить с цитированием
Старый 15.04.2019, 10:09   #4
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
HWND hwnd[100];
SetWindowLongPtr(Window,  GWLP_USERDATA, hwnd);
Уже не работает?
Вас не насторожило
Код:
WindowClass.cbWndExtra   =        sizeof(HWND)*3;
вместо
Код:
WindowClass.cbClsExtra   =        sizeof(HWND)*3;
?
Указатель куда вы предлагаете разместить? На глобальный массив? Он в одном экземпляре. На
Код:
static HWND hwnd[100];
в той же, или в другой функции? Он тоже одном экземпляре. Просто на
Код:
HWND hwnd[100];
? Эта пакость лежит на стеке и при следующем вызове может уехать на слабо предскауземый адрес. Может на
Код:
HWND *hwnd;
hwnd=new HWND[100];
? Если бы меня устраивала явная куча, темы бы не было.
taras-proger77 вне форума Ответить с цитированием
Старый 15.04.2019, 10:11   #5
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
SetWindowLongPtr(Window, 0, hwnd[0]);
SetWindowLongPtr(Window, 4, hwnd[1]);
SetWindowLongPtr(Window, 8, hwnd[2]);
Я так и сделал, только
Цитата:
WindowClass.cbWndExtra = sizeof(HWND)*4;
. И не получается.
Код:
SetWindowLongPtr(Window, 0, (LONG_PTR) hwnd[0]);
пишет 0x40e087e,
Код:
hwnd[0]=(HWND)GetWindowLongPtr(MainWindow, 0);
читает 0x2b09e456a27e,
Код:
SetWindowLongPtr(Window, 1, (LONG_PTR) hwnd[1]);
пишет 0x2609a2,
Код:
hwnd[1]=(HWND)GetWindowLongPtr(MainWindow, 1);
читает 0x2b09e456a2,
Код:
SetWindowLongPtr(Window, 2, (LONG_PTR) hwnd[2]);
пишет 0x1c0a56,
Код:
hwnd[2]=(HWND)GetWindowLongPtr(MainWindow, 2);
читает 0x2b09e456,
Код:
SetWindowLongPtr(Window, 3, (LONG_PTR) wnd[3]);
пишет 0x2b09e4,
Код:
hwnd[3]=(HWND)GetWindowLongPtr(MainWindow, 3);
читает те же 0x2b09e4.

Последний раз редактировалось taras-proger77; 15.04.2019 в 12:06.
taras-proger77 вне форума Ответить с цитированием
Старый 15.04.2019, 10:45   #6
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Оно может и работает, но требует самостоятельного выделения памяти, тогда как с использованием wndextra система делает это за нас.
Вот именно. Система делает это за нас и даже не просит дополнительно проверять, была ли память выделена. В отличие от new, который или упадёт сразу, или требует проверять факт выделения отдельно от факта создания окна, а потом отдельно его закрывать, если память не выделилась.
taras-proger77 вне форума Ответить с цитированием
Старый 15.04.2019, 10:48   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Указатель куда вы предлагаете разместить? На глобальный массив?
Куда вам надо. Хоть на поле класса.
p51x вне форума Ответить с цитированием
Старый 15.04.2019, 11:18   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Система делает это за нас и даже не просит дополнительно проверять, была ли память выделена.
Я готов поспорить, что окно не создастся.
К сожалению проверить это мы не можем, ибо размер wndextra весьма ограничен.
К счастью, при ограничении размера wndextra и ограничении на количества окон, количество нужной памяти по современным меркам весьма незначительно.

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Я никуда не залезу?
А вы попробуйте залезть
Вы что думаете, будете писать куда попало и никто вас проверять не будет?
waleri вне форума Ответить с цитированием
Старый 15.04.2019, 12:16   #9
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Всё, понял, смешения вместо индексов.
taras-proger77 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько ответов в одном окне SoDenis Помощь студентам 1 29.03.2017 10:05
Макрос для переноса (с удалением) данных с одного листа на другой при появлении дополнительных данных в ячейке - MS Excel Тохес Microsoft Office Excel 2 15.03.2016 22:26
Где можно разместить статьи по программированию/базам данных? Goldcoding Свободное общение 2 31.07.2012 12:25