SÅTMINDFODIHS (eller eng FAQ)
(Ständigt Återkommande Tjatiga. Men Inte Nödvändigtvis Dumma Frågor Och Dess Ibland Hjälpsamma Svar)

Här är en medvetet kortfattad FAQ. Er uppgift är att tänka själva och gräva fram

resten av informationen. Ni kommer att behöva undersöka  lite saker här och där.

Nyaste frågorna kommer att hamna först här så det kan löna sig att titta in här då och då.

Har du fråga, skicka till dfm@mdh.se . OBS! Skriv CPP-FAQ i rubriken.

 

Frågorna har ingen egentlig inbördes ordning. Bli inte avskräckt av de översta (nyaste) frågorna eftersom

dessa troligtvis är de ”svåraste”.

Hur skapar jag child windows dynamiskt

Lättast är att inte göra det alls. Gör allt i resource editorn istället och göm dom fönster som inte skall ”finnas”
ShowWindow(SW_SHOW) resp SW_HIDE är bra att ha...

Hur gör jag drag and drop?

Drag and drop är lite speciellt i windows. Egentligen måste man registrera drop source och target samt implementera några interface (vilket i sin tur innebär en massa saker). Ett enklare sätt  visas i exemplet dragDropDemo

Kanske inte det mest fulländade exempel, men det duger som principlösning.
Obsevera att det är containern som hanterar musklickningar på child windows. Om du sätter notify till true och implementerar en event handler för klick eventet- så kommer inte containern att få detta musklick (om du inte trollar lite förstås! ;)

 

Hur använder jag tangentbordet för att styra en gubbe tex?

  Se artikeln som rekommenderas nedan. GetAsynchKeyState är ett tips.

Hur använder jag timern för att få events med jämna mellanrum?

Om du I visual studiohjälpen söker efter

“Moving Your Game to Windows, Part II: Mouse and Joystick Input”

Så hittar du en massa snaskiga tips om du vill krångla till din applikation.

(Kan även nås under fliken Contents, Technical Articles\Multimedia. Här finns en hel del bra tips.)

 

Kortfattat använder du Win32 funktionen SetTimer för att starta timern som skickar WM_TIMER

events till din applikation.

 

Har du större tidskrav kan du använda multimedia timers som går i en egen tråd. Kolla in timeSetEvent.
Du måste då skriva en callback funktion. Notera att DWUSER skickas till din callback funktion och kan

tex innehålla en pekare till din dialogklass....

Hur byta bitmapp på en image control?

En image control är ett fönster av typen CStatic.

En sådan som är satt att visa en bitmap kan sättas att visa en annan bitmap genom

metoden SetBitmap. Kruxet med denna metod är att du först måste ladda bitmappen

och få en handle till den. Du får inte heller göra delete på denna bitmapp innan du har

