Пример – приложение DragWin (диалоговое окошко, MFC) иллюстрирует два способа осуществить перемещение окна с захватом его не только за заголовок, но и за любую точку на клиентской области. Идея первого способа проста – при получении сообщения о перемещении мыши передвигаем наше окно в соответствии с новыми координатами. Второй способ поизящнее, и заключается в некотором "обмане" Windows,
после которого она считает, что мышь находится над заголовоком окна, даже если реально это уже клиентсткая часть.
Способ 1
Реализован для главного окна приложения. Заключается в написании собственных обработчиков нажатия (WM_LBUTTONDOWN), перемещения (WM_MOUSEMOVE) и отпускания (WM_LBUTTONUP) левой кнопки мыши. Обработчики на данные события устанавливаются стандартным образом – через MFC ClassWizard.
return TRUE; // !!! было return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
Замена курсора естесственно не является критичной для собственно перетаскивания, а добавлена исключительно для визуализации процесса захвата окошка.
Способ 2
Реализован для окна About этого же приложения. Заключается в замене обработчика события WM_NCHITTEST, которое информирует об области, над которой в данный момент находится мышка. Обработчик этого сообщения также можно добавить через MFC ClassWizard. Предварительно на закладке ClassInfo для класса CAboutDlg нужно установить для Message Filter значение Window.
Переписываем функцию – обработчик следующим образом:
UINT CAboutDlg::OnNcHitTest(CPoint point) {
UINT ret = CDialog::OnNcHitTest(point);
// если обработчик по умолчанию говорит нам что мышка
// над клиентской областью окна, заменяем возвращаемое
// значение на HTCAPTION – мышка над заголовком окна,
// а за заголовок перемещать окно можно!
if (ret == HTCLIENT) return HTCAPTION;
return ret;
}
Второй способ проще, первый потенциально гибче, используйте тот, что лучше подходит к вашему конкретному случаю.
Если у вас есть вопрос по программированию, вы можете задать его одном из форумов на RSDN.
Это все на сегодня. Не забывайте заходить на RSDN. До встречи!
Алекс Jenter [email protected]Красноярск, 2001. Рассылка является частью Проекта RSDN