CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Paski przewijania dla formy lub Image
Strona 1 z 1

Paski przewijania dla formy lub Image

Nowy postNapisane: czwartek, 19 maja 2011, 22:28
przez kwgrkwgr
Nie bardzo wiem co i jak mam zrobić chodzi dokładnie by do formy lub TImage dodać paski przewijania takie jak w
KOD cpp:     UKRYJ  
Memo1->ScrollBars =  ssBoth;
lecz nie widzę tej opcji przy TForm TImage czy PageControl1 na którym mam właśnie TImage do którego muszę załadować obrazek 2000pix na 2000pix. Potem przetwarzanie jest oczywiście OK lecz chciałbym mieć możliwość ujrzenie całości po przez użycie suwaków. Tu używam Builder 2010 C++.

Czysty projekt napisany pod C++Builder6 z 1 przyciskiem ma domyślnie paski przewijania do Formy. Po otwarciu w C++Builder2010 traci te paski i nie wiem jak je włączyć by znów tam były.

Re: Paski przewijania dla formy lub Image

Nowy postNapisane: piątek, 20 maja 2011, 08:02
przez Cyfrowy Baron
Jeżeli chcesz dodać pasek do obiektu typu TImage to umieść Image na obiekcie typu TScrollBox i ustaw jego właściwość AutoScroll na true, a AutoSize na false. Właściwość Align dla Image musi być ustawiona na alNone. Jeżeli Image będzie zmieniał rozmiar, to na ScrollBox pojawią się paski przewijania. Wadą tego rozwiązanie jest to, że nie będzie działać dla Image przewijanie pokrętłem myszki. Można jednak rozwiązać ten problem prostym kodem.

Właściwość KeyPreview formularza ustawiamy na true. Jeżeli rozmiar Image zmienia się wraz z rozmiarem formularza, to tworzymy dla tegoż formularza zdarzenie OnResize i wprowadzamy taki kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormResize(TObject *Sender)
{
 Image1->Top = 0;
 Image1->Left = 0;

 ScrollBox1->VertScrollBar->Position = 0;
 ScrollBox1->HorzScrollBar->Position = 0;

 ScrollBox1->Perform(WM_VSCROLL, 0, 0);
}
Dla obiektu ScrollBox również tworzymy zdarzenie OnResize:

KOD cpp:     UKRYJ  
void __fastcall TForm1::ScrollBox1Resize(TObject *Sender)
{
 Invalidate();
 ScrollBox1->Perform(WM_VSCROLL, 0, 0);   }


Dla formularza tworzymy dwa zdarzenia OnMouseWheelDown i OnMouseWheelUp:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormMouseWheelUp(TObject *Sender,
      TShiftState Shift, TPoint &MousePos, bool &Handled)
{
 ScrollBox1->Perform(WM_VSCROLL, 0, 0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheelDown(TObject *Sender,
      TShiftState Shift, TPoint &MousePos, bool &Handled)
{
 ScrollBox1->Perform(WM_VSCROLL, 1, 0);
}


Jeżeli ScrollBox znajduje się na formularzu wtórnym (nie głównym) to należałoby dodać jeszcze obsługę zdarzenie OnClose i OnShow dla tegoż formularza:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 Image1->Top = 0;
 Image1->Left = 0;

 ScrollBox1->VertScrollBar->Position = 0;
 ScrollBox1->HorzScrollBar->Position = 0;

 ScrollBox1->Perform(WM_VSCROLL, 0, 0);
}
//---------------------------------------------------------------------------
void __fastcall TFULLForm::FormShow(TObject *Sender)
{
 ScrollBox1->Perform(WM_VSCROLL, 0, 0);
}


Po tych zabiegach Image będzie miał paski przewijania, co prawda nie swoje, ale swoich mieć nie może, gdyż ten komponent nie posiada własnej powierzchni i nie dziedziczy po klasie TWinControl.



Jeżeli chcesz mieć paski przewijania na formularzu, to ustaw mu właściwość HorzScrollBar -> Visible na true i VertScrollBar -> Visible na true.



Co się tyczy TPageControl, to chyba chodzi Tobie raczej o to żeby TTabSheet miał paski przewijania?! Niestety ani TPageControl, ani TTabSheet nie mają wbudowanych pasków przewijania, więc możesz co najwyżej umieścić na TabSheet obiekt ScrollBox.



O obiektach będących elementami interfejsu API powinieneś wiedzieć to, że ich kształt, wygląd i zachowanie są zdefiniowane w systemie Windows, więc nie możesz zrobić z nimi więcej niż na to pozwala systemowe API.