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

Мерцание PaintBox

30.04.2018, 12:51. Показов 1767. Ответов 6

Студворк — интернет-сервис помощи студентам
В общем, мерцает PaintBox
Очень часто обновляется картинка
Подскажите как можно подправить?
P.S. Закоментированны варианты, которые я пробовал и они не помогают (двойная буферизация тоже не помогает).


.cpp
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "PaintShowAnimate.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
int x = 100, y = 150; int u = 0;
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{     u=0;
      PORCII.insert(pair<int,int>(0,1)) ;
      Timer1->Enabled=true;
      int i = 0;
      while(i < 3){
        Funct(PaintBox1);
        i++;
      }
      Button1->Enabled=false;
}
 
//---------------------------------------------------------------------------
 
int k = 0;
//int G = 0;
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
    PaintBox1 -> Repaint();
    //PaintBox1->Invalidate();
    if(u < PORCII.size()) {
    k += PORCII[u];
    u++;
    }
    //LockWindowUpdate(PaintBox1->Canvas->Handle);
    //PaintBox1-> Canvas->Lock();
    for(int i = 0, p = 0; i != k; i++){
        while(PaintBox1->Canvas->Pixels[x][y-32*p] == clBlack)  p++;
        PaintBox1->Canvas->Draw(x,y-32*p,bitmap);
    }
   //PaintBox1-> Canvas->Unlock();  
   //LockWindowUpdate(0);
    if(y != 200)
    y++;
    else
    {
      y-=32;
        if(k != 0)
        k--;
      Timer2->Enabled=true;
      Timer1->Enabled=false;
    }
    if(k==0){
        Timer1->Enabled=false;
        Button1->Enabled = true;
        PORCII.clear();
    }
    //Application->ProcessMessages();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
bitmap = new Graphics::TBitmap(); // создать объект – битовый образ
bitmap -> LoadFromFile("C:\\Users\\Nikita\\Desktop\\kkk.bmp");
bitmap -> Transparent = true;
}
//----------------------------------------------------------------------------
void __fastcall TForm2::FormPaint(TObject *Sender)
{
PaintBox1->Canvas -> Draw(x+40,y,bitmap);
}
//----------------------------------------------------------------------------
 
void __fastcall TForm2::Timer2Timer(TObject *Sender)
{
    Timer1->Enabled=true;
    Timer2->Enabled=false;
}
//---------------------------------------------------------------------------


.h
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
//---------------------------------------------------------------------------
 
#ifndef PaintShowAnimateH
#define PaintShowAnimateH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
//--------------------------//
#include <iostream>
#include <map>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TPaintBox *PaintBox1;
    TTimer *Timer1;
    TTimer *Timer2;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall FormPaint(TObject *Sender);
    void __fastcall Timer2Timer(TObject *Sender);
private:
    Graphics::TBitmap *bitmap;
public:
    __fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif
 
using namespace std;
 
map<int, int> PORCII;
int COUNT_POR = 0, COUNT_CLIENT = 1;
void Funct(TPaintBox *PaintBox1)
{
    int n = 3;//rand() % 5 + 1;
 
    for (int i = 1; i != n; i++) {
     COUNT_CLIENT++;
    }
    COUNT_POR++;
    PORCII.insert(pair<int,int>(COUNT_POR, n-1));
}
Добавлено через 4 минуты
Модер, удали тему, случайно две создалось сразу, когда название подправил
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.04.2018, 12:51
Ответы с готовыми решениями:

Мигает PaintBox
Создано шахматное поле канвой в PaintBox... На нем шашки разные.. Когда мышкой по полю водишь - шашки моргают... Говорят вроде это из-за...

Рисование в PaintBox
i++; TTabSheet *pPage = new TTabSheet(this); pPage-&gt;PageControl = PageControl1; pPage-&gt;TabVisible=true; ...

TLabel на PaintBox
Здравствуйте. Имеется класс, унаследовавший TPaintBox: class MyPaintBox : public TPaintBox{ public: __fastcall...

6
0 / 0 / 0
Регистрация: 11.03.2018
Сообщений: 8
01.05.2018, 18:56  [ТС]
Неужели никто не знает как решить проблему?
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
01.05.2018, 23:56
Какой интервал у таймера Timer1?

Добавлено через 1 час 44 минуты
Что должна делать программа?

событие FormPaint происходит в твоей программе слишком часто, не стоит в нём что-то делать, а тем более рисовать.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
02.05.2018, 00:03
Откажитесь от Repaint. Используйте спрайты.
0
0 / 0 / 0
Регистрация: 11.03.2018
Сообщений: 8
02.05.2018, 15:46  [ТС]
1) 25
2) Делать что-то вроде очереди, хотел, чтобы двигалась как можно плавнее и не очень медленно, еще пытался сделать, чтобы между "порциями"(COUNT_POR) был отступ хотя бы в 32п, но не получилось
3) Без события так же мерцает(немного меньше). И оно не нужно, просто забыл убрать

Добавлено через 58 минут
Цитата Сообщение от Dinkin Посмотреть сообщение
Откажитесь от Repaint. Используйте спрайты.

