Win32 API

Tags:    c++ php mysqli

<< < 12 > >>
Hejsa,

jeg vil til at lære at programmere Win32 API i C++. Jeg har tænkt på at bruge et bibliotek, som f.eks. www.wxwidgets.org, men jeg vil hellere lære at programmere direkte i Win32 API'et.

Så til mit spørgsmål: Er det muligt at opbygge sine egne biblioteker, så jeg ikke skal skrive hele koden for f.eks. en knap hver gang? Altså så man f.eks. kunne inkludere en headerfil jeg selv har lavet, og skrive button("tekst","osv","osv");

Er der evt. en der har et eksempel på hvordan det kunne gøres?

For jeg vil gerne lære at programmere direkte i Win32 API'et, men omvendt synes jeg det er lidt irriterende at skulle skrive den samme kode flere gange.

Mvh. Anders



13 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Hej Lasse,

Ja, jeg skrev det kun ved at bruge Win32 API'et!

Jeg vil prøve at ridse det lidt op for dig!

Først lav en grund klasse der eksempelvis kunne hedde: CONTROL. Denne klasse skal aldrig benyttes alene, men er en klasse der kun indeholder de mest fundamentale Win32 kommandoer og funktioner. En rå skebelon af denne klasse kunne se således ud:

Fold kodeboks ind/udKode 


Create(HWND)
Denne funktion skulle egenligt havde været klassens constructor, men da det ikke vil kunne lade sig gøre på grund af dynamikken i mit vindue system, har jeg valgt at bruge denne funktion som en slags "constructor"... Denne funktion skaber selve vinduet og indeholder derfor Win32 funktionen CreateWindowEx(). Hvis den gældende vindue skal have en 'Parent /Child' forhold skal HWND'en fra dens 'Parent' passes som argument! Denne funktion skal forøvrigt ALDRIG kaldes direkte - men kan desværre heller IKKE tilføjes som en private member funktion, da andre klasser skal havde adgang til den (forklaring følg. senere)

HWND GetHandle()
Denne funktion returnere såmænd bare den private declared hwnd! Der findes ingen SetHandle() da hwnd'en bliver tilskrevet af Windows (i Create() funktionen)...

AddControl(CONTROL *)
Denne funktion kræver en pointer til en klasse af sin egen type. Det vil sige, at pointeren bliver betragtet som en 'Child' komponent og tilføjes til controls[] array'en i private sektionen! Denne funktion benytter Create() funktionen og derfor må Create() funktionen ikke benyttes udefra klassen (Kun på nær én enkelt undtagelse - men det kommer vi nærmere ind på)!

