1. Programguiden

 

 

·     MFC AppWizard.

 

·     Project Workspace.

 

·     Menyredigeraren.

 

·     Dialogeditorn.

 

·     Koppla menykommando.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


MFC AppWizard.

                       [File  - New...]

 

Nu övergår vi till en ny fas i kursen, öppnar ett nytt häfte, och varför inte skapa en separat katalog under c: även för dessa övningsuppgifter. Vi kan t.ex. kalla den c:\WinMFC. Därefter skapar vi ett nytt projekt, men denna gång blir det litet annorlunda.

 

När vi tidigare skapade våra projekt valde vi nästan alltid 'Console Application' i dialogrutan 'New Project Workspace'. Enda undantaget var i första häftets kapitel 10, när vi gjorde ett Windows-program. Då valde vi i stället ‘Application’. Detta val resulterade i huvudsak tre skillnader i våra projekt:

 

1.   ‘Console Application’ skapade en programfil som märkts för att köras under Dos, medan ‘Application’ skapade en programfil som märkts för att köras under Windows.

2.   ‘Console Application’ länkade in filen ‘winstub.obj’ i program­filen. Den innehåller den funktion som skriver ut texten ‘Detta program är avsett att köras under Windows’.

3.   Developer Studio sparade undan information om att programmet skulle startas via MS-Dos-prompt.

 

Nu vill vi skapa ett Windowsprogram igen, men denna gången kommer vi att använda Microsoft Foundation Classes (MFC). Välj därför ‘MFC Application (exe)' i listrutan ‘Type’.

 

 

         
Som synes följer vi den gamla traditionen att börja med ett exempel som skriver ut ‘Hello World’ på skärmen.

 

MFC innehåller en massa färdiga klasser att bygga programmet på. Dessa måste sättas samman enligt våra önskemål, och därför medföljer en programgenerator (programguide), vilken kallas AppWizard. När vi valde ‘MFC AppWizard’ och sedan trycker på ‘Create’ startas denna:

 

 

 

            

 

 

 

Här kan man välja mellan tre olika huvudtyper av program:

 

1.   Single document’, ett program som hanterar endast ett dokument i taget, som t.ex. Anteckningar och Paint. Vill man bearbeta flera dokument samtidigt måste man starta flera kopior av programmet.

2.   Multiple document’, ett program som kan hantera flera dokument samtidigt, som t.ex. Word och Developer Studio. Detta alternativ är förvalt.

3.   Dialog based’, ett program som har en dialogruta som program­fönster. Här kan man ha kontroller, d.v.s. tryckknappar, listrutor etc. i programfönstret utan att behöva använda verktygsfält.


Vi väljer ‘Single document’ och observerar hur bilden ändras för att visa vad vi valt. Vi ser också att ett verktygsfält finns med, men vi har inte haft möjlighet att göra den inställningen ännu. I själva verket kan AppWizard lägga till många fler finesser i vårt program. Det finns också en möjlighet att välja på vilket språk som felmeddelanden, menyval etc. ska skrivas. Tyvärr har man inte hunnit till svenska än, så vi får själva översätta de texter som blir aktuella.

 

Var kan man göra resten av inställningarna då? I titelraden står att detta är sidan 1. Guiden har 6 sidor, dialogrutor, vilka man kan bläddra bland m.h.a. knapparna ‘<Back’ och ‘Next>’. Det finns också en knapp ‘Finish’, som man kan trycka på vilken sida man än befinner sig på. Den startar själva programgenereringen. Vi trycker på ‘Next>’, eftersom vi har fler inställningar att göra:

 

 

 

 

 

            

 

 

 

 

Denna sida handlar om databashantering, och vi kommer inte att behöva det denna gång. Vi går till nästa sida i stället:

Här har vi inställningar för objektlänkning och inbakning av objekt. Inte heller här gör vi någon inställning.

 

 

 

 

 

 

 

 

 

            

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Nästa sida däremot handlar om diverse komponenter som kan väljas alternativt väljas bort:

 

 

 

 

 

 

 

 

            

 

 

 

 

 

 

 

 

 

 

 