Я делал так, но тогда вообще твориться какой-то ад + появляется белый фон

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
void __fastcall TForm2::FormCreate(TObject *Sender)
{
myBuffer = new Graphics::TBitmap();   /////////// <-Тут
myBuffer->Height=PaintBox1->Height;
myBuffer->Width=PaintBox1->Width;
//myBuffer -> Transparent = true;
bitmap = new Graphics::TBitmap(); // создать объект – битовый образ
bitmap -> LoadFromFile("C:\\Users\\Nikita\\Desktop\\kkk.bmp");
bitmap -> Transparent = true;
}
 
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
  myBuffer->Canvas->FillRect(TRect(0,0,PaintBox1->Width,PaintBox1->Height));  /////////// <-Тут
    //PaintBox1 -> Repaint();
    //PaintBox1->Canvas->FillRect(PaintBox1->Canvas->ClipRect);
    //PaintBox1->Invalidate();
    if(u < PORCII.size()) {
    k += PORCII[u];
    u++;
    }
    //LockWindowUpdate(PaintBox1->Canvas->Handle);
    //PaintBox1-> Canvas->Lock();
    for(int i = 0, p = 0; i != k; i++){
        while(PaintBox1->Canvas->Pixels[x][y-32*p] == clBlack)  p++;
        //PaintBox1->Canvas->Draw(x,y-32*p,bitmap);
        myBuffer->Canvas->Draw(x,y-32*p,bitmap);    /////////// <-Тут
    }
   //PaintBox1-> Canvas->Unlock();  //LockWindowUpdate(0);
   PaintBox1->Canvas->Draw(0,0,myBuffer); /////////// <-Тут
    if(y != 200)
    y++;
    else
    {
      y-=32;
        if(k != 0)
        k--;
      Timer2->Enabled=true;
      Timer1->Enabled=false;
    }
    if(k==0){
        Timer1->Enabled=false;
        Button1->Enabled = true;
        PORCII.clear();
    }
    //Application->ProcessMessages();
}
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
02.05.2018, 16:52
Вот тебе правильный пример для BCB6 (включая коменты), работы со спрайтами, ни каких миганий (считай уже движок для игры готов).
Вложения
Тип файла: rar Полет в облаках.rar (109.1 Кб, 20 просмотров)
1
0 / 0 / 0
Регистрация: 11.03.2018
Сообщений: 8
04.05.2018, 19:47  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
Вот тебе правильный пример для BCB6 (включая коменты), работы со спрайтами, ни каких миганий (считай уже движок для игры готов).
Этот пример я уже видел где-то в интернете(вроде в каком-то учебнике), но не могу понять как его применить к моей задаче.
У меня количество "клиентов"(выводимых рисунков) заранее неизвестно(если в .h раскоментить 43 строку).
Вот я попытался сделать битмап шириной с ширину моего рисунка и высотой примерно с высоту окна. Туда я пытаюсь выполнить в цикле отрисовку очереди, затем пытаюсь это скопировать на паинт бокс, но ничего не выводит, а если отрисовываю этот "кадр", то он рисует одного "клиента" и оставляет след.

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
int x = 100, y = 150; int u = 0;
void __fastcall TForm2::FormCreate(TObject *Sender)
{
kadr = new Graphics::TBitmap();
kadr -> LoadFromFile("C:\\Users\\Nikita\\Desktop\\kkk.bmp");
kadr->Height=500;
kadr -> Transparent = true;
bitmap = new Graphics::TBitmap(); // создать объект – битовый образ
bitmap -> LoadFromFile("C:\\Users\\Nikita\\Desktop\\kkk.bmp");
bitmap -> Transparent = true;
//---------------------------------------------------------------------------
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
    TRect frameRect;
 
    frameRect = Rect(100,0,x+bitmap->Width, y+bitmap->Height);
 
    //PaintBox1 -> Repaint();
 
    if(u < PORCII.size()) {
    k += PORCII[u];
    u++;
    }
 
    for(int i = 0, p = 0; i != k; i++){
        while(kadr->Canvas->Pixels[x][y-32*p] == clBlack)  p++;
        kadr->Canvas->Draw(x,y-32*p,bitmap);
    }
 
     PaintBox1->Canvas->CopyRect(frameRect ,kadr->Canvas, frameRect);
     //PaintBox1->Canvas->Draw(x,y,kadr);
 
    if(y != 200)
    y++;
    else
    {
      y-=32;
        if(k != 0)
        k--;
      Timer2->Enabled=true;
      Timer1->Enabled=false;
    }
    if(k==0){
        Timer1->Enabled=false;
        Button1->Enabled = true;
        PORCII.clear();
    }
 
}
}
Добавлено через 18 минут
Добавлял такое, результат тот же

C++
1
2
3
4
5
badRect = Rect(x,0,x+bitmap->Width,200);
 
 
//в строке 30
PaintBox1->Canvas->CopyRect( badRect, kadr->Canvas, frameRect);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2018, 19:47
Помогаю со студенческими работами здесь

PaintBox. Закрасить трапецию.
Помогите ,пожалуйста ,с закраской трапеции .Трапецию нельзя закрасить,когда она находится в начальном положении,как только...

Очистка содержимого PaintBox
Какая функция позволяет очистить PaintBox?

График через PaintBox
Помогите понять как строить график через компонент PaintBox, если , например, есть 2 массива, где элементы первого - это координаты Y , ...

Работа с ScrollBox+PaintBox
Помогите пожалуйста разобраться как работать с ScrollBox. PaintBox помещен в ScrollBox. PaintBox имеет большие размеры чем ScrollBox. ...

Метод для PaintBox
есть одинаковый PaintBox на нескольких формах Можно ли создать один метод для всех форм, чтобы каждый раз не писать код? ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru