CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Lepkie formularze

Lepkie formularze

dział ogólny

Lepkie formularze

Nowy postprzez Pitek » środa, 22 maja 2013, 18:39

Witam, chciałbym zrobić coś, na kształt przyklejania się okna do krawędzi pulpitu w Win7, znaczy jeżeli zbliżę okno do krawędzi drugiego okna (oczywiście ten sam program) to w odpowiedniej odległości one będą się do siebie lepić i przesuniemy je wzdłuż tego boku, dopiero oderwanie, czyli przesuniecie o jakiś większy odcinek spowoduje oderwania się okien od siebie. Jak to ugryźć ?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Lepkie formularze

Nowy postprzez Mironas » środa, 22 maja 2013, 19:08

Przechwytuj komunikaty o przesunięciu/przeskalowaniu okna:
Przechwyceniu komunikatu o przesunięciu formularza

Sterować innym oknem możesz przez zmianę jego parametrów Left/Top lub wysyłając do niego komunikaty za pomocą funkcji SendMessage(...)
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Lepkie formularze

Nowy postprzez Pitek » środa, 22 maja 2013, 22:55

Dziękuję ;) Ogarnąłem sobie to ładnie już mi działa. Tylko pytanie czy da się to jakoś zrobić "live" czyli żeby go "łapało" w trakcie przenoszenia ?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Lepkie formularze

Nowy postprzez Mironas » czwartek, 23 maja 2013, 11:20

pitek3010 napisał(a):czy da się to jakoś zrobić "live" czyli żeby go "łapało" w trakcie przenoszenia ?

Dokładnie to co potrzebujesz opisane jest w poradzie Sklejanie formularzy, jednoczesne przesuwanie dwóch formularzy

Tylko u mnie czasami okna przy użyciu tej metody pozostawiają śmieci na ekranie.

Sugeruję abyś zajrzał na stronę Cyfrowego Barona a zwłaszcza do działu TEMATYCZNY SPIS PORAD
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Lepkie formularze

Nowy postprzez Cyfrowy Baron » czwartek, 23 maja 2013, 15:50

Jemu chyba chodzi o funkcję Snap, czyli użytkownik przeciąga okno programu w pobliże krawędzi pulpitu, puszcza okno i zostaje ono przyciągnięte do tej krawędzi pulpitu.

Jeżeli o to chodzi, to począwszy od C++Builder 2010 formularz ma dwie właściwości:

ScreenSnap -> true - włącza przyciąganie okna do krawędzi pulpitu; false - wyłącza przyciąganie okna do krawędzi pulpitu
SnapBuffer -> wartość określająca z jakiej odległości od krawędzi pulpitu okno jest przyciągane.
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: Lepkie formularze

Nowy postprzez Mironas » czwartek, 23 maja 2013, 16:19

Jeśli chodzi o klejenie Form2 do Form1 to musisz podczas przeciągania Form2 sprawdzać jak jesteś blisko Form1 i korygować pozycję.
Ostatnio edytowano czwartek, 23 maja 2013, 17:28 przez Cyfrowy Baron, łącznie edytowano 1 raz
Powód: Poprawiłem swój post. Na przyszłość jeśli zobaczysz podobny błąd, to użyj ikonki trójkąta z wykrzyknikiem do zgłoszenia postu podając przyczynę.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Lepkie formularze

Nowy postprzez Pitek » piątek, 24 maja 2013, 00:10

Więc chodzi mi i o to i o to. Znaczy przyciąganie się okna ale nie do krawędzi pulpitu tylko do krawędzi drugiego okna. Ogarnąłem to wszystko ładnie działa, koryguje pozycje za pomocą Top i Left. Tylko chodzi mi o to że robię to w funkcji SetMoveWindow z porady Barona, kod wykonuje się dopiero po upuszczeniu przesuwanego okna. Ja chciałbym że okno łapało jeszcze podczas przesuwania go.... Tyle.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Lepkie formularze

Nowy postprzez Cyfrowy Baron » piątek, 24 maja 2013, 04:58

Funkcja SetMoveWindows tak działa i tego nie przeskoczysz. Powinieneś się skupić na poradzie Sklejanie formularzy, jednoczesne przesuwanie dwóch formularzy gdyż masz tam opisany sposób przechwytywania komunikatu w trakcie przesuwania formularza.
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: Lepkie formularze

Nowy postprzez sebaskow » środa, 29 maja 2013, 23:12

Musisz użyć zdarzenia WM_MOVING aby odczytywać na bieżąco pozycję okna i móc zareagować w odpowiednim czasie i przyciągnąć jedno okno do drugiego.

W Unit.h zadeklaruj metody prywatne:
KOD cpp:     UKRYJ  
private:        // User declarations
         TWndMethod Sc;
         void __fastcall OnFormMove(TMessage& Msg);
         RECT sRect, Rect;

Następnie w konstruktorze klasy okna wprowadź:
KOD cpp:     UKRYJ  
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Sc = WindowProc;
 WindowProc = OnFormMove;
 GetWindowRect(Handle, &Rect);
}

I masz gotowy wynik pozycji okna:
KOD cpp:     UKRYJ  
void __fastcall TForm1::OnFormMove(TMessage& Msg)
{
 if(Msg.Msg == WM_MOVING)
 {
  Rect  =* (RECT*)Msg.LParam;
  Caption = Rect.left; // pozycja okna
 }
 if(Msg.Msg == WM_SIZING)
 {
  Rect  =* (RECT*)Msg.LParam;
  Caption = Rect.top - Rect.bottom;
 }
 if(Msg.Msg == WM_KEYDOWN)  // --- 45102
 {
 ShowMessage("Wcisnąłem coś");
 }
 Sc(Msg);
}


Pozdrawiam.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows VistaChrome

Re: Lepkie formularze

Nowy postprzez Pitek » piątek, 31 maja 2013, 00:32

Dzięki ;)
Mam tylko mały problem z kodem poniżej. Mianowicie przy tych odległościach w których okno ma się kleić, zaczyna szaleć jak zwariowane. Jest to dla mnie zrozumiałe ale jak można temu zaradzić?
KOD cpp:     UKRYJ  
void __fastcall TForm2::OnFormMove(TMessage& Msg)
{
 if(Msg.Msg == WM_MOVING)
 {
  Rect  =* (RECT*)Msg.LParam;

                if(Left > Form1->Left + Form1->Width - 30 && Left < Form1->Left + Form1->Width + 30) //  odleglosc od okna lewo-prawo
                {
                        if(Top > Form1->Top - 30 && Top < Form1->Top + 30)
                        {
                                Left = Form1->Left + Form1->Width + 5;
                                Top = Form1->Top + 5;
                        }
                        else if(Top + Height > Form1->Top + Form1->Height - 30 && Top + Height < Form1->Top + Form1->Height + 30)
                        {
                                Left = Form1->Left + Form1->Width + 5;
                                Top = Form1->Top + Form1->Height - Height - 5;
                        }
                        else if(Top > Form1->Top + 30 && Top + Height < Form1->Top + Form1->Height - 30)
                                Left = Form1->Left + Form1->Width + 5;
                }
 }
 Sc(Msg);
}
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Lepkie formularze

Nowy postprzez polymorphism » piątek, 31 maja 2013, 09:29

Może zamiast przesuwać okno "na raty" właściwościami Top i Left użyj funkcji MoveWindow.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Lepkie formularze

Nowy postprzez Pitek » piątek, 31 maja 2013, 16:13

Nie rozumiem w czym różnica, może nie rozumiem idei tej funkcji, co robię źle ?
KOD cpp:     UKRYJ  
void __fastcall TForm2::OnFormMove(TMessage& Msg)
{
 if(Msg.Msg == WM_MOVING)
 {
  Rect  =* (RECT*)Msg.LParam;

                if(Left > Form1->Left + Form1->Width - 30 && Left < Form1->Left + Form1->Width + 30) //  odleglosc od okna lewo-prawo
                {
                        if(Top > Form1->Top - 30 && Top < Form1->Top + 30)
                        {
                                MoveWindow(Handle,Form1->Left + Form1->Width + 5,Form1->Top + 5,Form2->Width,Form2->Height,true);
//                              Left = Form1->Left + Form1->Width + 5;
//                              Top = Form1->Top + 5;
                        }
                        else if(Top + Height > Form1->Top + Form1->Height - 30 && Top + Height < Form1->Top + Form1->Height + 30)
                        {
                                MoveWindow(Handle,Form1->Left + Form1->Width + 5,Form1->Top + Form1->Height - Height - 5,Form2->Width,Form2->Height,true);
//                              Left = Form1->Left + Form1->Width + 5;
//                              Top = Form1->Top + Form1->Height - Height - 5;
                        }
                        else if(Top > Form1->Top + 30 && Top + Height < Form1->Top + Form1->Height - 30)
                        {
                                MoveWindow(Handle,Form1->Left + Form1->Width + 5,Form1->Top,Form2->Width,Form2->Height,true);
//                              Left = Form1->Left + Form1->Width + 5;
                        }
                }
 }
 Sc(Msg);
}
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Lepkie formularze

Nowy postprzez Cyfrowy Baron » piątek, 31 maja 2013, 17:28

Dzieje się tak dlatego, że mimo iż zmieniasz pozycję okna w kodzie, to system i tak przyciąga okno z powrotem do kursora. Wydaje mi się, że nie da się tego przeskoczyć. Nie spotkałem się z podobną funkcjonalnością w Windows XP.
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: Lepkie formularze

Nowy postprzez Pitek » piątek, 31 maja 2013, 17:42

Ale ja mam Win 7... Mam to w profilu.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Lepkie formularze

Nowy postprzez polymorphism » piątek, 31 maja 2013, 18:34

Wydaje mi się, że nie da się tego przeskoczyć.

Da się, musi tylko zaimplementować swoją obsługę przeciągania okna -> komunikaty WM_NCLBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP i WM_CAPTURECHANGED.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

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

cron