Gå til innhold

Hvordan lage windows vindu [C++]


Anbefalte innlegg

Har lagt inn Visual C++ 2005 Express og tenkte å friske opp litt før skolen starter igjen. Kan stort sett svømme når det gjelder C++ generelt. Lage klasser, printe i console osv osv. Men dette GUI surret sliter jeg maks med :ermm: Noen som kan fortelle meg hva jeg trenger for å poppe opp et helt basic hello world vindu, muligens med en liten søt knapp på?

 

yes, yes, I know, File -> New -> Project... -> Windows Forms Application -> Dra label og knapp inn på form. Men da kommer det for det første en hel masse drøss med rart jeg ikke fatter bæret av. Og for det andre såe... liker jeg å vite hvordan å gjøre det programmerisk.. dersom det skulle være et ord :blush:

 

Så.. Hvis jeg nå går i Visual C++ 2005 Express, oppretter et nytt helt tomt prosjekt. Hva trenger jeg for å lage et enkelt lite vindu med en "Hello World" label, og kanske en knapp som gjør et eller annet spenstig?

 

 

EDIT: burde kanskje vært posta i C++ delen.. litt frustrerende å ikke kunne flytte egne tråder egentlig. eller kan man det?

Endret av Tussi_qwerty
Lenke til kommentar
Videoannonse
Annonse

Vel de pleier vanligvis å følge med vc installasjonen (tror det var velgbart). Det burde være en mappe som heter platformSDK under vc direktivet.

 

det er jo bare å søke.

 

EDIT: det gjør ingenting å installer platformSDK, de pleier å ha med seg nyere ting og tang som XP SP2 forandringer.

Endret av Giddion
Lenke til kommentar

Wuhu!! Det funker. Puttet

#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPSTR lpCmdLine,
      int nCmdShow)
{
MessageBox(NULL, "Hello World!", "MsgBox", 0);
return 0;
}

I en .cpp fil, kompilerte, og det spratt opp et vindu. :w00t:

 

Men en ting får jeg ikke til. og det er å få disse standard Win32 templatene og disse her i den new project velge saken. Erfaring med det noen? Stod man skulle kommentere ut 4 linjer i en fil, og 1 linje i en annen. Det er nå gjort, men ingen forskjell :hrm:

Lenke til kommentar

skulle visst ikke vært så optimistisk så fort... kan noen forklare meg hvorfor jeg med denne koden her:

#include <windows.h>

WNDCLASSEX WndClsEx;
// Populate the WNDCLASSEX structure
WndClsEx.cbSize        = sizeof(WNDCLASSEX);
WndClsEx.style         = CS_HREDRAW | CS_VREDRAW;
WndClsEx.lpfnWndProc   = WndProcedure;
WndClsEx.cbClsExtra    = 0;
WndClsEx.cbWndExtra    = 0;
WndClsEx.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
WndClsEx.hCursor       = LoadCursor(NULL, IDC_ARROW);
WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClsEx.lpszMenuName  = NULL;
WndClsEx.lpszClassName = "GlowdotWin32TutorialPartI";
WndClsEx.hInstance     = hInstance;
WndClsEx.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
// Register the class
RegisterClassEx(&WndClsEx);

 

får alle disse feilene her når jeg prøver å kompilere?

Skjult tekst: (Marker innholdet i feltet for å se teksten):

.\Program.cpp(5) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(5) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(6) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(6) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(6) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(7) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(7) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(7) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(8) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(8) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(9) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(9) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(9) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(10) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(10) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(10) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(11) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(11) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(12) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(12) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(12) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(13) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(13) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(13) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(14) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(14) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(14) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(15) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(15) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(16) : error C2143: syntax error : missing ';' before '.'

