przenoszenie formy uzywajac prawego przycisku myszy...

0

witam.
mam taki kodzik, ktory bardzo lubie:

ReleaseCapture;
Form1.Perform(WM_SYSCOMMAND, $F012, 0);

problem w tym, ze dziala on tylko z lewym przyciskiem myszy. nie moge uzyc np prawego a wlasnie to jest mi potrzebne...
probowalem mieszac to na rozne sposby z

SwapMouseButton();

oraz

mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);

ale jakos marnie mi to wychodzi...

ktos ma jakis pomysl?
pozdrawiam

0

chyba będziesz sam musiał napisać żeby format zmieniła położenie na Left + Ruchmyszy - pozycjaNaStarcie bo ten kodzik emuluje zdaje się kliknięcie na belkę niezależnie gdzie na formie będziesz miał mychę, ale to nie zwalnia z tego że kliknięcie na belkę musi być lpm żeby forme przesunąć ...

inwersja przycisków dla całego systemu tylko po to żeby dało się przesuwać formę prawym to nie zbyt fajny pomysł

0

możesz schować systemową belkę i zrobić swoją z panela, albo w ogóle borderstyle := bsnone i do tego panel (ale wtedy nie masz size gripa).

0
Adamo napisał(a)

chyba będziesz sam musiał napisać żeby format zmieniła położenie na Left + Ruchmyszy - pozycjaNaStarcie bo ten kodzik emuluje zdaje się kliknięcie na belkę niezależnie gdzie na formie będziesz miał mychę, ale to nie zwalnia z tego że kliknięcie na belkę musi być lpm żeby forme przesunąć ...

inwersja przycisków dla całego systemu tylko po to żeby dało się przesuwać formę prawym to nie zbyt fajny pomysł

inwersja jest tylko na czas przenoszenia. chodzi o to, zeby system myslal, ze wcisniety jest prawy a nie lewy przycisk-i wtedy przenosi.

snw napisał(a)

możesz schować systemową belkę i zrobić swoją z panela, albo w ogóle borderstyle := bsnone i do tego panel (ale wtedy nie masz size gripa).

eee... no wiem, ale przeciez nie o tym mowa.

0
cimak napisał(a)

eee... no wiem, ale przeciez nie o tym mowa.

o tyle o ile. mając panel zamiast systemowej belki możesz formę przenosić czym chcesz. prawym lewym i środkowym.

//edit: kto mi zepsuł avatara ? :>

0

no coś nie bardzo
niestety ale chyba będziesz musiał porzucić swój ulubiony kodzik i posłużyć się czymś pokroju:
Jak przesuwać formę jeżeli BorderStyle bsNone

0
snw napisał(a)
cimak napisał(a)

eee... no wiem, ale przeciez nie o tym mowa.

o tyle o ile. mając panel zamiast systemowej belki możesz formę przenosić czym chcesz. prawym lewym i środkowym.

//edit: kto mi zepsuł avatara ? :>

caly czas nie mam pojecia o co Ci chodzi :|

aj tam sie nie da...
wszystko sie da...... :-P
nie wiem tylko, dlaczego trzeba akurat 2razy ale niech bedzie, nie chce mi sie teraz nad tym zastanawiac ;] moze troche prowizorka ale dziala :-)

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var I:Integer;
begin
If Button=mbLeft then exit;

for i:=0 to 1 do
        begin
        mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
        SwapMouseButton(True);
          ReleaseCapture;
          Form1.Perform(WM_SYSCOMMAND, $F012, 0);
        mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);
        SwapMouseButton(False);
        end;
end;
Adamo napisał(a)

no coś nie bardzo
niestety ale chyba będziesz musiał porzucić swój ulubiony kodzik i posłużyć się czymś pokroju:
Jak przesuwać formę jeżeli BorderStyle bsNone

