A 1. Избавиться от рамки можно так. Как известно, в Windows существует настройка, определяющая двигаются ли окна целиком или двигается только рамка, а окно переносится на новое место после отпускания кнопки мыши. Менять эту настройку можно либо через панель управления, либо программно – с помощью функции SystemParametersInfo. Таким образом, нужно включить режим перетаскивания окна целиком, когда наше окно начинают перемещать, и вернуть его в первоначальное положение после того, как перемещение закончено.
О том, что перемещение начинается, окно узнаёт по сообщению WM_SYSCOMMAND (с параметром SC_MOVE). Когда перемещение завершается, окно получает ещё одно сообщение – WM_EXITSIZEMOVE. Обработчики могут выглядеть так:
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) {
if ((nID & 0xFFF0) == SC_MOVE) {
SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, &m_bDrag, 0);
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, TRUE, 0, 0);
}
CFrameWnd::OnSysCommand(nID, lParam);
}
LRESULT CMainFrame::OnExitSizeMove(WPARAM wParam, LPARAM lParam) {
if(m_bDrag != -1) {
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, m_bDrag, 0, 0);
m_bDrag = -1;
}
return Default;
}
Переменную m_bDrag типа int следует добавить с класс главного окна и инициализировать значением -1 в конструкторе.
Обратите внимание, что ClassWizard не умеет вставлять обработчик WM_EXITSIZEMOVE — придётся сделать это вручную, используя макрос ON_MESSAGE.
2. Сперва порекомендую метод, который широко применяют парни из Microsoft – использовать вместо кнопки Tool bar с одной-единственной кнопкой. Нужно только установить такому тулбару стили CCS_NOPARENTALIGN и CCS_NORESIZE, чтобы он не прижимался к верхней кромке окна, а оставался там, где мы его разместили. Этот же способ, кстати, можно использовать, если в приложении требуется "нормальная" плоская кнопка.
Ну а если такой способ не подходит, остаётся прибегнуть к custom draw. Это не должно быть проблемой, так как изображение для кнопки уже нарисовано – осталось добавить к нему выпуклую/вдавленную кромку.