CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - WM_MOVING - obsługa komunikatu

WM_MOVING - obsługa komunikatu

dział ogólny

WM_MOVING - obsługa komunikatu

Nowy postprzez sebaskow » poniedziałek, 10 grudnia 2012, 15:17

Mam pytanie.

Jak obsłużyć komunikat WM_MOVING w naszym c++ builder ?
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 XPChrome

Re: WM_MOVING - obsługa komunikatu

Nowy postprzez Cyfrowy Baron » wtorek, 11 grudnia 2012, 01:06

Ale co dokładnie chcesz zrobić? Wysłać komunikat, odebrać komunikat etc...
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: WM_MOVING - obsługa komunikatu

Nowy postprzez sebaskow » wtorek, 11 grudnia 2012, 09:44

Chcę móc kontrować pozycję okna w trakcie przesuwania.
Chcę więc odbierać komunikaty.
Ale nic nie stoi na przeszkodzie żebym się dowiedział jak wysyłać taki komunikat.

Oczywiście nie przez:
KOD cpp:     UKRYJ  
Form1->Left = 100;
Form1->Top = 120;

Tylko przez SendMessage lub też PostMessage.

Z góry dziękuję za pomoc.
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 XPChrome

Re: WM_MOVING - obsługa komunikatu

Nowy postprzez Mironas » wtorek, 11 grudnia 2012, 11:03


Za ten post autor Mironas otrzymał podziękowanie od:
sebaskow
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: WM_MOVING - obsługa komunikatu

Nowy postprzez Cyfrowy Baron » wtorek, 11 grudnia 2012, 12:17

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:
                TWndMethod wmForm;
                void __fastcall OnFormMove(TMessage& Msg);


Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 wmForm = WindowProc;
 WindowProc = OnFormMove;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnFormMove(TMessage& Msg)
{
 if(Msg.Msg == WM_MOVING)
 {
   TPoint pt =* (POINT*)Msg.LParam;

  Caption =  "Left: " + (String)pt.X + " | Top: " + (String)pt.Y;
 }
 wmForm(Msg);
}


LParam zawiera koordynaty RECT okna programu. Ja posłużyłem się strukturą POINT, więc zwraca mi tylko koordynaty lewego górnego roku okna, można jednak pobrać RECT:

KOD cpp:     UKRYJ  
void __fastcall TForm1::OnFormMove(TMessage& Msg)
{
 if(Msg.Msg == WM_MOVING)
 {
   TRect fRect =* (RECT*)Msg.LParam;

  Label1->Caption = "Left: " + (String)fRect.Left + "\nTop: " + (String)fRect.Top
                                  + "\nRight: " + (String)fRect.Right + "\nBottom: " + (String)fRect.Bottom
                                  + "\nWidth: " + (String)fRect.Width() + "\nHeight: " + (String)fRect.Height();
 }
 wmForm(Msg);
}


Komunikat WM_MOVING zwraca wartości tylko gdy okno jest przesuwane, podczas gdy komunikat WM_MOVE zwraca wartości tylko lewego górnego rogu obszaru roboczego okna, czyli obszaru bez beli tytułowej i obramowania znanego jako ClientRect, jednak tylko parametrów X i Y, ale wartość jest aktualizowana nie tylko podczas przesuwania, ale również po przesunięciu:

KOD cpp:     UKRYJ  
void __fastcall TForm1::OnFormMove(TMessage& Msg)
{
 if(Msg.Msg == WM_MOVE)
 {
   TPoint pt;
   pt.X = (int)(short)LOWORD(Msg.LParam);
   pt.Y = (int)(short) HIWORD(Msg.LParam);

  Label1->Caption =  "Left: " + (String)pt.X + " | Top: " + (String)pt.Y;
 }
 wmForm(Msg);
}


lub prościej:

KOD cpp:     UKRYJ  
void __fastcall TForm1::OnFormMove(TMessage& Msg)
{
 if(Msg.Msg == WM_MOVE)
 {
   POINTS pt = MAKEPOINTS(Msg.LParam);

  Label1->Caption =  "Left: " + (String)pt.x + " | Top: " + (String)pt.y;
 }
 wmForm(Msg);
}


W celu zmiany pozycji okna za pomocą kodu można posłużyć się funkcją MoveWindow:

KOD cpp:     UKRYJ  
MoveWindow(this->Handle, 50, 100, this->Width, this->Height, true);


Za pomocą komunikatu WM_MOVE, czy też WM_MOVING nie można zmienić pozycji okna.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
sebaskow
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: WM_MOVING - obsługa komunikatu

Nowy postprzez sebaskow » czwartek, 13 grudnia 2012, 04:58

Naprawdę dziękuję.

Jeszcze tylko jedno pytanie mi się nasunęło:
Rozumiem że w ten sposób mogę obsługiwać inne komunikaty okna ?

http://www.autohotkey.com/docs/misc/SendMessageList.htm
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 7Firefox

Re: WM_MOVING - obsługa komunikatu

Nowy postprzez Cyfrowy Baron » czwartek, 13 grudnia 2012, 09:15

Nie wszystkie komunikaty można wysyłać, niektóre można tylko odbierać i nie zawsze w ten sam sposób. W niektórych trzeba obsłużyć np. tylko LParam, a w innych również WParam,
Poczytaj to: http://programowanie.cal.pl/cyfbar/teor13.htm
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


  • 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 4 gości