Ĺadny brzuch
Witam
Moj problem dotyczy :
Na Form1 rysuje linie na canvas specjalną funkcją która rysuje od jednego punktu wskazanego myszką do drugiego, pojawia mi sie Form2 która przysłania te linie, jak zamknę Form2 linii nie ma.
Jak zrobić, żeby te linie nie zacierały mi się.
Myślałem żeby zrobić to tak
Kiedy odpalam Form2 zrzucam, obszar z liniami jako mape bitowa do pamieci po, zamknięciu Form2 wczytuje obraz.
Dowiedziałem się że dzieję sie tak dlatego żę Form1 jest przerysowywana i trzeba tą fukcję wyłączyć.
Ktoś może wiem jaką funkcję i jak ją wyłączyć
Dzięki za odpowiedź
Rysuj w zdarzeniu OnPaint formy.
Jak mam rysować w OnPaint, jeżeli wykorzystuje do rysowanie różne funkcje o różnym charakterze i wszystko oparte jest o wpółrzędne myszki.
Jeżli uzwasz C++Buildera to kliknij na forme i w Object Inspektorrze kliknij na OnPaint czy jakos tak i tam dodaj kod
Jeżeli w WINAPI to w procedurze okna w wiadomości WM_PAINT użyj funkcji BeginPaint i tam dodaj odpowiednie funkcjie rysujące tylko wtedy już bez cavasa ;)
Kodu funkcji rysujących raczej nie moge dodać do OnPaint bo jest uzależniony od wpółrzędnych myszki i linie rysowane są podczas działania programu. W OnPaint mam obszar który ogranicza rysowanie lini, jest tłem.
nie rozumię w czym problem, mógłbys trochę dokladniej wyjaśnić. Dokładnie nie wiem jak to jest w BCB ale pewnie podobnie jak w WINAPI czyli WM_PAINT jest wywoływane między innymi jeżeli okno przykryjemy
Więc jeżeli byś przykłdowo dał tam funkcjię MessageBox do zdarzenia OnPaint formy to wyskoczy ono zawsze jak przykryjemy forme. Tak samo możesz np. rysowac jakąś prostą MoveTo() LineTo() i gotowe
void __fastcall TForm1::DrawingEdge(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { //drawing edges with the given nodes static int i,j; static int x1,x2,y1,y2; if(Button == mbRight) { for (std::map<TShape*,TLabel*>::iterator I1=MapOfShapes.begin();I1!=MapOfShapes.end();I1++) if (I1->first == dynamic_cast<TShape*>(Sender)) if (bDrawing) { i=I1->first->Tag; bDrawing = false; Form1->Canvas->MoveTo(I1->first->Left+I1->first->Width/2,I1->first- >Top+I1->first->Height/2); x1=I1->first->Left;y1=I1->first->Top; } else { j=I1->first->Tag; bDrawing = true; Form1->Canvas->LineTo(I1->first->Left+I1->first->Width/2,I1->first- >Top+I1->first->Height/2); x2=I1->first->Left;y2=I1->first->Top; if(i!=j) { iGraph[i-1][j-1]=1; iGraph[j-1][i-1]=1; Form2->MatrixGrid->Cells[i][j]=1; Form2->MatrixGrid->Cells[j][i]=1; } } } }
To jest przykładowa funkcja która rysuje proste miedzy dwoma wierzchołkami.
void __fastcall TForm1::FormPaint(TObject *Sender)
a to jest nagłowek funkcji OnPaint w która nie ma wpółrzędnych myszki ani przycisku. Dlatego nie mogę sobie zrobić kopiuj w klej mojej funkcji do OnPaint.
Dokładnie nie przyglądałem się jak dziala ten kod ale może ta funkcjia by Ci pomogła
BOOL GetCursorPos( LPPOINT lpPoint // address of structure for cursor position );
POINT Pos ={0}; GetCursorPos(&Pos); int x = Pos.x; //tu masz współrzędna X na ekranie int y = Pos.y; //a tu współrzędna Y
Tutaj dostaniesz współrzędne ekranowe kursora jeżeli chciałbyś wsłórzędne ale w oknie to użyj jeszcze funkcji
BOOL ScreenToClient( HWND hWnd, // window handle for source coordinates LPPOINT lpPoint // address of structure containing coordinates );
Podajesz w niej uchwyt do tworzonego okna i tą strukturę POINT ktorą wcześniej stworzyłeś i zapisales do niej współrzędne za pomocą funkcji ktorą napisałem wyżej.
Ok. Dzieki
widze ze wszystko sprowadza sie do tego bym punktu gromadził w zmiennej Point i pozniej wykorzystał je do rysowania w OnPaint
Pozdrawiam
Dokładnie nie przyglądałem się jak dziala ten kod ale może ta funkcjia by Ci pomogła
BOOL GetCursorPos(   LPPOINT lpPoint  // address of structure for cursor position   );
POINT Pos ={0}; GetCursorPos(&Pos); int x = Pos.x; //tu masz współrzędna X na ekranie int y = Pos.y; //a tu współrzędna Y
Tutaj dostaniesz współrzędne ekranowe kursora jeżeli chciałbyś wsłórzędne ale w oknie to użyj jeszcze funkcji
BOOL ScreenToClient(   HWND hWnd, // window handle for source coordinates   LPPOINT lpPoint  // address of structure containing coordinates   );
Podajesz w niej uchwyt do tworzonego okna i tą strukturę POINT ktorą wcześniej stworzyłeś i zapisales do niej współrzędne za pomocą funkcji ktorą napisałem wyżej.
Jak Ci coś miga to sprubuj takie coś Form1->DoubleBuffor(); jakoś tak ale jak wpiszesz strzałkę to wyświetli ci się lista i wyberz z niej coś takiego :)
Dokładnie jest Form1->DoubleBuffered; , ale jak tego użyć. Przy Tworzeniu Form1 czy Form2 czy jeszcze w innym miejscu.
Wstawiłem kod do zdarzenia
void __fastcall TForm2::FormCreate(TObject *Sender) { //Form1->DoubleBuffered=!Form1->DoubleBuffered; }
ale, teraz nie miga mi obszar do rysowania, ale same linie i program bardzo spowolnił.
Użytkownik ol3j edytował ten post 06 grudzień 2005, 23:46
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Moj problem dotyczy :
Na Form1 rysuje linie na canvas specjalną funkcją która rysuje od jednego punktu wskazanego myszką do drugiego, pojawia mi sie Form2 która przysłania te linie, jak zamknę Form2 linii nie ma.
Jak zrobić, żeby te linie nie zacierały mi się.
Myślałem żeby zrobić to tak
Kiedy odpalam Form2 zrzucam, obszar z liniami jako mape bitowa do pamieci po, zamknięciu Form2 wczytuje obraz.
Dowiedziałem się że dzieję sie tak dlatego żę Form1 jest przerysowywana i trzeba tą fukcję wyłączyć.
Ktoś może wiem jaką funkcję i jak ją wyłączyć
Dzięki za odpowiedź
Rysuj w zdarzeniu OnPaint formy.
Jak mam rysować w OnPaint, jeżeli wykorzystuje do rysowanie różne funkcje o różnym charakterze i wszystko oparte jest o wpółrzędne myszki.
Jeżli uzwasz C++Buildera to kliknij na forme i w Object Inspektorrze kliknij na OnPaint czy jakos tak i tam dodaj kod
Jeżeli w WINAPI to w procedurze okna w wiadomości WM_PAINT użyj funkcji BeginPaint i tam dodaj odpowiednie funkcjie rysujące tylko wtedy już bez cavasa ;)
Kodu funkcji rysujących raczej nie moge dodać do OnPaint bo jest uzależniony od wpółrzędnych myszki i linie rysowane są podczas działania programu. W OnPaint mam obszar który ogranicza rysowanie lini, jest tłem.
nie rozumię w czym problem, mógłbys trochę dokladniej wyjaśnić. Dokładnie nie wiem jak to jest w BCB ale pewnie podobnie jak w WINAPI czyli WM_PAINT jest wywoływane między innymi jeżeli okno przykryjemy
Więc jeżeli byś przykłdowo dał tam funkcjię MessageBox do zdarzenia OnPaint formy to wyskoczy ono zawsze jak przykryjemy forme. Tak samo możesz np. rysowac jakąś prostą MoveTo() LineTo() i gotowe
void __fastcall TForm1::DrawingEdge(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { //drawing edges with the given nodes static int i,j; static int x1,x2,y1,y2; if(Button == mbRight) { for (std::map<TShape*,TLabel*>::iterator I1=MapOfShapes.begin();I1!=MapOfShapes.end();I1++) if (I1->first == dynamic_cast<TShape*>(Sender)) if (bDrawing) { i=I1->first->Tag; bDrawing = false; Form1->Canvas->MoveTo(I1->first->Left+I1->first->Width/2,I1->first- >Top+I1->first->Height/2); x1=I1->first->Left;y1=I1->first->Top; } else { j=I1->first->Tag; bDrawing = true; Form1->Canvas->LineTo(I1->first->Left+I1->first->Width/2,I1->first- >Top+I1->first->Height/2); x2=I1->first->Left;y2=I1->first->Top; if(i!=j) { iGraph[i-1][j-1]=1; iGraph[j-1][i-1]=1; Form2->MatrixGrid->Cells[i][j]=1; Form2->MatrixGrid->Cells[j][i]=1; } } } }
To jest przykładowa funkcja która rysuje proste miedzy dwoma wierzchołkami.
void __fastcall TForm1::FormPaint(TObject *Sender)
a to jest nagłowek funkcji OnPaint w która nie ma wpółrzędnych myszki ani przycisku. Dlatego nie mogę sobie zrobić kopiuj w klej mojej funkcji do OnPaint.
Dokładnie nie przyglądałem się jak dziala ten kod ale może ta funkcjia by Ci pomogła
BOOL GetCursorPos( LPPOINT lpPoint // address of structure for cursor position );
POINT Pos ={0}; GetCursorPos(&Pos); int x = Pos.x; //tu masz współrzędna X na ekranie int y = Pos.y; //a tu współrzędna Y
Tutaj dostaniesz współrzędne ekranowe kursora jeżeli chciałbyś wsłórzędne ale w oknie to użyj jeszcze funkcji
BOOL ScreenToClient( HWND hWnd, // window handle for source coordinates LPPOINT lpPoint // address of structure containing coordinates );
Podajesz w niej uchwyt do tworzonego okna i tą strukturę POINT ktorą wcześniej stworzyłeś i zapisales do niej współrzędne za pomocą funkcji ktorą napisałem wyżej.
Ok. Dzieki
widze ze wszystko sprowadza sie do tego bym punktu gromadził w zmiennej Point i pozniej wykorzystał je do rysowania w OnPaint
Pozdrawiam
Dokładnie nie przyglądałem się jak dziala ten kod ale może ta funkcjia by Ci pomogła
BOOL GetCursorPos(   LPPOINT lpPoint  // address of structure for cursor position   );
POINT Pos ={0}; GetCursorPos(&Pos); int x = Pos.x; //tu masz współrzędna X na ekranie int y = Pos.y; //a tu współrzędna Y
Tutaj dostaniesz współrzędne ekranowe kursora jeżeli chciałbyś wsłórzędne ale w oknie to użyj jeszcze funkcji
BOOL ScreenToClient(   HWND hWnd, // window handle for source coordinates   LPPOINT lpPoint  // address of structure containing coordinates   );
Podajesz w niej uchwyt do tworzonego okna i tą strukturę POINT ktorą wcześniej stworzyłeś i zapisales do niej współrzędne za pomocą funkcji ktorą napisałem wyżej.

Jak Ci coś miga to sprubuj takie coś Form1->DoubleBuffor(); jakoś tak ale jak wpiszesz strzałkę to wyświetli ci się lista i wyberz z niej coś takiego :)
Dokładnie jest Form1->DoubleBuffered; , ale jak tego użyć. Przy Tworzeniu Form1 czy Form2 czy jeszcze w innym miejscu.
Wstawiłem kod do zdarzenia
void __fastcall TForm2::FormCreate(TObject *Sender) { //Form1->DoubleBuffered=!Form1->DoubleBuffered; }
ale, teraz nie miga mi obszar do rysowania, ale same linie i program bardzo spowolnił.
Użytkownik ol3j edytował ten post 06 grudzień 2005, 23:46