.\Program.cpp(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(16) : error C2371: 'WndClsEx' : redefinition; different basic types

        .\Program.cpp(3) : see declaration of 'WndClsEx'

.\Program.cpp(18) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

.\Program.cpp(18) : error C2365: 'RegisterClassExA' : redefinition; previous definition was 'function'

        C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\winuser.h(3653) : see declaration of 'RegisterClassExA'

.\Program.cpp(18) : error C2440: 'initializing' : cannot convert from 'WNDCLASSEX *' to 'int'

        There is no context in which this conversion is possible

 

Når jeg holder musa over WndClsEx i koden der hvor jeg prøver å sette struct elementene, så sier den at den er en int? trodde det var en struct jeg :( hvordan får jeg den til å bli den structen? prøvde å ha den typedef saken for WNDCLASSEX med, men da fikk jeg beskjed om at den allerede var deklarert, og det er jo logisk nok...

Endret av Tussi_qwerty
Lenke til kommentar

som vil si?

 

kunne du[noen] tenkt deg å lage en ekstreeemt enkel sak som bare sprutter opp et tomt vindu? finner ingen rene enkle eksempler :(

 

har en pdf på disken som heter Programming Game AI By Example. og er nå igjennom store deler av første kapittellet, der den startet med å introdusere disse tingene veldig bra. og det er en smule frustrerende for jeg skjønner mer eller mindre de forskjellige tingene og sakene man må gjøre for å få opp et vindu, bare ikke hvor jeg skal ha de for å få de til å funke sammen :ermm::blush: i boka er koden nemlig splittet opp, som den jo forsåvidt bør være. men den er ikke samlet noe sted, annet enn på cden som.. "følger med".. den har på en måte ikke jeg.. :hmm::whistle: hehe.

Lenke til kommentar

Her er en kode som vil åpne et vindu som du kan gjøre alle standard tingene med som resize lukke legge ned(tror jeg). Jeg tror ikke du kan få det stort enklere.

PS: husk å kompiler med <Use Multi-Byte Character Set>

 

Skjult tekst: (Marker innholdet i feltet for å se teksten):

#include <windows.h>
const char sKlassName[] = "VinduKlasse";

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)	// her kommer alle meldinger fra windows og programmer inn
{
   switch(msg)  //meldings ID
   {
       case WM_CLOSE:  // På tide på slutte
           DestroyWindow(hwnd);
       break;
       case WM_DESTROY:	//et vindu er blitt ødelagt (burde komme etter DestroyWindow(hwnd))
           PostQuitMessage(0);	//programmet avslutter
       break;
   }
return DefWindowProc(hwnd, msg, wParam, lParam); // windows behandler også meldingene på sin vanlige måte.
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   WNDCLASSEX wc;
   HWND hwnd;
   MSG Msg;

   //registrering av vindu klassen
   wc.cbSize        = sizeof(WNDCLASSEX);
   wc.style         = 0;
   wc.lpfnWndProc   = WndProc;
   wc.cbClsExtra    = 0;
   wc.cbWndExtra    = 0;
   wc.hInstance     = hInstance;
   wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
   wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
   wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName  = NULL;
   wc.lpszClassName = sKlassName;
   wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

   if(!RegisterClassEx(&wc))
   {
       MessageBox(NULL, "klasse registreringen gikk ikke bra :(","Feil",MB_ICONEXCLAMATION | MB_OK);
       return 0;
   }

   // Lage vinduet
   hwnd = CreateWindowEx(
       WS_EX_CLIENTEDGE,
       sKlassName,
       "Zuper vindu",
       WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
       NULL, NULL, hInstance, NULL);

   if(hwnd == NULL)
   {
       MessageBox(NULL, "Vindu laginga gikk ikke bra :(", "Feil", MB_ICONEXCLAMATION | MB_OK);
       return 0;
   }

   ShowWindow(hwnd, nCmdShow);  //viser vinduet som er blitt laga (det er skult som standard)
   UpdateWindow(hwnd);

   // meldings loopen, den er ferdig når programmet blir avsluttet
   while(GetMessage(&Msg, NULL, 0, 0) > 0)//GetMessage venter til det kommer noen meldinger (dvs bevege musa trykke en tast ++ mange andre)
   {
       TranslateMessage(&Msg);	//oversetter tastetrykk og sånt no
       DispatchMessage(&Msg);	//sender meldingen til WndProc (ikke direkte)
   }
   return Msg.wParam; // på tide å slutte 
}

 

EDIT: skjul koden

EDIT2: lett feil i koden

Endret av Giddion
Lenke til kommentar

ahhh, den kompilerte og spratt opp. du er min helt, hehe. Skal prøve å ikke plage deg mer på en stund :p skal gå den grundigere i sømmene etter hvert, når jeg bare har tid :)

 

men bare en ting: "kompiler med <Use Multi-Byte Character Set>"? hva i alle dager vil det si :blush:

Endret av Tussi_qwerty
Lenke til kommentar

Legge til at det kan være greit (okei, helt essensielt IMHO) å bruke et annet bibliotek/API fremfor å jobbe direkte mot Win32-APIet.

 

Søk på "GUI" i C/C++-forumet så får du opp en drøss forslag du kan se igjennom. Man får en rekke fordeler i tillegg til at det blir mye lettere å jobbe med. Eksempler er portabilitet til, eller mulighet til å kjøre programmet på både Mac, Linux og Windows.

Lenke til kommentar

joda, det er jeg fullt klar over Inostdal. Bare er det at jeg som 3 års-student på dataingeniørstudiet føler jeg i hvert fall burde vite hvordan å putte opp et basic vindu i C++ :p

 

dessuten så leser jeg en bok om no algoritme greier og slikt, der dem bruker basic win32 apiet for å kunne fokusere på algoritmene. eller no sånt... uansett, jeg vil få til :p men får vel se litt på disse GUI tingene også etterhvert.

 

Og til Giddeon: haha, nå skjønner jeg hvorfor jeg ikke har fått til noe.

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

}