Vi ska göra ett enkelt exempel, så vi klickar bort de bockar vi hittar, och lämnar alla optioner avstängda.

Den näst sista sidan behandlar två helt olika saker, huruvida man vill ha kom­mentarer till den genererade koden eller ej, samt om man vill länka MFC dyn­a-miskt eller statiskt:

 

 

 

 

 

 

 

            

 

 

 

 

 

 

 

 

Man ska vara rätt bra driven innan man kan hitta i all den kod som genereras innan man klarar sig utan kommentarerna, så det valet lämnar vi ‘på’. Däremot ändrar vi det andra valet. Vi kan generera en programfil som dynamiskt länkas mot en dll som är gemensam för flera programfiler. Vårt projekt ska dock endast resultera i en programfil, och då kan vi lika gärna länka in MFC på vanligt sätt, d.v.s. statiskt.

Nu är det bara sista sidan kvar:

 

 

 

            

 

 

 

 

 

 

 

 

 

 

Här kan man ändra viss information. En del klasser tillåter att man använder andra namn på de filer som ska genereras, och åter andra tillåter att man ändrar vilken klass man ärver från. Vi ska inte ändra något i detta exempel. Detta är sista sidan, och ‘Next>’-knappen är passiv, så om allt är rätt ifyllt klickar vi i stället på ‘Finish’.

 

 

 

 

 

Innan projektet genereras får vi en sammanställning av vad vi har ‘beställt’:

 

 

 

                 

 

 

 

 

 

 

 

 

 

Vi klickar naturligtvis på ‘OK’.


Project Workspace.

 

Visste du att man inte är bunden till den layout vi sett med ‘Info View’ till vänst­er, redigering och hjälptexter till höger samt listningar i nederkanten? Förutom att man kan ändra inbördes storlek genom att dra i kanterna och att man kan stänga ett fönster (höger mustangent ger snabbmeny) så kan man visa det i anpassat läge. Dubbelklicka på kanten respektive titelraden, så växlar fönstret läge mellan dockat läge och anpassat. Det samma gäller för verktygsfälten.

 

Om vi nu anpassar ‘InfoView’ upptäcker vi att det egentligen heter ‘Project Workspace’. Det är egentligen bara den flik som innehåller böckerna som heter ‘InfoView’. Vi har dessutom fått fyra flikar nu när vi genererat ett MFC-projekt. Vi tittar litet närmre på dessa. Första fliken heter ‘ClassView’:

 

          

 

När vi expanderar mappen ‘Hello classes’ ser vi projektets ingående klasser. Det var de vi beställde förut plus en extra för dialogrutan ‘About…’ (svenska ‘Om…’). Det finns också en flik ‘Globals’. Expanderar man den finner man alla globalt deklarerade objekt, och där finns just nu endast ett: själva applikationen skapas som sådant.

 

Expanderar man en klass finner man ingående medlemsmetoder. De metoder som inte är publika markeras med en nyckel om de är deklarerade som ‘protected:’ och ett lås om de är deklarerade som ‘private:’. (Det sistnämnda förekommer inte i bilden ovan.)

Dubbelklick på en funktion resulterar i att motsvarande fil öppnas för redigering i redigeringsfönstret (om den inte redan är öppen), och att markören positioneras på funktionen.

 

Höger mustangent ger en snabbmeny där man bl.a. kan lägga till metoder i en klass, söka upp definitioner och referenser etc.

 

Nästa flik heter ‘ResourceView’. Här kan vi se de resurser som ingår i projektet. Det vi ser finns deklarerat i en fil som heter hello.rc i detta exempel. Om man öppnar en annan fil med tillägget ‘.rc’ får vi upp ett motsvarande ‘mappträd’ i redigeringsfönstret.

 

 

 

 

 

 

          

 

 

 

 

 

 

Expanderar man ‘Hello resources’ ser man ett antal mappar, en för varje typ av resurs som ingår i projektet. Expanderar man en sådan mapp får man en lista på ingående resurser av angiven typ. Ovan ser vi att AppWizard lagt till en dialog för ‘About…’.

 

