Поделиться через


Изменение стилей окна, созданного 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 без кнопки "Развернуть".

Что вы хотите узнать больше о

См. также

Стили окна кадра