Window - Don't move

Тема в разделе "WASM.BEGINNERS", создана пользователем ATX, 14 май 2008.

  1. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Доброго времени суток!

    Ув. колеги, подскажите как сделать чтобы главное/дочерние окна программы было нельзя двигать (тобиш юзер не мог перемещать окно по экрану).

    Заранее спасибо )
     
  2. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Создавать их сразу без шапок или неклиентские прерывания перехватывать и не пускать в DefWindowProc.
     
  3. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    _basmp_

    неклиентские прерывания перехватывать - это как???
     
  4. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Обрабатывайте WM_WINDOWPOSCHANGING. В нём передаётся адрес структуры, содержащей, помимо прочего, позицию окна. Пишите нужные Вам значения - и вуаля! Впрочем, есть более радикальный способ - лишить окно заголовка и рамки, за которую его можно перемещать/ресайзить. Однако, ИМХО, окно с рамкой и заголовком, отказывающееся двигаться - кавайнее %)
     
  5. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) а как его сделать всегда поверх всех окон ..
     
  6. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    ATX
    Перепутал. Одно пишу, о другом думаю. Не прерывания, сообщения. 'WM_NC' начинаются. в вашем случае 'WM_NCLBUTTONDOWN' интересно. Или ловить (или перед входом. не могу сказать точнее) 'WM_NCHITTEST' на выходе из DefWinProc и подменять значения в ЕАХ. Есть и другие методы.
     
  7. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Создать его с флагом WS_EX_TOPMOST. Или вызвать SetWindowPos с тем же флагом в HWNDInsertAfter.
     
  8. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    DEEP

    WS_EX_TOPMOST - даст только то что окно будет всегда находится поверх других окон ))
     
  9. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Верно =) но некоторые программы всеравно выше могут быть а я про абсолютный верх. например с топ мост диспетчер задач у меня сверху , а когда так то и панель нижняя сверху , асьука тоже сверху. Тотал командер сверху. А есть такое что оно всегда сверху =)
     
  10. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Собственно задача состит только в том чтобы сделать окно неподвижным )))

    Пока толковых вариантов небыло, хотя и задачка не отличается особой сложностью...
     
  11. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Я сделал как то окно не подвижным , но не кодом а ресурсами

    вот они

    Код (Text):
    1. #define IDD_DLG1 1000
    2. #define IDC_LST1 1001
    3. #define IDC_EDT1 1002
    4. #define IDC_BTN1 1003
    5. #include <windows.h>
    6. IDD_DLG1 DIALOGEX 6,5,298,135
    7. FONT 8,"MS Sans Serif",0,0,0
    8. STYLE WS_POPUP|WS_VISIBLE|DS_CENTER|DS_SETFOREGROUND|DS_SETFONT
    9. EXSTYLE WS_EX_TOPMOST
    10. BEGIN
    11.   CONTROL "",IDC_LST1,"ListBox",WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|WS_TABSTOP|LBS_NOINTEGRALHEIGHT|LBS_HASSTRINGS|LBS_NOTIFY,0,0,298,109,WS_EX_CLIENTEDGE|WS_EX_TOPMOST
    12.   CONTROL "",IDC_EDT1,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_MULTILINE,0,108,244,26,WS_EX_CLIENTEDGE
    13.   CONTROL "Send",IDC_BTN1,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,244,108,54,26
    14. END
    бордер в диалоге стоит Flat .. а так особенностей я н вижу =(
     
  12. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Решение проблемы перекрытия топмост-окна другими топмостами: в обработчик WM_KILLFOCUS надо добавить вот это:
    Код (Text):
    1. invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSENDCHANGING or SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW;
    ЗЫЖ

    тогда, может быть, не париться и просто сделать окно недоступным? Т.е. invoke EnableWindow, (окно), FALSE? Или, в самом деле, запретить приём кликов мышки через NCHITTEST?

    ЗЗЫ А в чём-таки заключается бестолковость? Какая задача - такие решения...
     
  13. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    calidus
    Я сомневаюсь, что описаные ресурсы делают окно неподвижным. Причина, думаю, в другом. Сделайте маленькую неподвижную шапочную демку с сорцами. Хотелось-бы посмотреть.
     
  14. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Вот. Маленькая, неподвижная, шапочная.
     
  15. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    DEEP
    (красиво пишете) Если вы мне, то это не через ресурсы. Если ТС, то он уже браковал вариант с WM_WINDOWPOSCHANGING. Недостаточно красиво.

    ATX
    Из поста #10 я понял, что это не рабочая проблема, а умный вопрос. Простыми методами не двигается окно без шапки, максимизированое и невидимое.
    Не отобразите его или сделайте слишком маленьким или задвиньте за пределы экрана.
     
  16. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Код (Text):
    1.    LRESULT CWnd0::OnNcHitTest(CPoint point)
    2.   {
    3.      UINT nHitTest = CWnd::OnNcHitTest(point); // Грубо вызываем DefWindowProc и смотрим что возвращает
    4.      if (nHitTest == HTCAPTION)
    5.        nHitTest=HTCLIENT;
    6.      return nHitTest;
    7.   }
    P.S.
    Забыл - просто обрабатываем WM_NCHITTEST
     
  17. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    dag
    ТС уже браковал такой подход
     
  18. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    IMHO даже очень красиво, или нужно чтобы его вообще сдвинуть нельзя было ? Так вроде ТС просил чтобы юзер не мог двигать по экрану, а NCHITTEST самый не трудоёмкий способ вроде как.
     
  19. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Хы. Придумал, как "запретить" перемещение ещё одним способом. В обработчике создания окна пишем следующее:
    Код (Text):
    1.   invoke ShowWindow, hWnd, SW_SHOWNORMAL;
    2.   invoke UpdateWindow, hWnd;
    3.   invoke LockWindowUpdate, hWnd;
    Однако это уж совсем ректально [т.е. через ж#$№] ;)
     
  20. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Я уже писал об этом в посте #8. ТС в #10 объявил все предыдущие методы голимыми. То-есть и этот.