Vi har också en meny. Det är den som fått identifikationen ‘IDR_MAINFRA­ME’. Om man dubbelklickar på en resurs öppnas resurseditorn i redigerings-fönst­ret och resursen läses in för redigering. Vi ska strax göra detta, när vi är klara med ‘Project Workspace’.

Den tredje fliken informerar oss om vilka filer som ingår. Vi expanderar mappen ‘Hello files’ och mappen dependencies som dyker upp:

 

 

          

 

 

Mappen ‘Hello files’ innehåller de filer som ingår i projektet. AppWizard har själv tagit hand om detaljen med ‘Insert Files into Project’. För vår bekvämlighets skull finns där även en fil som inte ska kompileras, den ska läsas - av oss. Filen heter ReadMe.Txt. I den filen beskrivs de filer som ingår i projektet. Dubbel­klicka och läs.

 

Mappen ‘Dependencies’ innehåller en lista på de filer som inte ingår direkt i projektet, utan som kommer med via #include eller motsvarande. Filen Hello.ico t.ex. innehåller den bitmap som beskriver programmets ikon. Den kommer med m.h.a. en instruktion i filen Hello.rc. Den är skriven i ett speciellt språk som läses av en speciell resurskompilator. Om man öppnar den filen m.h.a. ‘Anteckningar’ kan man finna följande rad, vilken anger ikonen och dess bitmapp:

 

IDR_MAINFRAME ICON DISCARDABLE "res\\Hello.ico"

 

Resurseditorn klarar inte alla sorters resurser, t.ex. fonter. De som den inte klarar får inte ligga i Hello.rc. Därför läggs sådana separat i en fil som i vårt fall heter Hello.rc2. Den kommer med genom att man sist i Hello.rc lagt in raden:

 

#include "res\\Hello.rc2" // non-Microsoft Visual C++ edited

                          // resources

Menyredigeraren.

 

Nu väljer vi ‘ResourceView’ och dubbelklickar på ‘IDR_MAINFRAME’ i map­pen ‘Menu’:

 

 

 

 

Här ser vi de ‘pop-up’-menyer som ingår i menyn. Det finns tre stycken, samt en tilläggsruta. I tilläggsrutan kan man lägga till en ny ‘pop-up’-meny eller ett meny­val, men det be­höver vi ingen nu. Man kan flytta om menyerna genom att dra dem med musen. Först markerar vi ‘Edit’ och tar bort den.

 

Därefter öppnar vi ‘File’ och tittar vad som finns i den menyn:

 

 

 

 

Observera följande:

 

·     Vi har fått menyval för hantering av dokument. Dessa är kopplade till funktioner i dokumentklassen, så man tar inte bort dem om de kommer att användas, eftersom man måste skapa kopplingarna när man lägger till dem.

·     Vi har ett passivt menyval ‘Recent File’. Denna text ska aldrig synas, den ska bytas ut mot senast använda filnamn.

·     Vi har fått avdelare. Dessa betraktas som menyval som inte fungerar. Dubbelklicka på en och betrakta egenskapsrutan. Det finns en egenskap som heter ‘Separator’, och den är förbockad för avdelare.

·     Även här finns en tom ruta, denna är till för att lägga in menyval eller ‘pop-up’-menyer.

Vi tar bort alla menyval i ‘File’-menyn utom en avdelare och menyvalet ‘Exit’. Därefter dubbelklickar vi på den tomma rutan och skriver in ‘&Hello’ i fältet ‘Caption’ i dialogrutan ‘Menu Item Properties’ som nu dyker upp:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Observera ‘&’-tecknet. Det är det som ger oss Alt-snabbtangenter. Titta på menyn, så ser du att ‘H’ i ‘Hello’ har blivit understruket:

 

 

 

 

Tryck på ‘Enter’ så stängs dialogrutan ‘Menu Item Properties’. Ett ID-begrepp skapas samtidigt för menyvalet. Det komponeras samman av ‘ID’, menyns och menyvalets namn: ID_FILE_HELLO. Dubbelklicka på ‘Hello’ igen så ser du det i fältet ID. Detta ID-begrepp motsvarar ett numeriskt värde. Det definieras i filen resource.h, vilken inte syns i ‘FileView’.