Fikk ikke med meg at en måtte ha med det der. Raste forbi og tenkte det var en vanlig funksjon av no slag :blush: Så bare for å være helt sikker: det der er altså windowsgui sin versjon av int main() { } ?

Lenke til kommentar
Fikk ikke med meg at en måtte ha med det der. Raste forbi og tenkte det var en vanlig funksjon av no slag :blush: Så bare for å være helt sikker: det der er altså windowsgui sin versjon av int main() { } ?

6655614[/snapback]

 

Jepp det stemmer ved bruk av winmain så bruker man windows subsystem og det blir da start funksjonen, men det er ikke noe problem å bruke main()" heller, men da brukes console subsystem som forsåvidt går greit det også, men da kan det sprette opp et console vindu som ofte er uønsket i windows. Det virker som om winmain også lager en vanlig main funsjon som er den vanlige start kommandoen for dos. Den printer bare ut "kan ikke kjøre i windows".

 

Lykke til videre

Lenke til kommentar

mmm, nei.

"This program cannot be run in DOS mode" er faktisk et eget program, som du ikke kan endre selv, det er et DOS program som følger med alle Windows programmer, for hvis det ikke var noe DOS del i et dos program, og du kjørte det i DOS, er det veldig sannsynlig at maskinen fryser.

 

DOS og windows nt er to forskjellige ting.

I headeren står BaseOfCode som er entrypoint til programmet, og den peker til Main eller WinMain.

 

Men hvis det er WinMain, så blir en annen Windows funksjon kalt, for å gi programmet all data den trenger.

 

om du bruker Main eller WinMain spiller forsåvidt ingen rolle for om det kommer opp et console vindu eller ikke, dette er det

Subsystem verdien som forteller som kan være:

IMAGE_SUBSYSTEM_UNKNOW Ukjent, vet ikke hva denne egentlig er til

IMAGE_SUBSYSTEM_NATIVE Programmet har ikke noe subsystem

IMAGE_SUBSYSTEM_WINDOWS_GUI Som er Windows GUI

IMAGE_SUBSYSTEM_WINDOWS_CUI Som er windows Console

IMAGE_SUBSYSTEM_OS2_CUI OS/2 console

IMAGE_SUBSYSTEM_POSIX_CUI Posix console

IMAGE_SUBSYSTEM_NATIVE_WINDOWS Windows 9x

IMAGE_SUBSYSTEM_WINDOWS_CE_GUI WIndows CE

IMAGE_SUBSYSTEM_EFI_APPLICATION

IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER

IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER

IMAGE_SUBSYSTEM_EFI_ROM

IMAGE_SUBSYSTEM_XBOX

 

Det er regler for hva startup funksjonen skal hete, du kan ikke bruke WinMain uten å inkludere Windows.h f.eks.

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å
×
×
  • Opprett ny...