Messages(MSG)
Her er nok den mest interessante funktion. Denne funktion bliver kaldt af sin 'Parent' komponet, hvis den altså har sådan én! Den MSG der bliver krævet som argument, er ikke nøvendigvis sendt for at blive brugt af den gældende klasse - det kunne være en MSG der er blevet sendt til én af dens 'Childs' (Altså til en pointer der ligger i controls[] Array'en). Derfor skal HWND der ligger i MSG'en først sammenlignes med klassens egen hwnd, hvis sammenligningen mislykkedes, skal MSG'en sendes videre til alle komponenterne i controls[] array'en. I tilfælde af at sammenligningen lykkedes, bliver MSG'en behandlet som en normal Windows message. Eks. hvis MSG'en indeholder en WM_PAINT besked, skal den virtuelle funktion Repaint() kaldes.

Eks:

Fold kodeboks ind/udKode 


Repaint()
Denne funktion er en virtuel funktion og forventes at blive overskrevet af en top-klasse (Se evt. den senere defineret klasse: WINDOW). Derfor indeholder denne funktion ingen kode overhovedet!

Fidusen er nu at alle komponenter, så som knapper osv. arver denne klasse. Eks:

Fold kodeboks ind/udKode 


I Repaint() funktionen skal der selvfølig tegnes selve komponentens grafiske design. I dette tilfælde er det bare en normal vindue så denne komponent har nok ikke så meget brug for denne virtuelle funktion. Men hvis det var en knap eller noget andet, ville denne funktion jo være meget væsenligt!

Din WINDOW klasse skulle nu gerne havde arvet alle egenskaberne fra bund klassen CONTROL. Du kan selvfølgelig tilføje flere egenskaber som din WINDOW komponent skal kunne!

Lav nu en ny helt uafhængig klasse, der skal indeholde selve programmets main loop. Den kunne evt. blive kaldt for APPLICATION... DENNE KLASSE SKAL ALTSÅ IKKE ARVE ANDRE KLASSER! Klassen skal modtage alle beskeder, der bliver sendt fra Windows direkte. Samtidig skal den indeholde programmets hoved vindue, der evt. kunne blive kaldt for MainWindow:

Fold kodeboks ind/udKode 


Initialize(HINSTANCE)
Denne funktion skaber programmets hoved vindue ved hjælp af MainWindow.Create() funktion. Desuden skal Win32 funktionen RegisterClassEx() skrives her med den private wcex, som argument!

Run()
Her bliver selve programmets main loop sat igang!

Destructor
Her skal applikationen (programmet) afskrives ved hjælp af Win32 funktionen UnregisterClass() med wcex som argument.

Da Windows ikke kan sende beskeder direkte til en klasse kan vi i stedet gøre således.:

Fold kodeboks ind/udKode 


Læg mærke til at klassen APPLICATION kun må skabes én gang da den indeholder selve main-loopet!

Alle disse klasser og kode jeg har nævnt kan selvfølgeligt skrives i sin egen header for så at blive inkluderet i et projekt. I selve dit projekts main funktion kan der derfor stå noget lign.:

Fold kodeboks ind/udKode 


Og det er faktisk alt der skal til, hver gang du vil starte for Application'en og den's hoved vindue...

Hvis der er noget der står dig uklart eller hvis du gerne vil havde mere information så bare sig til!

Held og Lykke
Søren Klit Lambæk


[Redigeret d. 29/03-05 01:14:13 af Søren Klit Lambæk]



Hejsa,

jeg vil til at lære at programmere Win32 API i C++. Jeg har tænkt på at bruge et bibliotek, som f.eks. www.wxwidgets.org, men jeg vil hellere lære at programmere direkte i Win32 API'et.

Så til mit spørgsmål: Er det muligt at opbygge sine egne biblioteker, så jeg ikke skal skrive hele koden for f.eks. en knap hver gang? Altså så man f.eks. kunne inkludere en headerfil jeg selv har lavet, og skrive button("tekst","osv","osv");

Er der evt. en der har et eksempel på hvordan det kunne gøres?

For jeg vil gerne lære at programmere direkte i Win32 API'et, men omvendt synes jeg det er lidt irriterende at skulle skrive den samme kode flere gange.

Mvh. Anders


Ja det burde være muligt, men at kalde en knap er ikke specielt svært. Når du har lavet dit vindue, kan du kalde en knap med følgende:

CreateWindow("button","Play",WS_CHILD | WS_VISIBLE ,5,30,120,20,hwnd,(HMENU)(IDC_PLAY),0,NULL);

(en af mine egne knapper)

"button" = det skal være en knap
"play" = caption
de næste er dens properties (så vidt jeg ved)
og koordinaterne til hvor den skal være
hwnd er handlet til det vindue den skal tegnes i (være child til)
(HMENU)(IDC_PLAY) er dens id
de sidste 2 kan jeg ikk huske..

Men du kan hente en helpfil der inkluderer winapi'et, og så er det bare at søge efter window så får du alt du skal bruge. Eller brug msdn, det er vidst det samme bare online.

Mvh
Lasse

- Vi lever mens vi lærer, ikke omvendt -



Tak for svaret!

Det må jeg lige kigge på imorgen :-)

Jeg lader lige spørgsmålet stå åbent lidt endnu, inden jeg giver points..

Mvh. Anders



Hej Anders,

Jeg stod selv i samme situation for ca. en måned siden. Mit største problem var dog at jeg gerne ville lave mit helt eget grafiske interface design (i stedet for Windows standard udseende) på mine knapper, listbox, tekstbox osv. Jeg besluttede derfor at lave et vindue system ved hjælp af klasser der kan arves af hinanden. Der var en del arbejde ved at lave grund klassen, men derefter var det legende let at lave helt nye special designet "komponenter" tabcontrol, combobox, panel'er osv.

Det fedeste, er, at når jeg én gang har lavet eksempelvis en knap, behøver jeg aldrig mere at skrive koden for en knap (IKKE engang, hvis jeg vil ændre det grafiske udssende eller tilføje nye funktioner til knappen). Desuden kan alle mine knapper, lister, tekstbox osv. selvfølgeligt videre arves af nye klasser, hvis jeg ønsker det!

Jeg kan endda tilskrive forskellige simple (Ikke klasse afhængige) funktioner til komponenterne mens programmet køre, hvilket gøre det meget lettere at benytte komponentere i en større helhed og dermed er de meget anvendelige til genbrug af forskellige uafhængige projekter.

