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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2013, 22:47   #1
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию Учу Api и C++

Продолжу тему здесь, в более подходящем разделе ибо сроки уже поджимают.

В общем начал я писать программу для курсовой на WinApi, ничего о последнем не зная. С С++ я тоже не очень хорошо знаком, тем не менее писать надо и желание это делать тоже имеется.

Вот на чём я застрял сейчас:
При загрузке файла нужно создать дочернее окно с пользовательскими данными в виде структуры, записать в эту структуру преобразованные данные из файла в виде массива чисел и отрисовать по этим числам картинку. В последствии этот массив нужно будет преобразовывать обратно и сохранять, но это на закуску.

С загрузкой и рисованием проблем нет, а вот со структурой и всякими указателями я не справляюсь.

Итак имеется структура:
Код:
struct Struct{
     int XX;
     int YY;
     float Potencial[1000][1000];
};
и пара строк для создания указателя и присвоения его окну (это идёт сразу после его создания):
Код:
struct Struct* ptr=(struct Struct*) malloc(sizeof(struct Struct));
SetWindowLongPtr(hChild, GWLP_USERDATA, LPARAM(ptr));
Всё что дальше - я перепишу из поста в старой теме.

Вроде мне теперь здесь понятно. Создаётся указатель типа Struct (это моя структура для окна), ему выделяется память под размер этой структуры (int + int + float) и присваивается адрес по этой памяти.

Хорошо. Структура у окна есть, но она пустая и, как я понял, она должна содержать адрес на массив Potencial.

Как мне теперь создать и заполнить (обратиться) к этому массиву?

Пробовал писать ptr->Potencial[0][0]=10; но компилятор пропускает эту строчку.

Вот так я получаю адрес структуры окна:
Код:
LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam){
struct Struct* ptr=(struct Struct*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
Буду рад любой помощи))

Последний раз редактировалось x_Alex_x; 15.04.2013 в 22:50.
x_Alex_x вне форума Ответить с цитированием
Старый 15.04.2013, 22:56   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Суля по задаче, использовать SetWindowLongPtr вовсе не обязательно.
В WM_CREATE создавай свою структуру и загружай данные.
И, поскольку упомянуто рисование, крайне рекомендую воспользоваться библиотекой WTL - оно хоть и тонкая, но всё таки обёртка над WinAPI, гемора будет на порядок меньше. Там и класс для окна можно замутить...
Rififi вне форума Ответить с цитированием
Старый 16.04.2013, 10:59   #3
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

Цитата:
В WM_CREATE создавай свою структуру
По моему я раньше пробовал так делать, но переменные, созданные в WM_CREATE постоянно обновлялись и я не мог с ними работать поэтому и пришлось переходить на SetWindowLongPtr.
x_Alex_x вне форума Ответить с цитированием
Старый 16.04.2013, 11:45   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Объясните толком, что значит "но компилятор пропускает эту строчку"?
Компилятор строчки не пропускает...

Цитата:
Сообщение от Rififi Посмотреть сообщение
В WM_CREATE создавай свою структуру и загружай данные.
Где-то надо хратнить привязку какая структура к какому окну относиться. А будет ли это делаться из WM_CREATE или извне, значения не имеет.

Последний раз редактировалось Stilet; 16.04.2013 в 12:25.
waleri вне форума Ответить с цитированием
Старый 16.04.2013, 12:04   #5
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

Цитата:
Объясните толком
Я поставил на этом месте точку остановки, а при запуске точка снялась.

А можно делать вот так?
BOOL LoadFile(LPSTR pszFileName, struct Struct* ptr){
..
ptr->Potencial[x][y]=...
Я передаю указатель на структуру, чтобы обращаться к ней в функции.

Создавать и добавлять окну структуру нужно в WM_CREATE или раньше?
у меня вот так:
Код:
LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam){
..
case WM_CREATE:{
struct Struct* ptr=(struct Struct*)malloc(sizeof(struct Struct));
SetWindowLongPtr(hwnd, GWLP_USERDATA, LPARAM(ptr));

Последний раз редактировалось Stilet; 16.04.2013 в 12:26.
x_Alex_x вне форума Ответить с цитированием
Старый 16.04.2013, 16:46   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от x_Alex_x Посмотреть сообщение
Я поставил на этом месте точку остановки, а при запуске точка снялась.
Это еще ничего не значит. Подозреваю, что у вас выбрана Release сборка. Переключите на Debug, тогда не должно изчезать.

Нет правила когда и где выделять память под вашу структуру. Просто когда она вам понадобиться уже должна быть выделена. Делайте как вам удобно.

Передавать указатель в функцию - не проблема.

Последний раз редактировалось waleri; 16.04.2013 в 16:51.
waleri вне форума Ответить с цитированием
Старый 16.04.2013, 19:32   #7
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

У меня сейчас DEBUG стоит. Попробовал переписать заново - больше не снимаются)

Не понимаю. Теперь функция загрузки файла, в которой заполняется структура, не выполняется. При вызове процедуры в режиме отладки вылазит окно chkstk.asm а всё, что было в функции пропускается. Так же ничего не рисует WM_PAINT, хотя несколько значений массива в структуре я заполнил вручную, он и их не выводит.

Последний раз редактировалось x_Alex_x; 16.04.2013 в 20:12.
x_Alex_x вне форума Ответить с цитированием
Старый 29.04.2013, 09:40   #8
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

Подскажите пожалуйста как получить хендл дочернего окна окна клиента?
И как либо убрать крестик закрытия такого окна, либо сделать его недоступным?
x_Alex_x вне форума Ответить с цитированием
Старый 29.04.2013, 19:12   #9
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

Цитата:
получить хендл
Он нужен для того, чтобы перерисовать (WM_PAINT) это окно по нажатию кнопки в главном окне
x_Alex_x вне форума Ответить с цитированием
Старый 29.04.2013, 20:49   #10
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

И как сделать прозрачную кисть чтобы нарисовать фигуру без заливки?
x_Alex_x вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Учу WinApi. Разные вопросы x_Alex_x Помощь студентам 45 15.04.2013 18:02
Cи++ API Taracan Фриланс 24 24.07.2011 15:36
завернуть флеш в учу оболочку gufon Общие вопросы Delphi 3 20.07.2011 07:13
учу borland С++ builder 6 Dazzl C++ Builder 3 13.05.2011 18:01
Учу Си++ под Linux, необходима помощь prog16 Свободное общение 12 09.08.2009 15:15