Dela via


Ändra format för ett fönster som skapats av MFC

I sin version av WinMain funktionen registrerar MFC flera standardfönsterklasser åt dig. Eftersom du normalt inte redigerar MFC:s ger den funktionen dig ingen möjlighet att ändra MFC:s WinMainstandardfönsterformat. Den här artikeln beskriver hur du kan ändra formatmallarna för en sådan förregistrerad fönsterklass i ett befintligt program.

Ändra formatmallar i ett nytt MFC-program

Om du använder Visual C++ 2.0 eller senare kan du ändra standardfönsterformaten i programguiden när du skapar programmet. På sidan Användargränssnittsfunktioner i programguiden kan du ändra formatmallar för huvudramfönstret och MDI-underordnade fönster. För antingen fönstertyp kan du ange dess ramtjocklek (tjock eller tunn) och något av följande:

  • Om fönstret har kontrollerna Minimera eller Maximera.

  • Om fönstret visas initialt minimerat, maximerat eller ingetdera.

För huvudramsfönster kan du också ange om fönstret har en systemmeny. För underordnade MDI-fönster kan du ange om fönstret stöder delningsfönster.

Ändra formatmallar i ett befintligt program

Om du ändrar fönsterattribut i ett befintligt program följer du anvisningarna i resten av den här artikeln i stället.

Om du vill ändra standardfönsterattributen som används av ett ramverksprogram som skapats med programguiden åsidosätter du fönstrets virtuella medlemsfunktion PreCreateWindow . PreCreateWindow tillåter ett program att komma åt skapandeprocessen som normalt hanteras internt av klassen CDocTemplate . Ramverket anropar PreCreateWindow precis innan fönstret skapas. Genom att ändra CREATESTRUCT-strukturen som skickas till PreCreateWindowkan ditt program ändra de attribut som används för att skapa fönstret. Om du till exempel vill se till att ett fönster inte använder någon undertext använder du följande bitvis åtgärd:

// cs has been declared as CREATESTRUCT& cs;
cs.style &= ~WS_CAPTION;

Exempelprogrammet CTRLBARS visar den här tekniken för att ändra fönsterattribut. Beroende på vad programmet ändrar i PreCreateWindowkan det vara nödvändigt att anropa basklassimplementeringen av funktionen.

Följande diskussion beskriver SDI-ärendet och MDI-ärendet.

SDI-fallet

I ett SDI-program (single document interface) är standardfönstrets formatmall i ramverket en kombination av WS_OVERLAPPEDWINDOW och FWS_ADDTOTITLE formatmallar. FWS_ADDTOTITLE är ett MFC-specifikt format som instruerar ramverket att lägga till dokumentrubriken i fönstrets bildtext. Om du vill ändra fönsterattributen i ett SDI-program, åsidosätter du PreCreateWindow-funktionen i din klass härledd från CFrameWnd (som programguiden namnger CMainFrame). Till exempel:

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;
}

Den här koden skapar ett huvudramfönster utan knapparna Minimera och Maximera och utan en ansenlig kantlinje. Fönstret är initialt centrerat på skärmen.

MDI-fallet

Lite mer arbete krävs för att ändra fönsterstilen av ett underordnat fönster i ett Multiple Document Interface (MDI)-program. Som standard använder ett MDI-program som skapats med programguiden standardklassen CMDIChildWnd som definierats i MFC. Om du vill ändra fönsterformatet för ett underordnat MDI-fönster måste du härleda en ny klass från CMDIChildWnd och ersätta alla referenser till CMDIChildWnd i projektet med referenser till den nya klassen. Troligtvis finns den enda referensen till CMDIChildWnd i programmet i programmets InitInstance medlemsfunktion.

Standardfönsterformatet som används i ett MDI-program är en kombination av formatmallarna WS_CHILD, WS_OVERLAPPEDWINDOW och FWS_ADDTOTITLE . Om du vill ändra fönsterattributen för ett MDI-programs underordnade fönster åsidosätter du funktionen PreCreateWindow i klassen som härletts från CMDIChildWnd. Till exempel:

BOOL CChildFrame::PreCreateWindow(CREATESTRUCT &cs)
{
   // Create a child window without the maximize button
   cs.style &= ~WS_MAXIMIZEBOX;

   return CMDIChildWnd::PreCreateWindow(cs);
}

Den här koden skapar underordnade MDI-fönster utan knappen Maximera.

Vad vill du veta mer om?

Se även

Frame-Window formatmallar