satt en ny(Därav
         

     //Get dialog control
     CStatic* pImageCtrl = (CStatic*) GetDlgItem(IDC_BONDE);;

     CBitmap newBitmap;// Wrapper class for HBITMAP

     newBitmap.LoadBitmap(IDB_MYNEWBITMAP);

      

     HBITMAP hOldBitMap = pImageCtrl->GetBitmap(); // Get old bitmap

 

     pImageCtrl->SetBitmap(newBitmap); // Use new bitmap (CBitmap converts to HBITMAP)

     DeleteObject(hOldBitMap); // Do not use delete or free on handles!


    
newBitmap.Detach(); // get rid of the wrapper class, but do not delete handle

Om jag vill animera en image control ?

Typiskt om man vill ha en animering kan man ju göra en array av CBitmap. I init dialog kan du förbereda den

genom att göra LoadBitmap på dem. Om du satt vettiga värden på dina resurser går detta ju galant med en for-loop.

Observera här att du då inte behöver göra delete på den gamla bitmappen, eftersom du dödar alla bitmapparna på en

gång i dialogens destruktor. (eftersom du anv wrapperklassen CBitmap går det att anv delete ,eftersom destruktorn på

CBitmap  i sin tur gör DeleteObject på bitmap handle’n.)

 

Sen kan du använda timern för att få events med vissa mellanrum.

 

Hur Skapa Fönsterapplikation?

Skapa en MFC Appwizard (exe)

Välj att skapa en dialog based exe

För att undvika onödig valångest, klicka ”Finished”.

 

Hur Arbeta med resurser?

Tittar du under ”Resource View” tabben i workspace fönstret, ser

du resurserna som skapats för din applikation. Under fliken ”Dialog” har du fått två dialog resurser. 

 

Om du dubbelklickar på huvud dialogresursen så kan du rita upp ditt UI. Typiskt kommer detta att vara schackbrädet med alla schackpjäser  på,

Glöm inte att ge pjäs resurserna vettiga ID

 

Är man lite trixig kan man koda in information i resursIDt.

Vita spelare:
  Bönder 1000 – 1008

  Torn   1100 –1102

  och så vidare

Svarta spelare:

  Bönder 2000 – 20008

  Torn 2100 – 2102

  och så vidare...

 

Nu kan man nämligen lista ut vilken pjäs det är från Idt.

Hur Väljer jag värde på resurs IDt?

Kolla in ”Properties” på den aktuella resursen.

Istället för att ange IDC_BONDE1 så anger du IDC_BONDE1=1000

 

Hur sätter jag in Ikonerna i dialogen då?

Välj ”Picture” från toolboxen.

Rita ut den där du vill ha den på dialogen.

I dess ”Properties” kan du välja vilken typ av picture det skall det bli. Typiskt väljer du här ICON. Då får du välja vilken ikon du vill ha (i rutan under).  Du kan bara välja bland de ikon resurser du har i ditt projekt.

 

 

Hur sätter jag in nya ikoner i projektet?

Under ”Insert | New Resource” kan du lägga till nya resurser.

 

Hur sätter jag in färdigritade resurser?

Kopiera in bitmapparna till din arbetsfolder.

Högerklicka på foldern ”Icon” i resursvyn.

Välj ”Import”.

Hur fångar jag en musklickning från en ikon?

För att en ikon skall skicka ett WM_LBUTTONDOWN meddelande till huvuddialogen måste du ändra dess resursID till nåt annat än IDC_STATIC. Du måste även kryssa i ”Notify”. Du får leta runt lite bland property flikarna.( Är inte resursID ändrad, så dyker inte ikonens resursid upp i klasstrollkarlen, är inte notify ikryssad så kommer inget att skickas till dialogen när du kör programmet).

Använd sedan classwizard | messagemap och lägg till en funktion för BN_CLICKED för den aktuella ikonen.

 

Hur använder jag activeXer i min applikation?

Gör inte det om du inte är mycket vass på detta. ActiveXer fungerar helt annorlunda än de fönsterkontroller du hittar i toolboxen.

 

Hur startar jag class wizard?

Högerklicka på dialogen och välj class wizard. (Alt 2, Från menyerna View| Class Wizard. Men då måste du välja ut dialogen själv...)

 

Vem bör ta hand om mina events?

Både applikationsklassen och dialogklassen kan ta hand om meddelandena från de olika resurserna du stoppar in. Dock är det ju vettigast att dialogklassen hanterar alla meddelanden.

 

Är det svårt att programmera i windows?

Nej inte om man kan det. Gör det inte krångligare än ni behöver.

 

 

Vad är CWnd för något.

CWnd är en klass som förenklar kommunikationen med ett fönster. (All egentlig fönsterhantering är ju skriven i C, eftersom WINAPIt är skrivet i C).
Notera dock att fönstret ”finns från början”. Sen kan du använda tex GetDlgItem för att få en instans av CWnd som pratar med detta fönster. Dock dör inte fönstret när denna klass dör...

 

 

Hur skapar jag ikoner dynamiskt?

Gör inte det. Det är tämligen knöligt och svårt att få att fungera innan tentan. Skapa dem allihop i resurseditorn istället. Göm fönstret tills det behövs istället.

 

Hur gömmer / visar jag ett fönster?

ShowWindow på CWnd objekt tar SW_HIDE för att gömma och SW_SHOW för att visa fönstret.

Alla kontroller i toolboxen (även knapparna och listorna! är fönster CWnd).

 

Hur får jag tag på CWnd objekt för ett fönster ?

Med ChildWindowFromPoint eller GetDlgItem så får du en CWnd.

 

 

Behöver jag göra delete på det jag får tillbaka från getdlgitem?

Nej, inte om du inte gillar att debugga konstiga fel.