Существуют два метода, которые позволяют убрать системное меню, которое появляется при клике пользователем по приложению, свёрнутому в иконку: - Переопределить функцию основного фрейма окна PreCreateWindow, чтобы удалить WS_SYSMENU из оконных стилей. Однако, данный метод убирает системное меню когда приложение находится в нормальном состоянии.
- Переопределить метод основного фрейма окна OnSize и включить или исключить стиль WS_SYSMENU окна основного фрейма в зависимости от действий пользователя. Данный способ позволяет убрать системное меню когда приложение свёрнуто в иконку и добавить системное меню, когда приложение восстановлено.
Первый метод Чтобы полностью убрать системное меню из приложения, переопределяем метод основного фрейма окна PreCreateWindow как показано ниже: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT & cs) { // Вызываем PreCreateWindow из базового класса, и в следующей // строке заменяем CMDIFrameWnd на CFrameWnd для SDI приложения
if (!CMDIFrameWnd::PreCreateWindow(cs)) return FALSE;
// Убираем бит стиля системного меню из окна
cs.style &= ~WS_SYSMENU; return TRUE; } Второй метод Следующие шаги и фрагменты кода показывают, как убрать системное меню когда приложение свёрнуто в иконку и вернуть системное меню, когда приложение восстановлено. - В объявлении класса CMainFrame объявляем public переменную типа BOOLEAN. Эта переменная определяет, разрешено системное меню или нет:
// В SDI приложении CMainFrame наследуется от CFrameWnd
class CMainFrame : public CMDIFrameWnd { public: BOOL sys_menu_enabled; . . // Остальные объявления класса . } - Изменяем конструктор CMainFrame, чтобы инициализировать переменную sys_menu_enabled в TRUE:
CMainFrame::CMainFrame() { //поумолчанию системное меню разрешено sys_menu_enabled = TRUE; . . // обычный код конструктора, если он есть . } - Воспользуемся визардом (Class Wizard), чтобы создать обработчик сообщения WM_SIZE для класса CMainFrame и добавим следующий код в обработчик сообщения CMainFrame::OnSize:
void CMainFrame::OnSize(UINT nType, int cx, int cy) { // объявляем локальную переменную для хранения стиля окна
long window_style;
//вызываем функцию OnSize базового класса, //если SDI приложение вызывает CFrameWnd::OnSize()
CMDIFrameWnd::OnSize(nType, cx, cy);
//если пользователь минимизирует приложение
if (nType == SIZE_MINIMIZED) { // Получаем стиль основного фрейма окна window_style = GetWindowLong(m_hWnd, GWL_STYLE);
//Убираем системное меню из оконного стиля window_style &= ~WS_SYSMENU;
//переключаем булевую переменную, чтобы запретить системное меню sys_menu_enabled = FALSE;
//Устанавливаем атрибуты стиля для основного фрейма окна SetWindowLong(m_hWnd, GWL_STYLE, window_style); } else { //если пользователь восстанавливает приложение //и его системное меню запрещено, if ((nType == SIZE_RESTORED) || nType == SIZE_MAXIMIZED) && (!sys_menu_enabled)) { window_style = GetWindowLong(m_hWnd, GWL_STYLE);
//Добавляем системное меню к стилю окна window_style |= WS_SYSMENU;
//переключаем булевую переменную, чтобы разрешить системное меню sys_menu_enabled = TRUE;
SetWindowLong(m_hWnd, GWL_STYLE, window_style); SendMessage(WM_NCACTIVATE,TRUE); } } } |