Hvis du gerne vil forsøge dig på noget lign. vil jeg selvføligeligt gerne hjælpe dig igang.

Mvh

Søren Klit lambæk

(Håber du forstår det meste af hvad jeg skrevet)



Hej Anders,

Jeg stod selv i samme situation for ca. en måned siden. Mit største problem var dog at jeg gerne ville lave mit helt eget grafiske interface design (i stedet for Windows standard udseende) på mine knapper, listbox, tekstbox osv. Jeg besluttede derfor at lave et vindue system ved hjælp af klasser der kan arves af hinanden. Der var en del arbejde ved at lave grund klassen, men derefter var det legende let at lave helt nye special designet "komponenter" tabcontrol, combobox, panel'er osv.

Det fedeste, er, at når jeg én gang har lavet eksempelvis en knap, behøver jeg aldrig mere at skrive koden for en knap (IKKE engang, hvis jeg vil ændre det grafiske udssende eller tilføje nye funktioner til knappen). Desuden kan alle mine knapper, lister, tekstbox osv. selvfølgeligt videre arves af nye klasser, hvis jeg ønsker det!

Jeg kan endda tilskrive forskellige simple (Ikke klasse afhængige) funktioner til komponenterne mens programmet køre, hvilket gøre det meget lettere at benytte komponentere i en større helhed og dermed er de meget anvendelige til genbrug af forskellige uafhængige projekter.

Hvis du gerne vil forsøge dig på noget lign. vil jeg selvføligeligt gerne hjælpe dig igang.

Mvh

Søren Klit lambæk

(Håber du forstår det meste af hvad jeg skrevet)


Søren, skrev du det udfra win api'et?

Det var noget jeg godt kunne interessere mig for at komme igang med, jeg har bare ingen ide om hvor jeg skal starte. Kan du give et par forslag, evnt ridse lidt op hvad jeg kan gøre.

Mvh
Lasse



Lige et par tanker herfra:
At lave sine egne class'er oven på Win-Api'et er nok interesant opgave men er også en ret omfattende opgave.

Før man kaster sig ud i det bør man have en rimelig forståelse for hvordan Api'et er opbygget og være rimelig fortrolig med C++.

At lave en class til at repræsentere en knap er rimelig let, men at få lavet en pæn måde for denne knap til at snakke med sine omgivelser er straks mere vanskeligt.

Et af de emner som man skal starte med når man designer sit class system er den måde hvorpå class'er sender beskeder til hinanden, og hvordan dette laves med Windows måde at udveksle beskeder.

Man skal også overveje hvor meget af windows kontoller man vil genbruge. Skal en knap være en knap set fra windows, eller skal det bare være et vindue.



jeg vil til at lære at programmere Win32 API i C++. Jeg har tænkt på at bruge et bibliotek, som f.eks. www.wxwidgets.org, men jeg vil hellere lære at programmere direkte i Win32 API'et.

Af ren nysgerrighed....hvorfor dog det ?
Hvorfor dog bruge et API, som kun virker på Windows istedet for at lære et API, som virker ca. alle steder ?



Hej Søren

Tak for den meget udførlige besvarelse!

Du har hjulpet mig meget. Det er nemlig også fordi jeg vil lave et andet layout end windows' standardprogrammer.

Jeg har kun lært de grundlæggende ting i C++ (med konsolprogrammering) indtil videre, så jeg er glad for at vide, at det kan lade sig gøre på den måde du beskriver, da det ellers vil tage alt for lang tid, og blive alt for uoverskueligt hvis jeg skulle copy/paste alle de samme funktioner som jeg har brugt i et andet program ind i et nyt program.

Jeg glæder mig godt nok til at komme igang med det, når jeg har lært at programmere i Win32 API'et :-)

Mvh. Anders




jeg vil til at lære at programmere Win32 API i C++. Jeg har tænkt på at bruge et bibliotek, som f.eks. www.wxwidgets.org, men jeg vil hellere lære at programmere direkte i Win32 API'et.

Af ren nysgerrighed....hvorfor dog det ?
Hvorfor dog bruge et API, som kun virker på Windows istedet for at lære et API, som virker ca. alle steder ?


Hvilket API er dette ?
- Vi lever mens vi lærer, ikke omvendt -



Jeg forstår det meste af det, i hvert fald hvordan det virker. Men forstår dog stadig ikke hvordan du kan definere egen stil på vinduet, det er da stadig et standard vindue du kalder er det ikke?

Mvh
Lasse



<< < 12 > >>
t