CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Rysowanie przesuwającej się pionowej linii

Rysowanie przesuwającej się pionowej linii

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Rysowanie przesuwającej się pionowej linii

Nowy postprzez kriss » sobota, 18 grudnia 2010, 22:11

Witam!

Chciałbym zrobić coś takiego aby pionowa linia o zadanej szerokości przesuwała się po jakimś obiekcie (najlepiej TChart) w prawo z różną szybkością. Wydaje mi się, że TChart nie posiada canvas i nie można na nim rysować? poza tym ta linia pewno by została w miejscu narysowania, a chciałbym by się ona przesuwała. Ktoś wie jak coś takiego zrobić?
Avatar użytkownika
kriss
Bladawiec
Bladawiec
 
Posty: 20
Dołączył(a): niedziela, 12 grudnia 2010, 21:28
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Ultimate x64
Kompilator: C++ Builder 6 Enterprise
Gadu Gadu: 0
    Windows 7Firefox

Re: Rysowanie przesuwającej się pionowej linii

Nowy postprzez Cyfrowy Baron » niedziela, 19 grudnia 2010, 10:29

Obiekt TChart posiada Canvas i można swobodnie po nim rysować, przynajmniej u mnie. Co się tyczy rysowania linii to w poście: Własny kursor myszy - problem podałem przykładowy kod rysujący pionowe i poziome linie po formularzu przy przesuwaniu kursora myszki. Ten kod łatwo da się przełożyć na rysowanie tylko jednej linii. Co się zaś tyczy przesuwania z różną szybkością, to po pierwsze co rozumiesz przez różną szybkość, po wtóre co ma decydować o tym przesuwaniu? Do przesuwania linii można użyć zegara TTimer i przesuwać linię w jego zdarzeniu OnTimer.

Niżej zamieszczam kompletny kod przesuwający z różną szybkością linię po Chart1. To przerobiona wersja kodu z podanego wyżej postu:

Plik nagłówkowy, np. Unit1.h
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include "Chart.hpp"
#include "TeEngine.hpp"
#include "TeeProcs.hpp"
#include "Series.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TTimer *Timer1;
        TChart *Chart1;
        TBarSeries *Series1;
        void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);

private:        // User declarations

        void __fastcall DrawLines(int xPos);
        int xPos;

        TWndMethod ActiveApp;
        void __fastcall GetActiveApp(TMessage &Msg);

        BOOL fDraw, fFirstDraw;

public:         // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Plik źródłowy, np. Unit1.cpp
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Chart"
#pragma link "TeEngine"
#pragma link "TeeProcs"
#pragma link "Series"
#pragma resource "*.dfm"

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 ActiveApp = this->WindowProc;
 this->WindowProc = GetActiveApp;

 Randomize();// uruchamiam generator liczb losowych

 xPos = 0;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::GetActiveApp(TMessage &Msg)
{
 /* Przechwytywanie komunikatu o aktywacji i dezaktywacji okna */
 if(Msg.Msg == WM_ACTIVATEAPP)
 {
  if(Msg.WParam == TRUE)
  {
    fDraw = true;
    fFirstDraw = true;
  }
  else
  {
   fDraw = false;

   DrawLines(xPos);
   Chart1->Repaint();

   Chart1->Canvas->Pen->Mode = pmCopy;
  }
 }

 /* Przechwytywanie komunikatów o zmianie rorzmiaru okna */
 if(Msg.Msg == WM_SIZE)
 {
  if( Msg.WParam == SIZE_MAXIMIZED || Msg.WParam == SIZE_RESTORED )
  {
   fFirstDraw = true;
   DrawLines(xPos);
   Chart1->Repaint();

   Chart1->Canvas->Pen->Mode = pmCopy;
  }
 }

 ActiveApp(Msg);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DrawLines(int xPos)
{
 int hMax = Chart1->ClientHeight;

 // linia pionowa
 Chart1->Canvas->MoveTo(xPos, 0);
 Chart1->Canvas->LineTo(xPos, hMax);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if( fDraw )
  {
   Chart1->Canvas->Pen->Mode = pmNotXor;

   if( fFirstDraw == false ) DrawLines(xPos); // wymazanie poprzednich linii


   static bool moveRight = true;

   int wMax = Chart1->ClientWidth;

   int tValue = Random(30); /* losuję liczbę decydującą o szybkości przesuwania linii */

   if(xPos < wMax && moveRight == true) xPos += tValue;
   else moveRight = false;

   if(xPos > 0 && moveRight == false) xPos -= tValue;
   else moveRight = true;

   fFirstDraw = false;

   DrawLines(xPos);

  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if(Timer1->Enabled == false) Timer1->Enabled = true;
 else Timer1->Enabled = false;
}
//---------------------------------------------------------------------------



Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rysowanie przesuwającej się pionowej linii

Nowy postprzez kriss » niedziela, 19 grudnia 2010, 13:50

WOW wielkie dzięki :) A w takim razie czy jest taka możliwość odczytania położenia trackbara w pixelach? :D Mam tak ustawione, że poszczególne pozycje TrackBara są bardzo wysokie (kilkadziesiąt tysięcy). Skalowanie poprzez stałą niestety nie zdaje egzaminu. Ten pasek mógłby się przesuwać zgodnie z położeniem trackbara opartego na pixelach ;) Chyba, że jest jakiś inny sposób by zsynchronizować zmieniającego się trackbara z tą linią pionową?
Avatar użytkownika
kriss
Bladawiec
Bladawiec
 
