Здравствуйте!
Чтобы узнать координаты и размеры окна после его перемещения достаточно воспользоваться WindowX() и WindowY(). Аналогично и с его размерами - WindowWidth() и WindowHeight()
А Вот как быть, если нужно узнать координаты или размеры окна пока оно движется, т.е. пока пользователь перемещает или растягивает окно?
Вот попытка решить эту задачу:
Код:Dim FunkObrVyz(11) ; массив для коррекции координат окна ; FunkObrVyz(0) - номер окна ; FunkObrVyz(1) - погрешность внешней координаты по оси Х ; FunkObrVyz(2) - погрешность внешней координаты по оси Y ; FunkObrVyz(3) - погрешность внутренней ширины окна ; FunkObrVyz(4) - погрешность внутренней высоты окна ; FunkObrVyz(5) - координата внешнего Х окна ; FunkObrVyz(6) - координата внешнего Y окна ; FunkObrVyz(7) - внутренняя ширина окна ; FunkObrVyz(8) - внутренняя высота окна ; FunkObrVyz(9) - минимальнодопустимая ширина окна ; FunkObrVyz(10) - минимальнодопустимая высота окна ; FunkObrVyz(11) - флаг обновления погрешностей окна FunkObrVyz(0) = 2 FunkObrVyz(5) = 100 FunkObrVyz(6) = 100 FunkObrVyz(7) = 150 FunkObrVyz(8) = 120 FunkObrVyz(9) = 90 FunkObrVyz(10) = 90 Procedure Change(hwnd, Msg, wParam, lParam) Shared FunkObrVyz() Shared My_x Protected *WinRect.RECT If Msg = #WM_SIZING Or Msg = #WM_MOVING *WinRect = lParam My_x = *WinRect \ left ; х-координата левого края рамки растягивания окна My_y = *WinRect \ top ; у-координата верхнего края рамки растягивания окна My_w = *WinRect \ right - *WinRect \ left ; приблизительная ширина при растягивании окна My_h = *WinRect \ bottom - *WinRect \ top ; приблизительная высота при растягивании окна If FunkObrVyz(11) = 0 ; если начато передвижение или растягивание окна ; запоминаем погрешности внешних координат ; и внутренних размеров окна в массив FunkObrVyz(1) = WindowX(FunkObrVyz(0)) - My_x FunkObrVyz(2) = WindowY(FunkObrVyz(0)) - My_y FunkObrVyz(3) = WindowWidth(FunkObrVyz(0)) - My_w FunkObrVyz(4) = WindowHeight(FunkObrVyz(0)) - My_h FunkObrVyz(11) = 1 ; флаг завершения запоминания EndIf x = My_x + FunkObrVyz(1) y = My_y + FunkObrVyz(2) w = My_w + FunkObrVyz(3) h = My_h + FunkObrVyz(4) ; при уменьшении окна меньше минимальнодопустимого ; приравниваем к минимальнодопустимым размерам If w < FunkObrVyz(9) w = FunkObrVyz(9) EndIf If h < FunkObrVyz(10) h = FunkObrVyz(10) EndIf If x <> FunkObrVyz(5) Or y <> FunkObrVyz(6) Or w <> FunkObrVyz(7) Or h <> FunkObrVyz(8) FunkObrVyz(5) = x FunkObrVyz(6) = y FunkObrVyz(7) = w FunkObrVyz(8) = h EndIf EndIf ProcedureReturn #PB_ProcessPureBasicEvents EndProcedure If OpenWindow(FunkObrVyz(0), FunkObrVyz(5), FunkObrVyz(6), FunkObrVyz(7), FunkObrVyz(8), "Пример...", #PB_Window_SizeGadget | #PB_Window_SystemMenu) SetWindowCallback(@Change(), FunkObrVyz(0)) Repeat Event = WaitWindowEvent() If Event = #PB_Event_SizeWindow Or Event = #PB_Event_MoveWindow Debug "Реальный икс - "+Str(WindowX(FunkObrVyz(0))) + " , Расчетный икс - " + Str(FunkObrVyz(5)) Debug "Реальный игрек - "+Str(WindowY(FunkObrVyz(0))) + " , Расчетный игрек - " + Str(FunkObrVyz(6)) Debug "Реальная ширина - "+Str(WindowWidth(FunkObrVyz(0))) + " , Расчетная ширина - " + Str(FunkObrVyz(7)) Debug "Реальная высота - "+Str(WindowHeight(FunkObrVyz(0))) + " , Расчетная высота - " + Str(FunkObrVyz(8)) FunkObrVyz(11) = 0 EndIf Until Event = #PB_Event_CloseWindow EndIf
Только вот, не совсем удачная попытка... потому, как расчетные координаты при перетаскивании, а иногда и при сжатии\растягивании окна отличаются от тех, которые приобретает окно по завершению движения. Задача кажется нерешаемой, но ведь Windows "знает' где и какого размера ему рисовать окно, конда пользователь отпускает ЛКМ.
Подскажите, пожалуйста как можно вычислить\получить координаты и размеры окна при его перемещении?