wiesz... co do tego linka:
zaczalem sie zastanawiac, czy faktycznie tego nie wykorzystac, bo pomyslalem sobie, ze moge tez bardzo prosto dodac przyciaganie do krawedzi. juz chcialem to zastosowac ale oto kolejna niespodzianka:
w tym kodzie jak sie przesuwa lewym przyciskiem to jest oki, ale jak prawym to przy szybszym szarpnieciu panel ktory przeciagam sie gubi. nie wiem dlaczego windows az tak roznie traktuje oba przyciski:/

0

prawdę mówiąc to lewym jak mocniej szarpniesz to też się gubi, może ty wolniej szarpiesz z lewym wciśniętym a nie system różnie traktuje
a chodzi o to że funkcja jest w onmousemove a pozycja jest względem elementu na którym się znajduje, jak szybciej zjedziesz myszą niż komputer ponowi procedurę no to no to ...

jednak ja dalej jestem bardzo przeciwny twojemu rozwiązaniu
a jak ktoś np cały czas pracuje na inwersji to po kliknięciu ty mu ją wyłączysz

0
Adamo napisał(a)

prawdę mówiąc to lewym jak mocniej szarpniesz to też się gubi, może ty wolniej szarpiesz z lewym wciśniętym a nie system różnie traktuje
a chodzi o to że funkcja jest w onmousemove a pozycja jest względem elementu na którym się znajduje, jak szybciej zjedziesz myszą niż komputer ponowi procedurę no to no to ...

nie, nie nie i jeszcze raz nie :-P
przynajmniej na pewno nie u mnie.
prosty test:
w OnMouseMove formy daj beep albo cokolwiek innego co bedzie sygnalizowac wywolanie procedury.
a teraz najedz myszka na forme, wcisnij lewy i wyjedz kursorem po za obszar formy - mimo ze kursor znajduje sie po za forma, procedura jest wywolywana. wiec nie ma prawa, zeby zgubilo panel, nawet przy nie wiem jakim szarpnieciu!
a teraz to samo zrob z prawym - procedura bedzie wywolywana tylko wtedy gdy kursor bedzie nad forma.
wiec system nie do konca tak samo traktuje oba przyciski.

no, chyba ze u Ciebie na kompie jest inaczej, wszysko jest mozliwe. ja mam xp prof pl :-P

0

u mnie to wygląda tak:
(jak napisałem, bs na bsNone i zamiast tego panel alTop)

procedure TMain.Panel2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if  Image13.Tag <> 1 then //jeśli nie zmaksymalizowany
    EventHandlers.CommonPanelMouseDown(Sender,Button,Shift,X,Y);
end;
procedure TEventHandlers.CommonPanelMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if  (Button = mbLeft) then //który przycisk chcę
    with Tpanel(sender) do
         begin
         Refresh;
         ReleaseCapture();
         Parent.Parent.Perform(WM_SYSCOMMAND, SC_MOVE+8, 0);
         end;
end;

tyle tylko że przenoszę okno 'po staremu' czyli dopiero jak puszczę myszkę to okno jest przesuwane. ale to moja decyzja bo malowanie formy przy każdym ruchu wyglądało w efekcie fatalnie.

//avatar się naprawił :/ :)

0

no fajnie tylko że "który przycisk chcę" oznacza mbLeft bo twój kod (który zresztą niewiele się różni od wszystkich podanych wyżej) działa TYLKO Z LEWYM PRZYCISKIEM MYSZY !

nie byłoby problemu gdyby okno podczas przesuwania odbierało jakiekolwiek komunikaty ... u mnie tego nie robi, zachowuje się jakby żadnego nie dostawał (bo zrobić przesuwanie prawym to żaden problem - wystarczy w komunikacie naciśnięcia PPM przeprawić komunikat żeby wyszło że to lewy został wciśnięty i okno się przesuwa, ale przestaje dopiero po odciśnięciu LPM bo nie dostaje komunikatu odciśnięcia PPM przez co nie można zrobić tego samego)

0
Adamo napisał(a)

no fajnie tylko że "który przycisk chcę" oznacza mbLeft bo twój kod (który zresztą niewiele się różni od wszystkich podanych wyżej) działa TYLKO Z LEWYM PRZYCISKIEM MYSZY !

rzeczywiście 8-O

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