Posty: 20
Dołączył(a): niedziela, 12 grudnia 2010, 21:28
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Ultimate x64
Kompilator: C++ Builder 6 Enterprise
Gadu Gadu: 0
    Windows 7Firefox

Re: Rysowanie przesuwającej się pionowej linii

Nowy postprzez Cyfrowy Baron » niedziela, 19 grudnia 2010, 15:02

Stwórz algorytm który przeliczy wartość zwracają przez Trackbar przez jego długość (Width), potem przelicz to prze długość Char i już masz co trzeba. Czysta matematyka. Ja nie będę tutaj myślał nad takim algorytmem za Ciebie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rysowanie przesuwającej się pionowej linii

Nowy postprzez kriss » niedziela, 19 grudnia 2010, 19:03

Jak mam to rozumieć, żeby przeliczyć to przez 'długość Char'? to znaczy?
Avatar użytkownika
kriss
Bladawiec
Bladawiec
 
Posty: 20
Dołączył(a): niedziela, 12 grudnia 2010, 21:28
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Ultimate x64
Kompilator: C++ Builder 6 Enterprise
Gadu Gadu: 0
    Windows 7Firefox

Re: Rysowanie przesuwającej się pionowej linii

Nowy postprzez Cyfrowy Baron » niedziela, 19 grudnia 2010, 19:59

A co Ty dokładnie chcesz zrobić, opisz to bardziej obrazowo, bo ja zrozumiałem, że chcesz by poruszając suwakiem w TrackBar przesuwać linię po Char.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rysowanie przesuwającej się pionowej linii

Nowy postprzez kriss » niedziela, 19 grudnia 2010, 21:07

Aha, ja zrozumiałem to jako 'char', zmienna znakowa :D No owszem, chcę zrobić tak, że komponent TChart jest identycznej szerokości co TrackBar (TChart jest dokładnie nad TrackBarem)i jeśli przesunę TrackBar na inną pozycję to dokładnie na tej samej wysokości będzie narysowana pionowa linia.
Avatar użytkownika
kriss
Bladawiec
Bladawiec
 
Posty: 20
Dołączył(a): niedziela, 12 grudnia 2010, 21:28
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Ultimate x64
Kompilator: C++ Builder 6 Enterprise
Gadu Gadu: 0
    Windows 7Firefox

Re: Rysowanie przesuwającej się pionowej linii

Nowy postprzez Cyfrowy Baron » niedziela, 19 grudnia 2010, 21:54

TrackBar musi być trochę dłuższy od obiektu Chart i musisz mu ustawić właściwość Max na długość (Width) obiektu Chart. Potem wystarczy w zdarzeniu OnChange dla Trackbar umieszczasz nieco zmodyfikowany kod ze zdarzenia OnTimer z wcześniejszych przykładów:

KOD cpp:     UKRYJ  
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
  if( fDraw )
  {
   Chart1->Canvas->Pen->Mode = pmNotXor;

   if( fFirstDraw == false ) DrawLines(xPos);

   static bool moveRight = true;

   xPos = TrackBar1->Position;

   fFirstDraw = false;

   DrawLines(xPos);
  }
}



Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
kriss
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rysowanie przesuwającej się pionowej linii

Nowy postprzez kriss » niedziela, 19 grudnia 2010, 22:10

Dzięki za przedstawienie rozwiązania. Nie za bardzo mogę już ingerować w ten trackbar bo mam jego wartości już zdefiniowane i musiałbym przerabiać cały projekt. Nie mniej jednak dziękuję :D
Avatar użytkownika
kriss
Bladawiec
Bladawiec
 
Posty: 20
Dołączył(a): niedziela, 12 grudnia 2010, 21:28
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Ultimate x64
Kompilator: C++ Builder 6 Enterprise
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości

cron