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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2011, 20:52   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию SetWindowPos для дочерних окон и битмапов.

Имеется окно. В нем на весь его размер дочернее. Что-то типа TImage:
Код:
Warehouse.Form[Index].Handle :=                                                                   // Create form handle.
   CreateWindowEx(0, Application.WinClass.lpszClassName, '',                                        // Set class name and caption. 
                  WS_POPUP,                                                                         // Set style.
                  Warehouse.Size[Warehouse.Form[Index].Index].Left,                                 // Set left.
                  Warehouse.Size[Warehouse.Form[Index].Index].Top,                                  // Set top.
                  Warehouse.Size[Warehouse.Form[Index].Index].Width,                                // Set width.
                  Warehouse.Size[Warehouse.Form[Index].Index].Height,                               // Set height.
                  0, 0, Application.Handle, Nil);                                                   // Set parent.

  Warehouse.Form[Index].Image.Handle :=                                                             // Create image handle.
   CreateWindow(APP_STATIC, '',                                                                     // Create TImage control.
                WS_CHILD Or SS_BITMAP Or WS_VISIBLE,                                                // Styles of control.
                0,                                                                                  // Set left.
                0,                                                                                  // Set top.
                Warehouse.Size[Warehouse.Form[Index].Index].Width,                                  // Set width.
                Warehouse.Size[Warehouse.Form[Index].Index].Height,                                 // Set height.
                Warehouse.Form[Index].Handle,                                                       // Set parent handle.
                0, Application.Handle, Nil);                                                        // Set main parent handle.
Дальше для "TImage" создаю структуру, в которой хранится "буфер" для изображения. Основа буфера - hBitMap.

Теперь ситуация. Мне нужно поменять размеры окна.

Раньше (в старой версии). Я делал DeleteObject для hBitMap, DestroyWindow для "TImage", затем вызываю SetWindowPos для главного окна, потом создаю дочернее и заново создаю hBitMap.

Теперь я немного изменил структуру - буфер для TImage теперь полноценная текстура из хранилища. Это дает больше возможностей для визуальных эффектов. Но теперь убийство "буфера" будет караться Access Violation, поэтому хотелось бы обойтись малой кровью.

Итак, полный список шагов, которые мне необходимо предпринять:
0)
Код:

╔═══╗
║   ║
╚═══╝
1) Вызываю SetWindowPos для главного окна:
Код:

╔═══╦╗
║   ║║
╠═══╝║
╚════╝
2) Вызываю SetWindowPos для дочернего окна (правильно ли это?)
Код:

╔════╗
║    ║
║    ║
╚════╝
3) Теперь нужно как то изменить размеры битмпа, на который ссылается hBitMap без потери того, что на нем уже нарисовано (если новый размер больше, или с обрезкой, если новый размер меньше).

В общем хотелось бы получить ответы от гуру на выделенные вопросы.

P.S. Подсветка кода опять отжигает.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 01.02.2011 в 21:17. Причина: Добавил PS
Alex Cones вне форума Ответить с цитированием
Старый 02.02.2011, 04:29   #2
GreyScall
Пользователь
 
Аватар для GreyScall
 
Регистрация: 01.01.2011
Сообщений: 29
Лампочка

Цитата:
Что-то типа TImage
TImage из VCL - это вообще не окно... Что есть "APP_STATIC"?
Цитата:
Теперь ситуация. Мне нужно поменять размеры окна.
Программно или пользователь мышкой изменяет? Впрочем неважно...
Цитата:
Раньше (в старой версии). Я делал DeleteObject для hBitMap, DestroyWindow для "TImage", затем вызываю SetWindowPos для главного окна, потом создаю дочернее и заново создаю hBitMap.
ам... Пересоздавать-то зачем? После изменения размеров окно получает сообщение WM_SIZE - как раз в нём и логичнее всего корректировать размеры и координаты дочерних окон... GetClientRect() + MoveWindow() + возможно пригодится InvalidateRect()...

А зачем при изменении размеров этого "APP_STATIC" изменять также и размеры HBITMAP? Просто выводите нужную его часть в нужной области (StretchBlt())...

Если для каких-то целей всё же требуется изменение размеров HBITMAP (например для сохранения в файл), то придётся создавать второй битмап (нового размера) и копировать в него нужную часть первого битмапа...
Regards, GreyScall.
GreyScall вне форума Ответить с цитированием
Старый 02.02.2011, 08:56   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
TImage из VCL - это вообще не окно
Вообще-то TImage выше я взял в кавычки.
Цитата:
Что есть "APP_STATIC"?
Строковая константа, равная 'Static'
Цитата:
А зачем при изменении размеров этого "APP_STATIC" изменять также и размеры HBITMAP?
Да потому, что это его буфер и он перестает соответствовать его размерам.

Ладно, с буфером понятно. Я такк и не услышал ответ на первый вопрос - SetWindowPos подействует на дочернее окно?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 02.02.2011, 13:47   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Ладно, с буфером понятно. Я такк и не услышал ответ на первый вопрос - SetWindowPos подействует на дочернее окно?
вообще действует.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.02.2011, 13:49   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
вообще
Смущает меня это слово из вашего ответа. Действует, но с оговорками?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить классы всех дочерних окон формы rangel Работа с сетью в Delphi 8 12.10.2014 17:36
Попиксельное сравнение двух битмапов. rokweb Общие вопросы Delphi 5 10.06.2010 21:16
Форма поверх всех окон (SetWindowPos) AdrenalinE Microsoft Office Access 4 18.04.2010 00:07
Расположение дочерних MDI окон слева-направо и сверху-вниз Umdis Общие вопросы Delphi 2 30.11.2009 07:05
SetWindowPos (точное расположение) BOBAH13 Win Api 2 19.02.2009 08:39