Kształt komponentów.

0

Witam.
Szukałem postów na ten temat tu na forum i choć było ich wiele to chyba w żadnym nie doszukałem się odpowiedzi. :/

Moim pytanie zatem jest:
czy istnieje odpowiednik funkcji SetWindowRng dla komponentów takich jak: TImage, TBitmap, TBitBtn, TButton??

Jeśłi nie, to jak zaprogramować metody, któregoś z nich tak, aby można było wykorzystać stworzony wcześniej region lub maskę kolorów do zmienienia rozmiarów komponentu?

Drugie pytanie:
znalazłem procedurkę, która tworzy kształt formy tylko tam, gdzie ma ona jakiś komponent. Problem pojawia się gdy komponenty nie są prostokątne ;-( Czy ktoś miałby pomysł jak zmodyfikować tą procedurkę?
Listning poniżej:

function ControlsToRegion(Forma:TForm) :HRGN;
var Ctrl :TControl;  index, x0,y0, xa,ya, margin :integer;
    rgn :HRGN;
begin
  Result :=CreateRectRgn(0,0,0,0);
  margin :=(Forma.Width -Forma.ClientWidth) div 2;
  x0 :=Margin;
  y0 :=Forma.Height -Forma.ClientHeight -Margin;
  for index :=0 to Forma.ControlCount-1 do begin
    Ctrl :=Forma.Controls[index];
    if (Ctrl is TWinControl)or (Ctrl is TGraphicControl) then
      if ctrl.Visible then begin
        xa := x0 + Ctrl.Left;
        ya := y0 + Ctrl.Top;
        rgn :=CreateRectRgn (xa,ya, xa+Ctrl.Width,ya+Ctrl.Height );
        CombineRgn (Result, Result,rgn, RGN_OR );
        DeleteObject (rgn);
      end;
  end;
end;
0

odpowiednie kompnenty w necie albo zabawa z regionami (bylo).

nie bardzo rozumiem 2 pytania... mowisz ze nie mozesz zrobic innych ksztaltow niz prostokaty a masz problem gdy nie sa one prostokatne... paradoks?

0

Pytanie 2 wydaje mi się zrozumiałe :-)

Ten listning tworzy formę tam gdzie ma onakomponenty. Gdy wrzucisz np. TShape i ustawisz go na elipsę, to nie otrzymasz eliptycznego formularza, ale prostoką, w kótry wpisana jest elipsa. Chodzi o to, że nie ma komponentów o niereguralnych kształtach (mówię o standardowych pakietach delphi). Wszystkie są kwadratami lub prostokątami (w sumie to kwadrat = prostokąt :-P). Przynajmniej tak sądzę. :-)

Wiesz już o co mi chodzi?

Gdyby wrzucić na formę kilka komponentów o różnych kształtach i wywołać tą prockę (ulepszoną) to wtedy na przykład form składałby się z dwóch elips. ALe nie wiem jak odczytać np. 'granicę' elipsy z TShape, tak, aby zmodyfikować procedurkę. :/

Pogmatwane to i nie wiem czy zakumacie o co mi chodzi. ;-(

Słowem - sam bym chciał umieć zaprogramować komponent o dowolnym kształcie. Mam nadzieję, że ktoś mi w tym pomoże... :-/

0

odpowiednie kompnenty w necie albo zabawa z regionami (bylo).

Czy mógłbyś podać jakieś linki do tematów regionów? Znalazłem gdzieś fajny wykład na ten temat i samą ideę regionów znam. Także jeśli chodzi o ich zastosowanie przy określaniu kształtu formy. Ale nie mam pojęcia jak je wykorzystać przy komponentach :/ Podrzuć jakieś info, pliiiiiiiiz......

0
  1. Co do regionów i komponentów:
    Było w FAQ [bo dzisiejszym newsie całe przejrzałem:P]
    http://4programmers.net/view_faq.php?id=31

Problem pojawia się gdy komponenty nie są prostokątne

GDZIE TY WIDZIAŁEŚ NIEPROSTOKĄTNE KOMPONENTY??
Przecież każde okno w Windows musi być prostokątne...

<font color="blue">[</span><font color="red">ADD</span><font color="blue">]</span>
Mógłbym jeszcze dodać (wczoraj byłem śpiący i mi się nie chciało), że owszem komponent może być 'nieprostokątny' (kiedy nie jest oknem: TGraphicComponent), ale tylko pozornie, bo nawet Delphi traktuje go jako prostokąt... Taka mała nic nie zmieniająca dygresja...
Takie komponenty nie mają handle (acz 100% pewności nie mam, bo mi się nie chce sprawdzać, ale chyba nie powinny mieć uchwytu) i wtedy... czytaj post Vogel`a

0

Ustawienie regionu dla komponentu typu TImage odbywa się naokoło: wrzuć TImage na TPanel i ustal region dla TPanel.

0

Ten listning tworzy formę tam gdzie ma onakomponenty. Gdy wrzucisz np. TShape i ustawisz go na elipsę, to nie otrzymasz eliptycznego formularza, ale prostoką, w kótry wpisana jest elipsa. Chodzi o to, że nie ma komponentów o niereguralnych kształtach (mówię o standardowych pakietach delphi). Wszystkie są kwadratami lub prostokątami (w sumie to kwadrat = prostokąt :-P). Przynajmniej tak sądzę. :-)

nadajac elipse tshape zmieniasz tylko jego rysowanie a nie ksztal.

0

nadajac elipse tshape zmieniasz tylko jego rysowanie a nie ksztal.

No właśnie wiem. :-) I ten problem chciałbym rozwiązać. :/

0

Dla TButtona(i każdego innego TWinControl'a) taka procedurka działa:

SetWindowRgn(Button1.Handle,CreateEllipticRgn(0, 0, Button1.Width, Button1.Height), True);

Jednak wygląda to dość badziewnie :-/

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0