Windows programmering part 1

Tags:    c++
Skrevet af Bruger #714 @ 30.03.2003
I denne artikel skal vi se på hvordan man kan bruge c til at lave andet end små consol applikationer, nemlig til hvordan man kan lave vinduer, knapper osv. Altås en kort lille, og sikkert ikke fuldendt, gennemgang af WIN32 API'et. Denne artikel kræver noget kendskab til c++, som du kan læse i nogle af de andre artikler her på udvikleren. Efter du har læst denne artikel, vil du være i stand til at: Lave din helt egen windows applikation med et vindue.

Lidt basis viden


Før vi går helt igang med kode, er det vigtigt at du forstår hvordan hele dit program skal bygges op. Ligesom når du laver consol programmer, så har dit program en "main" procedure, men når du laver windows applikationer ser den sådan her ud:

Fold kodeboks ind/udKode 


Og hvad betyder det så? Jo, det første "int", betyder at vi retunere en integer value til sidst. WINAPI definere calling conventionen, den behøves du ikke at tænke så meget over, bare du husker den. WinMain, er funktionens navn. hInstance er "handlenen" til vores program (.exe filen) i hukommelsen. hPrevInstance er altid NULL. lpCmdLine er kommando liniens argumenter som en streng, uden programmets filnavn. nCmdShow kommer vi til senere.

Den gode hello world


Som altid, skal der være et hello world eksempel. Det vi skal lave er et program, der viser en "box" og lukker ned igen.

Det ser sådan ud:

Fold kodeboks ind/udKode 


Forklaring



Det eneste jeg synes der er grund til at forklare er "MessageBox" funktionen. Den bliver du nød til at stifte bekendskab til, ellers så kommer du ikke langt, lad os se på hvordan Microsoft beskriver den:

Fold kodeboks ind/udKode 


Og hvad betyder det så?

int MessageBox betyder at MessageBox retunere en integer værdi.

HWND hWnd, kræver lidt mere forklaring. HWND typen, skal læses som Handle Window. Dette er "handleren" til "boxens" ejer vindue, da vi ikke har oprettet et, så satte vi det til NULL.

LPCTSTR lpText, kræver igen lidt forklaring. T'et (har jeg læst mig frem til der hvor jeg lærte C++, ret mig hvis det er forkert), har ingen betydning, med mindre vi skal kode noget unicode, så hvis vi glemmer det, så har vi LPSTR tilbage.
LPCSTR, skal læses som "Long Pointer Const String", altså en lang peger streng der ikke kan ændre værdi. Du skal bare betragte det som en streng, der ikke kan ændre værdi. Dette er selve teksten der kommer i vores "box", og den satte vi så til "Hello World".

LPCTSTR lpCaption, er igen en "lang peger streng der ikke kan ændre værdi". Dette er titlen på vores vindue.

UINT uType, er et unsigned integer, vi bruger ikke integer values, men nogle const variabler som er defineret i windows.h, som vi så kan bruge til, at lave knapper med, og bestemme hvilket ikon der skal komme med op (Du behøves ikke at angive et ikon). Hvis man vil angive mere end en skal man adskille dem med | Her er en oversigt over knapper, taget direkte fra WIN32 dokumentationen.

Fold kodeboks ind/udKode 


Og her er oversigten over ikonerne.
Fold kodeboks ind/udKode 


Du kan også angive hvilken knap der skal være standard knappen. Og mange andre ting. Hvad der er mere spændende, er hvad den retunere når der bliver klikket på den.

Vi kunne eks. forestille os, at vi havde lavet en tekst-editor og der lige var blevet trykket på krydset, og vi ville spørge brugere om han/hun vil gemme det han/hun har skrevet, vi kunne dermed bruge MessageBox() således:

Fold kodeboks ind/udKode 


Resten af de forskellige ID'er burde give sig selv(IDCANCEL, IDABORT osv.)

Der er også en del andre vi kan angive med MessageBox, men dem vil jeg ikke fortælle mere om lige nu.

Det endelige eksempel



Nu skal vi til det sjove, men også det meget svære, vi skal have lavet et vindue.
Først, koden, så forklaringen. Vær forberedt på det værste.

Fold kodeboks ind/udKode 


Det ser lidt uoverskueligt ud, og det kan det også være. I part 2, vil der komme en nærmere forklaring på koden. Men hvis du sidder med en hjælpefil over alle funktionerne så vil jeg råde dig til at kigge i den. Ellers, så kan jeg kun sige at vi ses i part 2.

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (18)

