Как считать текущие координаты кнопки в диалоге ? Хучу сделать кнопку изменяющую свою позицию при изменении размеров окна ...
Voronve Если ты хочешь перемещать кнопку в соотвествии с размером окна, то тебе ее координаты не понадобятся. Используя HIWORD и LOWORD lParam от WM_SIZE, двигай контролы с помощью MoveWindow.
koderr Не совсем понял, кусок кода приведи, плиззз ... На форме есть не только кнопки, но рамки и списки, поэтому и спрашиваю как получить координаты ...
координаты в этом случае нужно не получать, а задавать каждый раз при изменении размеров окна (в т.ч. эту же процедуру можно проделать вначале при создании окна). как их вычислять - прикинь сам по форме.
Сенькс shoo, я бы ни за что не догадался что их нужно устанавливать ... Я уже рассчитал куда и насколько нужно сдвинуть кнопку, как мне получить текущее положение кнопки ?
Code (Text): RECT rcButton; POINT pt; GetWindowRect(hwndButton, &rcButton); rcButton.right -= rcButton.left; rcButton.bottom -= rcButton.top; pt.x = rcButton.left; pt.y = rcButton.top; ScreenToClient(hwndDialog, &pt); rcButton.left = pt.x; rcButton.top = pt.y; // rcButton.left - координата X кнопки (относительно клиентской части диалога) // rcButton.top - координата Y кнопки // rcButton.right - ширина кнопки // rcButton.bottom - высота кнопки
Voronve Подсмотрел у Micro$oft Чуток переписал. Code (Text): .elseif eax == WM_SIZE movzx ecx, word ptr [lParam] ;Width movzx edx, word ptr [lParam + 2] ;Height invoke ArrangeControls, ecx, edx ;........ ArrangeControls proc dwWidth:DWORD, dwHeight:DWORD ;........ invoke MoveWindow, g_hButton1, 0, 0, x, y, TRUE ;........ ret ArrangeControls endp x и y вычисляются. Смотря что у тебя там еще в окне есть
если ты сам ее поставил сразу - неужели нельзя запомнить куда ты ее ставил? вот пример (конечно, далек от идеала, и если его не удалили) - человек все сам расставляет: http://www.winasm.net/forum/index.php?showtopic=1429 (hook6)
rmn rcButton.right -= rcButton.left Что означает это условие ?! Присвоить значение с минусом rcButton.left rcButton.right ?! koderr invoke MoveWindow, g_hButton1, 0, 0, x, y, TRUE НЕ РАБОТАЕТ !!! Первый два нуля - смещение левого верхнего угла кнопки относительно клиентской области. При такой записи батон растягивается чуть ли не на всю клиентскую область ... Мне нужно получить позицию левого верхнего угла кнопки относительно клиентской области, на сколько его нужно сдвинуть - посчитал уже. shoo Запомнить то можно, но если у меня в окне несколько контролов - запоминать позицию каждого чтоль ? Так никаких гигов оперативки не хватит ...
возьмем на контрол 4 двойных слова (чтобы не парится) - итого 16 байт. сколько контролов у тебя на форме?
shoo 9 контролов * 16 байт = 144 байта - не много ... но данное решение (в лоб) не красивое и безграмотное - зачем хранить что-то что и так храниться в системе ? Нужно просто получить доступ ...
не согласен. некрасиво каждый раз вызывать функцию системы вместо того, чтобы просто взять число из ячейки.
koderr Вторые два параметра invoke MoveWindow, g_hButton1, x, y, 0, 0, TRUE Это длина и высота контрола, если я их в ноль скину - то контрол не прорисуется ...
shoo Если я меняю количество контролов в окне, либо кто нить захочет воспользоваться моей функцией то зачем накладывать жесткие ограничения по выделению памяти ? Щас свалимся в проблему размер кода/скороть исполнения ...
rcButton.right -= rcButton.left это то же самое, что и rcButton.right = rcButton.right - rcButton.left
rmn Приведенный тобой код в (3) не работает. Отладчик показывает какие то нереальные координаты кнопки.
в качестве hwndButton ты хендл кнопки передал (hwndButton = GetDlgItem(hwndDialog, IDC_BUTTON1)) или ее ID? Покажи код.