Προς το περιεχόμενο

Παραθυρο μεσα απο C


dalton85

Προτεινόμενες αναρτήσεις

Δημοσ.

Το ακολουθο ειναι κωδικας απο βιβλιο που υποτιθεται δημιουργη ενα παραθυρο στα windows. Και λεω υποτιθεται γιατι ακομα δεν καταφερα να το τρεξω. Ο λογος ειναι οτι χτυπαει στο :

LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR IpszArgs, int nWinMode) Σε αυτες τις δυο εντολες.

 

#include<windows.h>

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

 

char szWinName[]="MyWin";

 

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR IpszArgs, int nWinMode)

{

HWND hwnd;

MSG msg;

WNDCLASSEX wcl;

 

wcl.cbSize=sizeof(WNDCLASSEX);

 

wcl.hInstance=hThisInst;

 

wcl.lpszClassName=szWinName;

 

wcl.lpfnWndProc=WindowFunc;

 

wcl.style=0;

 

 

20wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);

 

20wcl.hIconSm=LoadIcon(NULL,IDI_WINLOGO);

 

 

wcl.hCursor=LoadCursor(NULL, IDC_ARROW);

wcl.lpszMenuName=NULL;

 

wcl.cbClsExtra=0;

wcl.cbWndExtra=0;

 

wcl.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

 

if(!RegisterClassEx(&wcl))return 0;

 

 

hwnd=CreateWindow(

szWinName,

"Diablo Clock Ticker",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

HWND_DESKTOP,

NULL,

hThisInst,

NULL

);

 

ShowWindow(hwnd,nWinMode);

UpdateWindow(hwnd);

 

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

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

 

 

 

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

{

switch(message)

{

case WM_DESTROY:

PortQuitMessage(0);

break;

default:

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

}

return 0;

}

Δημοσ.

η συνταξη σου ειναι σωστη (αν εξαιρεσω το PortQuitMessage που ειναι PoStQuitMessage)

 

που σου σκαει? με ποιο compiler παιζεις? Αν εισαι με Visual Studio, σιγουρεψου οτι χρησιμοποιεις multi-byte character set και οχι unicode

Δημοσ.

Χρησιμοποιο τo Turbo C 2.01. Μου λεει :

Declaration syntax error στης γραμμες:

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

 

και:

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR IpszArgs, int nWinMode)

 

το windows.h το βρηκα απο εναν αλλον compiler στο internet ιδιον.

Σε αλλον compiler που εχω τον Dev C++V.4.9.9.2 της Bloodshed μου βγαζει

invalid suffix "wcl.hIcon" on integer constant

invalid suffix "wcl.hIconSm" on integer constant

για τις γραμμες:

20wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);

20wcl.hIconSm=LoadIcon(NULL,IDI_WINLOGO);

αντιστοιχα

Δημοσ.

Ο κώδικας δεν έχει πρόβλημα, σε παλαιότερους compiler απλά θα έπρεπε να κάνεις cast το wcl.lpfnWndProc ως (WNDPROC) δηλαδή wcl.lpfnWndProc=(WNDPROC)WindowFunc;

 

Όμως στην περίπτωση σου το ζήτημα ξεκινά από τους compiler που χρησιμοποιείς, για την Borland Turbo C 2.01 δεν το συζητώ καν (πάω στοίχημα πως είναι DOS compiler) ενώ η DEV-C από ότι είδα υποστηρίζει ανάπτυξη Windows εφαρμογών οπότε ή υπάρχει κάποιο συντακτικό λάθος (τα "20wc"?) ή παίζει κάποια ρύθμιση.

 

Τώρα όσον αφορά τον κώδικα, γίνεται μια χαρά compile αφού διορθώσεις όμως την PortQuitMessage σε PostQuitMessage (όπως παρατηρεί ο georgemarios) και αφαιρέσεις το "20" από τα "20wcl.hIcon" & "20wcl.hIconSm" (γιατί έβαλες το 20 μπροστά τους; ) .

 

Αναρτώ τον κώδικα, διορθωμένο και σε πιο ευανάγνωστη μορφή (έγινε compile με την free CodeGear Turbo-C++ Explorer -http://www.turboexplorer.com/cpp).

 

>
#include<windows.h>

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

char szWinName[]="MyWin";

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR IpszArgs, int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wcl;

wcl.cbSize=sizeof(WNDCLASSEX);
wcl.hInstance=hThisInst;
wcl.lpszClassName=szWinName;
wcl.lpfnWndProc=WindowFunc;
wcl.style=0;
wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wcl.hIconSm=LoadIcon(NULL,IDI_WINLOGO);
wcl.hCursor=LoadCursor(NULL, IDC_ARROW);
wcl.lpszMenuName=NULL;
wcl.cbClsExtra=0;
wcl.cbWndExtra=0;
wcl.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

if(!RegisterClassEx(&wcl))
 return 0;

hwnd=CreateWindow(szWinName,
									"Diablo Clock Ticker",
									WS_OVERLAPPEDWINDOW,
									CW_USEDEFAULT,
									CW_USEDEFAULT,
									CW_USEDEFAULT,
									CW_USEDEFAULT,
									HWND_DESKTOP,
									NULL,
									hThisInst,
									NULL);

ShowWindow(hwnd,nWinMode);
UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))
	{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
	}

return msg.wParam;
}



LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
 {
		case WM_DESTROY:
			PostQuitMessage(0);
		break;
		default:
		 return DefWindowProc(hwnd, message,wParam, lParam);
	}

return 0;
}

 

Καλή συνέχεια.

Δημοσ.

Ευχαριστω για τις απαντισεις σας. Θα κατεβασω την εκδοση του Directx και απο εκει θα προσπαθησω να βγαλω καποια ακρη

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...