Gå til innhold

FAQ: 4.1 - Hvordan programmere vinduer i Windows (Win32)?


Anbefalte innlegg

[Til FAQ'en]

 

FAQ: 4.1 - Hvordan programmere vinduer i Windows (Win32)?

 

Det må først sies at Win32 programmering, som det kalles, kan være rimelig rotete og at det foregår i C, ikke C++. Det finnes andre alternativer som både er enklere, bedre og er plattform-uavhengige, altså som fungerer på andre operativsystemer enn Windows.

 

Eksempler er:

FLTK

wxWindows

 

Denne artikkelen har lite med OpenGL/DirectX å gjøre, det finnes en annen <artikkel om dette i FAQ'en>.

 

Noen linker:

http://winprog.org/tutorial/

http://www.relisoft.com/win32/index.htm

 

Jeg tar her for meg Dev-C++ siden det er det jeg har selv og det er det som er fritt tilgjengelig, men det skal gå å taste inn koden under og bruke den mot/i andre compilere/IDE'er også.

(Noen som har noen erfaringer rundt dette i f.eks. Visual C++?)

 

 

4.1.1 - Bruke en ferdig mal i Dev-C++

- Start Dev-C++.

- Velg File -> New -> Project.

- Marker "Windows Application" og fyll inn name-rubrikken.

- Gi .dev-filen et navn. Det som står der fra før av fungerer fint - trykk Save.

- Du får et vindu med koden til et enkelt Win32-program.

- Trykk F9 for å compilere og kjøre det (gi filen et navn og trykk Save hvis den spør om dette).

 

Koden som ble generert fra malen ser slik ut:

#include <windows.h>



/*  Declare Windows procedure  */

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);



/*  Make the class name into a global variable  */

char szClassName[ ] = "WindowsApp";



int WINAPI WinMain (HINSTANCE hThisInstance,

                   HINSTANCE hPrevInstance,

                   LPSTR lpszArgument,

                   int nFunsterStil)



{

   HWND hwnd;               /* This is the handle for our window */

   MSG messages;            /* Here messages to the application are saved */

   WNDCLASSEX wincl;        /* Data structure for the windowclass */



   /* The Window structure */

   wincl.hInstance = hThisInstance;

   wincl.lpszClassName = szClassName;

   wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */

   wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */

   wincl.cbSize = sizeof (WNDCLASSEX);



   /* Use default icon and mouse-pointer */

   wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);

   wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

   wincl.hCursor = LoadCursor (NULL, IDC_ARROW);

   wincl.lpszMenuName = NULL;                 /* No menu */

   wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */

   wincl.cbWndExtra = 0;                      /* structure or the window instance */

   /* Use Windows's default color as the background of the window */

   wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;



   /* Register the window class, and if it fails quit the program */

   if (!RegisterClassEx (&wincl))

       return 0;



   /* The class is registered, let's create the program*/

   hwnd = CreateWindowEx (

          0,                   /* Extended possibilites for variation */

          szClassName,         /* Classname */

          "Windows App",       /* Title Text */

          WS_OVERLAPPEDWINDOW, /* default window */

          CW_USEDEFAULT,       /* Windows decides the position */

          CW_USEDEFAULT,       /* where the window ends up on the screen */

          544,                 /* The programs width */

          375,                 /* and height in pixels */

          HWND_DESKTOP,        /* The window is a child-window to desktop */

          NULL,                /* No menu */

          hThisInstance,       /* Program Instance handler */

          NULL                 /* No Window Creation data */

          );



   /* Make the window visible on the screen */

   ShowWindow (hwnd, nFunsterStil);



   /* Run the message loop. It will run until GetMessage() returns 0 */

   while (GetMessage (&messages, NULL, 0, 0))

   {

       /* Translate virtual-key messages into character messages */

       TranslateMessage(&messages);

       /* Send message to WindowProcedure */

       DispatchMessage(&messages);

   }



   /* The program return-value is 0 - The value that PostQuitMessage() gave */

   return messages.wParam;

}





/*  This function is called by the Windows function DispatchMessage()  */



LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

   switch (message)                  /* handle the messages */

   {

       case WM_DESTROY:

           PostQuitMessage (0);       /* send a WM_QUIT to the message queue */

           break;

       default:                      /* for messages that we don't deal with */

           return DefWindowProc (hwnd, message, wParam, lParam);

   }



   return 0;

}

 

 

4.1.2 - Kort forklart hvordan koden fungerer

....må...skrive....her.....

 

 

4.1.3 - Linker til andre resurser

http://www.winprog.net/tutorial/ - Har en tutorial om Win32.

www.gametutorials.com - Denne

www.gamedev.net - ..og denne, tar for seg en del Win32 og annet.

Endret av daysleper
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...