Plik nagłówkowy np. Unit1.h
private:
TWndMethod wmForm;
void __fastcall OnFormMove(TMessage& Msg);
Plik źródłowy np. Unit1.cpp
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:
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:
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:
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:
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.