Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1 / 1 / 2
Регистрация: 10.06.2010
Сообщений: 26

Анимация на компоненте VCL

08.08.2013, 12:53. Показов 1333. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема такая. Перестаёт обновляться анимация на компоненте формы (TPanel) при:
- клике мышкой по заголовку формы и удержании нажатия
- захвате мышью границы формы (изменяем/не изменяем размеры формы)
Правая кнопка мыши - аналогично.

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Код отрисовки сцены ----------------------------------------------------------------
 
void TMainForm::DrawGLScene()
{
    glClearColor(1,1,1,1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    DrawFigure();
 
    SwapBuffers(hDC);
}
 
// Так ловим сообщение WM_PAINT и перерисовываем без мерцания -------------------------
 
// --------- *.cpp :
LRESULT CALLBACK NewWindowProcPanel3D(HWND hWnd, UINT msg, WPARAM w, LPARAM l)
{
    if (msg == WM_ERASEBKGND)
        return 1;
    else if (msg == WM_PAINT)
        MainForm->DrawGLScene();
 
    return CallWindowProc((FARPROC)MainForm->OldWindowProcPanel3D, hWnd, msg, w, l);
}
 
// Создание OldWindowProcPanel3D ------------------------------------------------------
 
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
    OldWindowProcPanel3D = (WNDPROC)SetWindowLong(Panel3D->Handle,
        GWL_WNDPROC, (long)NewWindowProcPanel3D);
}
 
// --------- *.h :
class TMainForm : public TForm
{
    private:
        HDC hDC;
 
    public:
        WNDPROC OldWindowProcPanel3D;
}
 
// Так генерируем сообщение WM_PAINT --------------------------------------------------
 
void TMainForm::UpdateScene()
{
    InvalidateRect(Panel3D->Handle, NULL, false);
}
 
// Код анимации (при активной RadioButton запускаем анимацию) -------------------------
 
void __fastcall TMainForm::RadioGroupClick(TObject *Sender)
{
    if (RadioGroup->ItemIndex == 0)
       animation = false;
    else if (RadioGroup->ItemIndex == 1)
        animation = true;
 
    if (animation)
    {
        while (animation)
       {
            Application->ProcessMessages();
            UpdateScene();
        }
    }
}


Как только мышь отпускаем, анимация идёт как надо и с того самого момента где остановилась. Описанная выше проблема представляет собой как бы паузу в анимации. Не происходит самого обновления данных, а последний кадр анимации рисуется. Что сделать, чтобы анимация продолжалась отрисовываться при клике по форме, изменении размера формы и т.д. (см.выше)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.08.2013, 12:53
Ответы с готовыми решениями:

Посоветуйте пожалуйста! Как мне в компоненте ComboBox2 Организовать смену шрифтов в компоненте Memo1?
Всем заранее спасибо!!!!!!! void __fastcall TForm1::ComboBox2Change(TObject *Sender) { }

Анимация в OpenGL, а где собсно, анимация?
// Bounce.cpp // Demonstrates a simple animated rectangle program with GLUT // OpenGL SuperBible, 3rd Edition // Richard S. Wright...

VCL vs Qt
Что лучше, мое мнение что VCL.

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
08.08.2013, 13:17
Во-первых, вспомни, что должна возвращать оконная функция, если сообщение WM_PAINT обработано... У тебя после обработки WM_PAINT тут же идет вызов дефолтной оконной функции.
0
1 / 1 / 2
Регистрация: 10.06.2010
Сообщений: 26
08.08.2013, 14:38  [ТС]
Так правильнее, но проблему не решает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LRESULT CALLBACK NewWindowProcPanel3D(HWND hWnd, UINT msg, WPARAM w, LPARAM l)
{
    switch (msg)
    {
        case WM_ERASEBKGND :
        {
            return 1;
        }
        case WM_PAINT :
        {
            MainForm->DrawGLScene();
        }
        default: return CallWindowProc((FARPROC)MainForm->OldWindowProcPanel3D,
            hWnd, msg, w, l);
    }
    return 0;
}
0
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
08.08.2013, 15:26
Цитата Сообщение от _lacrimosa_ Посмотреть сообщение
Так правильнее, но проблему не решает:
switch-case Синтаксис:
C++
1
2
3
4
5
6
7
8
9
10
11
12
switch ( <переменная> ) {
case значение1:
  Выполнить если <переменная> == значение1
  break;
case значение2:
  Выполнить если <переменная> == значение2
  break;
...
default:
  выполнить, если ни один вариант не подошел
  break;
}
Подчеркиваю break;
0
1 / 1 / 2
Регистрация: 10.06.2010
Сообщений: 26
08.08.2013, 17:02  [ТС]
С добавлением break; перестаёт работать прежний функционал. Часть компонентов формы не прорисовывается и др.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
08.08.2013, 17:06
?!? ... но без break; же нарушается вся логика такого ветвления!...
0
1 / 1 / 2
Регистрация: 10.06.2010
Сообщений: 26
08.08.2013, 17:31  [ТС]
Суть не в самом break;. В функции NewWindowProcPanel3D можно оставить изначальный вариант на if .. else. В той функции мы не обрабатываем сообщение об уничтожении фона, и обрабатываем WM_PAINT. Затем передаём сообщения, не обработанные новой оконной процедурой, в предшествующую оконную процедуру путем вызова CallWindowProc.

У тебя после обработки WM_PAINT тут же идет вызов дефолтной оконной функции.
Да, всё так. Или я не то делаю?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
09.08.2013, 17:51
Цитата Сообщение от _lacrimosa_ Посмотреть сообщение
Или я не то делаю?
Не читаешь MSDN - как минимум. Там английским по белому сказано:
Return value
An application returns zero if it processes this message.
Где твоя функция возвращает 0 после того, как обработала WM_PAINT? Ты плюёшь на требования ОС, ОС плюёт на твои попытки заставить программу работать. По-моему, всё разумно... Нельзя только требовать чего-то от ОСи, надо и самому выполнять ее требования, если хочешь корректной работы приложения. Но ты же не хочешь ничего слушать, тебе всё равно, что говорят другие:
Цитата Сообщение от _lacrimosa_ Посмотреть сообщение
В функции NewWindowProcPanel3D можно оставить изначальный вариант на if .. else
Нельзя, если хочешь правильно работающую программу! По той причине, которую я процитировал выше.

Возможно, только возврат 0 из функции окна и не приведет мгновенно тебя к желаемому результату, но вот обратное - верно: без этого ты стабильной работы программы никогда не добьешься
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2013, 17:51
Помогаю со студенческими работами здесь

XP OC vcl
3 месяца назад я мог создавать ПО только на Visual basic 6! Вот и я к нему однажды скачать компоненты xp!Там были новые кнопки линии...

VCL Skin 5.25
Подскажите где найти кряк? ) Погуглил, нашёл кряки только для Delphi и то для ранних версий...need help!

Использование vcl.h
Здравствуйте. Есть такая программа: #include &lt;vcl.h&gt; #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #pragma hdrstop ...

VCL и FireMonkey
Можно ли объединить в одном проекте формы VCL и FireMonkey?

vcl form
никак не могу найти в делфи 7 VCL Forms Application облазял практически везде


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru