Изменение стилей окна, созданного MFC
В своей версии WinMain
функции MFC регистрирует для вас несколько стандартных классов окон. Так как обычно вы не редактируете MFC, эта функция не дает возможности изменять стили окон по умолчанию MFC WinMain
. В этой статье объясняется, как изменить стили такого предварительно зарегистрированного класса окна в существующем приложении.
Изменение стилей в новом приложении MFC
Если вы используете Visual C++ 2.0 или более поздней версии, вы можете изменить стили окон по умолчанию в мастере приложений при создании приложения. На странице возможностей пользовательского интерфейса мастера приложений можно изменить стили для основного окна фрейма и дочерних окон MDI. Для любого типа окна можно указать толщину кадра (толстый или тонкий) и любой из следующих типов:
Имеет ли окно элементы управления "Свернуть" или "Развернуть".
Отображается ли окно изначально свернуто, развернуто или не будет.
В окнах основного кадра можно также указать, имеет ли окно системное меню. Для дочерних окон MDI можно указать, поддерживает ли окно области разделения.
Изменение стилей в существующем приложении
Если вы изменяете атрибуты окна в существующем приложении, следуйте инструкциям в остальной части этой статьи.
Чтобы изменить атрибуты окна по умолчанию, используемые приложением платформы, созданным с помощью мастера приложений, переопределите виртуальную функцию-член окна PreCreateWindow . PreCreateWindow
позволяет приложению получить доступ к процессу создания, обычно управляемому внутри класса CDocTemplate . Платформа вызывается PreCreateWindow
непосредственно перед созданием окна. Изменив переданную PreCreateWindow
структуру CREATESTRUCT, приложение может изменить атрибуты, используемые для создания окна. Например, чтобы убедиться, что окно не использует подпись, используйте следующую побитовую операцию:
// cs has been declared as CREATESTRUCT& cs;
cs.style &= ~WS_CAPTION;
Пример приложения CTRLBARS демонстрирует этот метод для изменения атрибутов окна. В зависимости от того, что в приложении изменяется PreCreateWindow
, может потребоваться вызвать реализацию базового класса функции.
В следующем обсуждении рассматривается случай SDI и случай MDI.
Случай SDI
В одном приложении интерфейса документа (SDI) стиль окна по умолчанию в платформе — это сочетание стилей WS_OVERLAPPEDWINDOW и FWS_ADDTOTITLE . FWS_ADDTOTITLE — это стиль, зависящий от MFC, который указывает платформе добавить название документа в подпись окна. Чтобы изменить атрибуты окна в приложении SDI, переопределите PreCreateWindow
функцию в классе, производную от CFrameWnd
(от имени мастера CMainFrame
приложений). Например:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT &cs)
{
// Call the base-class version
if (!CFrameWnd::PreCreateWindow(cs))
return FALSE;
// Create a window without min/max buttons or sizable border
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;
// Size the window to 1/3 screen size and center it
cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3;
cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3;
cs.y = ((cs.cy * 3) - cs.cy) / 2;
cs.x = ((cs.cx * 3) - cs.cx) / 2;
return TRUE;
}
Этот код создает главное окно фрейма без кнопок "Свернуть" и "Развернуть" и без скользякой границы. Окно изначально по центру отображается на экране.
Случай MDI
Для изменения стиля окна дочернего окна в приложении MDI требуется немного больше. По умолчанию приложение MDI, созданное с помощью мастера приложений, использует класс CMDIChildWnd по умолчанию, определенный в MFC. Чтобы изменить стиль окна дочернего окна MDI, необходимо наследить новый класс из CMDIChildWnd
проекта и заменить все ссылки CMDIChildWnd
на него ссылками на новый класс. Скорее всего, единственная ссылка CMDIChildWnd
на приложение находится в функции-члене приложения InitInstance
.
Стиль окна по умолчанию, используемый в приложении MDI, — это сочетание стилей WS_CHILD, WS_OVERLAPPEDWINDOW и FWS_ADDTOTITLE . Чтобы изменить атрибуты окна дочернего окна приложения MDI, переопределите функцию PreCreateWindow в классе, производную от CMDIChildWnd
. Например:
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT &cs)
{
// Create a child window without the maximize button
cs.style &= ~WS_MAXIMIZEBOX;
return CMDIChildWnd::PreCreateWindow(cs);
}
Этот код создает дочерние окна MDI без кнопки "Развернуть".