Dra nu upp menyvalet ‘Hello’ till positionen överst i ‘File’-menyn:

 

 

 

 

Nu är vi klara med menyerna. Spara och stäng resurseditorn, så ska vi ta och titta på var ID_FILE_HELLO hamnade. Öppna filen resource.h, så finner du raden:

 

#define ID_FILE_HELLO                   32771

 

Vi behöver naturligtvis inte själva hålla reda på detta nummer.


Dialogeditorn.

 

Starta redigering av IDD_ABOUTBOX på samma sätt som du startade redigeringen av menyerna:

 

 

 

           

 

 

 

Här syns dialogrutan och ett verktygsfält med diverse kontroller att använda i dialogrutor. Vi ska bara redigera ‘Copyright’-texten, vilken finns i en kontroll av typen ‘Static text’, ett s.k. rubrikobjekt. Dubbelklicka på texten så öppnas dialog­rutan för egenskaper igen. Lägg till ditt namn efter texten i fältet ‘Caption’:

 

 

 

 

 

 

 

Tryck ‘Enter’, stäng och spara.


Koppla menykommando.

 

Nu ska vi se till så att någonting händer när vi väljer [File - Hello]. Vi väljer att lägga in en funktion i klassen CMainFrame. Den funktionen kan göra det samma som vi gjorde i kapitel 10 i första häftet, använda en MessageBox() för att skriva ut texten ‘Hello World”. Så här gör vi för att lägga till en ‘Message handler’, som man kallar sådana funktioner:

 

1.   Klicka på fliken ‘ClassView’ i Project Workspace-fönstret.

2.   Dubbelklicka på någon av funktionerna, så öppnas filen mainfrm.cpp för redigering. (Man kan också klicka på dennas filnamn under fliken ‘FileView’ eller öppna som vanligt.)

3.   I och med att redigeringsfönstret innehåller en källkodsfil i ett MFC-projekt dyker det upp två kombinationsrutor i fönstrets överkant, ett för objekt och ett för meddelanden, samt en knapp som öppnar motsvarande headerfil. Välj vårt nya objekt:



4.   Under listan Messages väljer vi ‘COMMAND’. I och med att det inte finns någon funktion kopplat till detta kommando visas dialog­rutan ‘Add Member Function:



Observera namnkonstruktionen! Objektets beteckning föregått av ordet ‘On’. Allt enligt standarden med inledande versal på varje nytt ord.

5.   Tryck på ‘OK’ för att acceptera det angivna namnet och skapa funktionen. Ändra inte namnet, standarden är konsekvent och bra.

Nu har vi vår funktion. I den finns en kommentar som talar om var vi kan skriva vår kod. Lägg till en MessageBox(). Så här ska det se ut:

 

///////////////////////////////////////////////////////////////

// CMainFrame message handlers

 

void CMainFrame::OnFileHello()

{

 // TODO: Add your command handler code here

    MessageBox("Hello World!");

}

 

 

 

 

 

Nu kan vi kompilera, länka och testa vårt program. Så här ska det se ut när man väljer [About - Hello…]:

 

 

 

 

 

         

 

 

 

 

 

 

 

Vi kan prova vårt menyval [File - Hello]:

 

 

 

 

 

          

 

 

 

 

Och naturligtvis fungerar [File - Exit] samt alla programfönstrets standardfunk­tioner.

 

 

 

Övningsuppgift:

·      Ovanstående moment kommer att ingå i valda delar i alla kommande övningar och kommer då inte att förklaras närmre. Repetera och utför därför allt i detta kapitel tills du känner att du behärskar det till fullo.

 

 

 

 

? Läs om resurseditorn. Testa Help-knappen i egenskapsrutan medan den visar  egenskaperna för olika typer av objekt. Testa Help-knappen i AppWizards olika dialogrutor. Läs i böckerna om AppWizard.