Доброго времени суток! Ув. колеги, подскажите как сделать чтобы главное/дочерние окна программы было нельзя двигать (тобиш юзер не мог перемещать окно по экрану). Заранее спасибо )
Обрабатывайте WM_WINDOWPOSCHANGING. В нём передаётся адрес структуры, содержащей, помимо прочего, позицию окна. Пишите нужные Вам значения - и вуаля! Впрочем, есть более радикальный способ - лишить окно заголовка и рамки, за которую его можно перемещать/ресайзить. Однако, ИМХО, окно с рамкой и заголовком, отказывающееся двигаться - кавайнее %)
ATX Перепутал. Одно пишу, о другом думаю. Не прерывания, сообщения. 'WM_NC' начинаются. в вашем случае 'WM_NCLBUTTONDOWN' интересно. Или ловить (или перед входом. не могу сказать точнее) 'WM_NCHITTEST' на выходе из DefWinProc и подменять значения в ЕАХ. Есть и другие методы.
Верно =) но некоторые программы всеравно выше могут быть а я про абсолютный верх. например с топ мост диспетчер задач у меня сверху , а когда так то и панель нижняя сверху , асьука тоже сверху. Тотал командер сверху. А есть такое что оно всегда сверху =)
Собственно задача состит только в том чтобы сделать окно неподвижным ))) Пока толковых вариантов небыло, хотя и задачка не отличается особой сложностью...
Я сделал как то окно не подвижным , но не кодом а ресурсами вот они Код (Text): #define IDD_DLG1 1000 #define IDC_LST1 1001 #define IDC_EDT1 1002 #define IDC_BTN1 1003 #include <windows.h> IDD_DLG1 DIALOGEX 6,5,298,135 FONT 8,"MS Sans Serif",0,0,0 STYLE WS_POPUP|WS_VISIBLE|DS_CENTER|DS_SETFOREGROUND|DS_SETFONT EXSTYLE WS_EX_TOPMOST BEGIN 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 CONTROL "",IDC_EDT1,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_MULTILINE,0,108,244,26,WS_EX_CLIENTEDGE CONTROL "Send",IDC_BTN1,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,244,108,54,26 END бордер в диалоге стоит Flat .. а так особенностей я н вижу =(
Решение проблемы перекрытия топмост-окна другими топмостами: в обработчик WM_KILLFOCUS надо добавить вот это: Код (Text): invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSENDCHANGING or SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW; ЗЫЖ тогда, может быть, не париться и просто сделать окно недоступным? Т.е. invoke EnableWindow, (окно), FALSE? Или, в самом деле, запретить приём кликов мышки через NCHITTEST? ЗЗЫ А в чём-таки заключается бестолковость? Какая задача - такие решения...
calidus Я сомневаюсь, что описаные ресурсы делают окно неподвижным. Причина, думаю, в другом. Сделайте маленькую неподвижную шапочную демку с сорцами. Хотелось-бы посмотреть.
DEEP (красиво пишете) Если вы мне, то это не через ресурсы. Если ТС, то он уже браковал вариант с WM_WINDOWPOSCHANGING. Недостаточно красиво. ATX Из поста #10 я понял, что это не рабочая проблема, а умный вопрос. Простыми методами не двигается окно без шапки, максимизированое и невидимое. Не отобразите его или сделайте слишком маленьким или задвиньте за пределы экрана.
Код (Text): LRESULT CWnd0::OnNcHitTest(CPoint point) { UINT nHitTest = CWnd::OnNcHitTest(point); // Грубо вызываем DefWindowProc и смотрим что возвращает if (nHitTest == HTCAPTION) nHitTest=HTCLIENT; return nHitTest; } P.S. Забыл - просто обрабатываем WM_NCHITTEST
IMHO даже очень красиво, или нужно чтобы его вообще сдвинуть нельзя было ? Так вроде ТС просил чтобы юзер не мог двигать по экрану, а NCHITTEST самый не трудоёмкий способ вроде как.
Хы. Придумал, как "запретить" перемещение ещё одним способом. В обработчике создания окна пишем следующее: Код (Text): invoke ShowWindow, hWnd, SW_SHOWNORMAL; invoke UpdateWindow, hWnd; invoke LockWindowUpdate, hWnd; Однако это уж совсем ректально [т.е. через ж#$№]