Кнопки. Положение в диалоге.

Тема в разделе "WASM.BEGINNERS", создана пользователем Voronve, 24 янв 2007.

  1. Voronve

    Voronve New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    15
    Как считать текущие координаты кнопки в диалоге ?
    Хучу сделать кнопку изменяющую свою позицию при изменении размеров окна ...
     
  2. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Voronve
    Если ты хочешь перемещать кнопку в соотвествии с размером окна, то тебе ее координаты не понадобятся. Используя HIWORD и LOWORD lParam от WM_SIZE, двигай контролы с помощью MoveWindow.
     
  3. Voronve

    Voronve New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    15
    koderr
    Не совсем понял, кусок кода приведи, плиззз ...

    На форме есть не только кнопки, но рамки и списки, поэтому и спрашиваю как получить координаты ...
     
  4. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    координаты в этом случае нужно не получать, а задавать каждый раз при изменении размеров окна (в т.ч. эту же процедуру можно проделать вначале при создании окна). как их вычислять - прикинь сам по форме.
     
  5. Voronve

    Voronve New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    15
    Сенькс shoo, я бы ни за что не догадался что их нужно устанавливать ... :)
    Я уже рассчитал куда и насколько нужно сдвинуть кнопку, как мне получить текущее положение кнопки ?
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Код (Text):
    1. RECT rcButton;
    2. POINT pt;
    3.  
    4. GetWindowRect(hwndButton, &rcButton);
    5. rcButton.right -= rcButton.left;
    6. rcButton.bottom -= rcButton.top;
    7. pt.x = rcButton.left;
    8. pt.y = rcButton.top;
    9. ScreenToClient(hwndDialog, &pt);
    10. rcButton.left = pt.x;
    11. rcButton.top = pt.y;
    12.  
    13. // rcButton.left - координата X кнопки (относительно клиентской части диалога)
    14. // rcButton.top - координата Y кнопки
    15. // rcButton.right - ширина кнопки
    16. // rcButton.bottom - высота кнопки
     
  7. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Voronve
    Подсмотрел у Micro$oft :) Чуток переписал.
    Код (Text):
    1.     .elseif eax == WM_SIZE
    2.         movzx ecx, word ptr [lParam]        ;Width
    3.         movzx edx, word ptr [lParam + 2]    ;Height
    4.         invoke ArrangeControls, ecx, edx
    5. ;........
    6.  
    7. ArrangeControls proc dwWidth:DWORD, dwHeight:DWORD
    8. ;........
    9.     invoke MoveWindow, g_hButton1, 0, 0, x, y, TRUE
    10. ;........
    11.     ret
    12. ArrangeControls endp
    x и y вычисляются. Смотря что у тебя там еще в окне есть :)
     
  8. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    если ты сам ее поставил сразу - неужели нельзя запомнить куда ты ее ставил?

    вот пример (конечно, далек от идеала, и если его не удалили) - человек все сам расставляет: http://www.winasm.net/forum/index.php?showtopic=1429 (hook6)
     
  9. Voronve

    Voronve New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    15
    rmn
    rcButton.right -= rcButton.left
    Что означает это условие ?!
    Присвоить значение с минусом rcButton.left rcButton.right ?!

    koderr
    invoke MoveWindow, g_hButton1, 0, 0, x, y, TRUE

    НЕ РАБОТАЕТ !!!
    Первый два нуля - смещение левого верхнего угла кнопки относительно клиентской области. При такой записи батон растягивается чуть ли не на всю клиентскую область ...

    Мне нужно получить позицию левого верхнего угла кнопки относительно клиентской области, на сколько его нужно сдвинуть - посчитал уже.

    shoo
    Запомнить то можно, но если у меня в окне несколько контролов - запоминать позицию каждого чтоль ? Так никаких гигов оперативки не хватит ...
     
  10. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    возьмем на контрол 4 двойных слова (чтобы не парится) - итого 16 байт. сколько контролов у тебя на форме?
     
  11. Voronve

    Voronve New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    15
    shoo
    9 контролов * 16 байт = 144 байта - не много ...
    но данное решение (в лоб) не красивое и безграмотное - зачем хранить что-то что и так храниться в системе ? Нужно просто получить доступ ...
     
  12. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Попутал слегка :) первые два нуля - это и есть x и y.
     
  13. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    не согласен. некрасиво каждый раз вызывать функцию системы вместо того, чтобы просто взять число из ячейки.
     
  14. Voronve

    Voronve New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    15
    koderr
    Вторые два параметра
    invoke MoveWindow, g_hButton1, x, y, 0, 0, TRUE

    Это длина и высота контрола, если я их в ноль скину - то контрол не прорисуется ...
     
  15. Voronve

    Voronve New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    15
    shoo
    Если я меняю количество контролов в окне, либо кто нить захочет воспользоваться моей функцией то зачем накладывать жесткие ограничения по выделению памяти ?

    Щас свалимся в проблему размер кода/скороть исполнения ...
     
  16. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    ну ладно ;) переубеждать не буду - путей много ;)
     
  17. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    rcButton.right -= rcButton.left это то же самое, что и rcButton.right = rcButton.right - rcButton.left
     
  18. Voronve

    Voronve New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    15
    rmn
    Спасибо. Буду пробывать ...
     
  19. Voronve

    Voronve New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    15
    rmn
    Приведенный тобой код в (3) не работает. Отладчик показывает какие то нереальные координаты кнопки. :dntknw:
     
  20. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    в качестве hwndButton ты хендл кнопки передал (hwndButton = GetDlgItem(hwndDialog, IDC_BUTTON1)) или ее ID?
    Покажи код.