Jump to content
  • Advertisement
Sign in to follow this  
MadsGustaf

problem in Win32 API in visual c++

This topic is 4124 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

For some reason my code does not work in VC++ :S it works fine in Dev-C++. but in VC++ it gives me these errors:
Quote:
Error 1 error C2440: '=' : cannot convert from 'const char [10]' to 'LPCWSTR' c:\Documents and Settings\mads\Dokumenter\Visual Studio 2005\Projects\hello worldww\hello worldww\s.cpp 39 Error 2 error C2664: 'MessageBox' : cannot convert parameter 2 from 'const char [37]' to 'LPCTSTR' c:\Documents and Settings\mads\Dokumenter\Visual Studio 2005\Projects\hello worldww\hello worldww\s.cpp 43 Error 3 error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [10]' to 'LPCWSTR' c:\Documents and Settings\mads\Dokumenter\Visual Studio 2005\Projects\hello worldww\hello worldww\s.cpp 58 Error 4 error C2664: 'MessageBox' : cannot convert parameter 2 from 'const char [27]' to 'LPCTSTR' c:\Documents and Settings\mads\Dokumenter\Visual Studio 2005\Projects\hello worldww\hello worldww\s.cpp 60

Share this post


Link to post
Share on other sites
Advertisement
Try turning off Unicode. Go to the Project menu, then Project Properties. Under Configuration Properties, select General, and make sure the box next to Character Set says Use Multi-Byte Character Set.

Share this post


Link to post
Share on other sites
Those are quite definitely wide-character to narrow-character errors. Either turn off Unicode (which is probably better to support), or put the correct macro around any string literal.

Share this post


Link to post
Share on other sites
Right click your project, go to "Project Properties"

Select "Configuation Properties->General" in the left tree plain

Insure "Character Set" is "Not Set" (ie, not UNICODE)

If you whish for wide strings, set it to "Multibyte character set" as programwizard said.

Share this post


Link to post
Share on other sites
thanks! that solved it. unfuntualy it gives me a "new" problem. in VC++ the compiler complains about this code:

LRESULT CALLBACK WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
//Denne procedure bliver kaldt hver gang der er en besked til vores vindue, eller dens vinduer, kig længere nede for forklaring
{
switch(Msg){
case WM_CLOSE: //Øver, vi er nødt til at lukke
DestroyWindow(hwnd); //Destruer vores vindue
break;
case WM_DESTROY: //Lad os poste den sidste besked
PostQuitMessage(0);
break;
default: // Ikke noget vi gider at rode med, send den videre til default message handleren
DefWindowProc(hwnd, Msg, wParam, lParam);
break;

}
}



and gives me this error:

Quote:

Error 1 error C4716: 'WndProc' : must return a value c:\documents and settings\mads\dokumenter\visual studio 2005\projects\hello worldww\hello worldww\s.cpp 20


the funny thing is, this error dosent show in Dev-C++, were it compiles and runs without a problem.

edit: shouldnt [ code] & [ /code] organize my code on the forum?

Share this post


Link to post
Share on other sites
Well, as the error says you need a return value. Do this:

LRESULT CALLBACK WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
//Denne procedure bliver kaldt hver gang der er en besked til vores vindue, eller dens vinduer, kig længere nede for forklaring
{
switch(Msg){
case WM_CLOSE: //Øver, vi er nødt til at lukke
DestroyWindow(hwnd); //Destruer vores vindue
return TRUE;
case WM_DESTROY: //Lad os poste den sidste besked
PostQuitMessage(0);
return TRUE;
default: // Ikke noget vi gider at rode med, send den videre til default message handleren
DefWindowProc(hwnd, Msg, wParam, lParam);
return FALSE;

}

return FALSE;
}

cheers,
xarg

Share this post


Link to post
Share on other sites
that gives me a ton of new errors. Heres the full code:

#include <windows.h>


const char KlasseNavn[] = "WIN32 API"; //Klasse navnet

LRESULT CALLBACK WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) //Denne procedure bliver kaldt hver gang der er en besked til vores vindue, eller dens vinduer, kig længere nede for forklaring
{
switch(Msg){
case WM_CLOSE: //Øver, vi er nødt til at lukke
DestroyWindow(hwnd); //Destruer vores vindue
break;
case WM_DESTROY: //Lad os poste den sidste besked
PostQuitMessage(0);
break;
default: // Ikke noget vi gider at rode med, send den videre til default message handleren
DefWindowProc(hwnd, Msg, wParam, lParam);
break;

}

}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG Msg; //En message variabel
WNDCLASSEX wc; //Vores vindue klasse
HWND hwnd; // Handleren til vinduet


wc.cbSize = sizeof(WNDCLASSEX); //Størrelsen på WNDCLASSEX i bytes
wc.style = 0; //Ingen ekstra styles
wc.lpfnWndProc = WndProc; //Vindue proceduren, den tager sig af alle beskeder
wc.cbClsExtra = 0; //Skal vi ikke bruge
wc.cbWndExtra = 0; //Skal vi ikke bruge
wc.hInstance = hInstance; //hIstance, kommer fra hInstance, variablen i WinMain.
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //Load et ikon
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //Load en cursor
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //Vælg farve til vinduet
wc.lpszMenuName = NULL; //Ingen menu
wc.lpszClassName = KlasseNavn; //Vores klassenavn
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Load et lille ikon

if(!RegisterClassEx(&wc)){ //Forsøger at registrere vores vindue klasse, ellers spytter vi en box i hovedet på brugeren, og stopper programmet
MessageBox(NULL, "Kunne ikke registrere vindue klassen", "Fejl", MB_OK | MB_ICONEXCLAMATION);
return 0; //Stopper programmet
}
//Så skal vi lave selve vinduet
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, //Laver en kant på vinduet
KlasseNavn, //Angiver vores klasse navn
"Hej verden, nu fra et vindue", //Titlen på vores vindue
WS_OVERLAPPEDWINDOW, //Angiver at det er et normalt vindue vi vil lave (dette er en sammentrækning af en masse styles)
CW_USEDEFAULT, //Vælg en standard x poisition til vinduet
CW_USEDEFAULT, //Vælg en standard y poisition til vinduet
300, //Bredden på vinduet
200, //Højden på vinduet
NULL, //Vi har ingen ejer af vinduet
NULL, //Ingen menu
hInstance, //Handleren til .exe filen
NULL); //Skal vi ikke bruge
if(hwnd == NULL){ //Vinduet kunne ikke oprettes, smid en fejl i hovedet på brugeren og luk ned
MessageBox(NULL, "Kunne ikke oprette vinduet", "Fejl", MB_OK | MB_ICONEXCLAMATION);
return 0; //Stopper programmet
}

//Hvis vi er nået så langt, har vi en vindue, og en vindue klasse, nu mangler vi bare at vise vores vindue, og sørge for at fange alle messages der bliver sendt til det.

ShowWindow(hwnd, nCmdShow); //Viser vores vindue, paramenteren nCmdShow, er måden det skal vises på, og vi viser det, ligesom det er blevet ønsket.
UpdateWindow(hwnd); //Opdaterer vores vindue

//Dette er lidt tricky, dette loop sørger for at vores vindue, modtager alle messages, der bliver sendt til den, d.v.s. at vi får atvide, når f.eks. at vores vindue bliver oprette. Når det resizes osv.
while(GetMessage(&Msg, hwnd, 0, 0) > 0){ //Der er en besked fortsæt
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}

return Msg.wParam; //Retunerer Msgs wParam
}

i dont know the macro to enclose my code in a codeblock, sorry.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!