User
Bruger #349 @ 31.03.03 01:25
Hey kaare din artikel synes jeg ikke er så vild igen. Det ser ud som om du har mistet lysten til sidst og bare skyndt dig at blive færdig.
User
Bruger #714 @ 31.03.03 13:18
På en måde ja og nej, jeg ville egentlig bare være færdig til sidst. Men samtidig var jeg godt klar over at der skulle nærmere forklaring til, og som skrevet til sidst kommer den i næste part. Jeg er allerede gået igang med den kan jeg da røbe. Jeg dog ikke med at vise så meget kode i 2'eren, men mere forklaring, da det kræver lidt at sætte sig ind i den måde det hele kører i. Jeg håber at du vil skifte mening når 2'eren kommer :-).
User
Bruger #2853 @ 31.03.03 16:39
1. Du skriver at man i denne tutorial, vil lave programmer i c++. Det er ikke sandt, Win32 API'en er C.
2. Undrer mig lidt over hvorfor dine eksempler ligner (i sær det sidste) så meget http://www.winprog.org/tutorial.
3. Jeg synes godt du kunne have gjort dette noget bedre, for mig (har trodsalt brugt Win32 API'en i et pænt stykke tid) virker det som at det er noget hastværk.
4. Du skifter imellem danske og engelske kommentarer, igen noget der får mig til at tænke på, du ikke har helt ren mel i posen (http://www.winprog.org/tutorial)
5. Måske burde du indsende en rettelse til udvikleren.dk, det kan gøres via artikel systemet.
User
Bruger #714 @ 01.04.03 14:56
Simon -> Det er rigtigt at jeg har fået stort set alt min viden fra www.winprog.org/tutorial, det er der ingen grund til at ligge skjul på, dog vil jeg også sige at jeg faktisk selv er ny i det her, men jeg føler er jeg er ved at fatte bare lidt af hvad det går ud på, derfor synes jeg at der er andre end mig der skal have fornøjelsen af at kende til det. Meget muligt at der er mange andre der kunne gøre det bedre. Men indtil videre, er der jo ikke nogen der har gjort det. Så jeg tænkte at det måtte være nok. Men jeg skal nok lige kigge på det.

Dog skal det lige siges at jeg under INGEN omstændigheder har skrevet af fra www.winprog.org/tutorial, men hvis der var noget jeg var i tvivl om, var det mit opslagsværk hvis ikke jeg kunne finde det i hjælpefilen.
User
Bruger #2959 @ 23.05.03 16:36
Hvornår kommer der en part 2? Eller gider du ikke lave en? For jeg mangler forklaring på det siste eksempel
User
Bruger #714 @ 23.05.03 20:58
CHadi -> Efter lang tids venten på at få godkendt 2'eren, blev den afvist. Så der går nok lidt (meget) tid inden jeg får taget mig sammen til at skrive 2'eren.
User
Bruger #2407 @ 04.06.03 21:52
go artikel men ejg savner 2'eren! glæder mig til forklaringen på sidste kodeexempel!
User
Bruger #4058 @ 11.06.03 21:05
Når jeg kompilerer det endelige eksempel med min visual c++ 6 compiler skriver den:

error C4716: 'WndProc' : must return a value

og da jeg ikke ved så meget om at skrive windows-programmer så ved jeg ikke helt hvad den mener... det irriterer mig - men ellers er det en rigtig god artikel :-) håber at der snart kommer en 2'er
User
Bruger #2520 @ 10.07.03 11:38
Hej jeg håber at i den næste at du kommer ind på den sidste del. Også noget med at inkludere knapper osv det ville være dejligt :D

Men ellers kunne man jo nok lære lidt selvom den sidste del var lidt stinky :/
User
Bruger #714 @ 16.12.03 17:49
Jeg undskylder at den sidste del ikke er kommet endnu, og jeg tvivler også lidt på om jeg får den skrevet (sorry men tiden den fløj bare væk, har rigtig mange ting at tage mig til), men jeg kan da råde jer til at kigge på stedet hvor jeg selv lærte det, og ellers kan jeg da opfordre andre til at fortsætte min artikel serie hvis de føler at det er noget der er værd at fortsætte.

www.winprog.org/tutorial

Derudover det, vil jeg lige sige at jeg rent faktisk skrev part 2, men den blev afvist, skal se om jeg kan rode den frem og lægge den op og smide et link, men jeg har ikke tiden der skal til for at få den rettet, desværre.
User
Bruger #4882 @ 25.12.03 16:31
God tutorial selvom ligesom du selv siger mere eller mindre en omfomuleret tutorial der oprindeligt var lavet af theForger

og så lige en kommentar til Simon selvom jeg godt ved hans kommentar er ret gammel:
1. Du skriver at man i denne tutorial, vil lave programmer i c++. Det er ikke sandt, Win32 API'en er C.
Ja det er rigtigt, men du kan med de fleste compilere sagtens bruge c++ med det uden nogle fejl!
Og så lige noget til Chadi han har selv sagt at han har brugt http://www.winprog.org/tutorial som opslagsværk og efter min mening ligner den og hans hinanden bortset fra sproget og længden så gå derind hvis du kan forstå lidt engelsk og det regner jeg med ellers har du haft svært ved at lære at programmere
User
Bruger #1278 @ 10.03.04 19:12
Total fed artikel!! Rated 5/5
User
Bruger #3789 @ 01.08.04 20:14
Synes godt jeg kunne have brugt noget med nogle knapper og labels og hvad det ellers hedder, men det er jo trods alt kun en den 1. af noget som skulle have været
User
Bruger #6643 @ 14.10.04 21:45
når jeg prøver at compile (noget så simpelt som) det første exemple får jeg min 2 errors. Hvorfor? Og jeg bruger MSVS.
User
Bruger #5369 @ 27.01.05 23:30
Til alle der har probsm ed denne her: HUSK AAT OPRETTE ET WIN PROJEKT OG IKKE ET WIN CONSOLE PROJEKT.
User
Bruger #8985 @ 04.02.06 19:54
Hvorfor, om jeg må spørge, skal det her sprog være så skide indviklet?!?!? Bare et lille vindue fylder op mod 100 linier!!! :O
User
Bruger #8985 @ 26.02.06 11:20
Okay, var pænt noob den gang... Nu synes jeg det er legende let at lave vinduer, og din tutorial hjalp mig lige til at komme det ekstra skridt videre, jeg havde brug for!! Du får en 5'er..
User
Bruger #8473 @ 12.03.06 10:43
Virklig go' artikel den har lært mig meget selvom jeg stadig er ny i c++
siger bar' TAK!
Du skal være logget ind for at skrive en kommentar.
t