wohin mit den Funktionen ??
-
Ich hab hier jetzt ein Buch wo mir zwar das wichtigste zu den Fenstern/buttons erklärt wird, aber es steht nix weiters dazu...
1. wohin kommen nun zb- meine Funktionen ???
lege ich sie ans ende des codes (wie bein console-prog.)
macht der Compiler folgende meldung:[Warning] unreachable code at beginning of switch statement
(ich nutze Dev-C++)
2. ich hab den Funktionsaufruf in der SWITCH(uiMessage) drin
NEWBI IN ACTION
-
ähm könntest du evtl. mal ein Beispiel von deinem Code senden? Das is im moment etwas kompliziert nachzuvollziehen
-
so ich hoffmal du kannst mir helfen!
ich brauch halt nur nen Tip, wo jetzt das eigenntliche Programm genau anfängt... (wo MEIN code reinkommt)// einfaches Programm #include <windows.h> LRESULT CALLBACK WindowsKommunikation (HWND, UINT, WPARAM, LPARAM); char FensterKLASSENname[ ] = "WindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance,////////////////////////////// BEGINN DER MIN_MAIN ///////////////////////////// HINSTANCE hPrevInstance, LPSTR lpszArgument, int meinFENSTERdar) { HWND meinFENSTER; MSG messages; WNDCLASSEX meinFENSTEReig; meinFENSTEReig.hInstance = hThisInstance; meinFENSTEReig.lpszClassName =FensterKLASSENname; meinFENSTEReig.lpfnWndProc = WindowsKommunikation; meinFENSTEReig.style = CS_DBLCLKS; meinFENSTEReig.cbSize = sizeof (WNDCLASSEX); meinFENSTEReig.hIcon = LoadIcon (NULL, IDI_APPLICATION); meinFENSTEReig.hIconSm = LoadIcon (NULL, IDI_APPLICATION); meinFENSTEReig.hCursor = LoadCursor (NULL, IDC_ARROW); meinFENSTEReig.lpszMenuName = NULL; meinFENSTEReig.cbClsExtra = 0; meinFENSTEReig.cbWndExtra = 0; meinFENSTEReig.hbrBackground = CreateSolidBrush(RGB(0,0,200)); if (!RegisterClassEx (&meinFENSTEReig)) return 0; meinFENSTER = CreateWindowEx ( 0, FensterKLASSENname, "<< der nette Herr KRUPP >>", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1000, 500, HWND_DESKTOP, NULL, hThisInstance, NULL ); ShowWindow (meinFENSTER, meinFENSTERdar); UpdateWindow (meinFENSTER); while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; } LRESULT CALLBACK WindowsKommunikation (HWND meinFENSTER, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { void zeichne(); // HIER SOLLTE EINE FUNKTION AUFGERUFEN WERDEN DIE MIR zb. WAS MALT... zeichne(); case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (meinFENSTER, message, wParam, lParam); } return 0; } ////////////////////////////////// funktion /////////////////////////// void zeichne() { case WM_PAINT: HPEN Stift; HBRUSH Pinsel; Stift = CreatePen(PS_SOLID,2,RGB(0,0,0)); Pinsel = CreateSolidBrush (RGB(0,0,0)); HDC HandleDC; PAINTSTRUCT myPS; HandleDC=BeginPaint (meinFENSTER, &myPS); MoveToEx (HandleDC,20,20,NULL); LineTo (HandleDC,100,100); EndPaint (meinFENSTER, &myPS); return 0; }
-
Wenn du ein Newbie bist, warum fängst du dann bitteschön sofort mit Windows-Programmierung an?
-
entweder du gibts mir nen Tip, oder du läßt es bleiben!
ich hab schon mit console ein bissel rumexperimentiert, und jetzt halt Windows... ()
WARUM IST DIE BANANE KRUMM ?
-
Dein Codebeispiel zeigt ganz genau, das Du die Arbeitsweise von Windows nicht im entferntesten verstanden hast!
Ebenso mangelt es noch an C-Verständnis....
Wo z. B. ist die switch()-Abfrage für den case WM_PAINT in deiner Funktion zeichne()?
Windows-Programme REAGIEREN auf Nachrichten (MESSAGES), die VON Windows AN dein Programm geschickt werden! Unter anderem gibt es die Message WM_PAINT, die Deinem Programm sagt: Hey, zeichne Deinen Arbeitsbereich/Fenster neu!
Diese Nachricht wird an die Window-Prozedur, bei Dir treffenderweise "WindowsKommunikation" gennannt, gesendet....
Dort benutzt Du eine switch()-Abfrage, um herauszufinden, WELCHE Nachricht Windows an Dein Programm gesendet hat....
z. B. wird beim Starten Deines Programmes eine WM_CREATE gesendet...
Wenn Du einen Button in Deinem Programm drückst, dann SENDET WINDOWS eine Nachricht an Dein Programm: Hey, der Button xxx wurde grad gedrückt...
Also, folgendes solltest Du zuerst tun:
1.) C/C++ beherrschen lernen
2.) Funktionsweise von Windows kennenlernen
3.) Windows-Programmierung erlernenzu Punkt 3 gibt es Dieses Buch hier... Es ist das Beste Buch, was es zu dem Thema gibt...
-
@ HEPI :
soweit wie du´s erklärst hab ich das schon verstanden... das listing oben war auch nur ein bsp. dafür wies nich geht. mann(!) es kann doch nicht so schwer sein mir zu sagen wo ich zb. die funktionen reinbringe ???
hier nochmal nen funktionierenden Code:
(ich möchte gerne das zeichnen der linie in eine Funktion auslagern,
um diese dann zb. mehrmals aufzurufen....// einfaches Programm #include <windows.h> LRESULT CALLBACK WindowsKommunikation (HWND, UINT, WPARAM, LPARAM); char FensterKLASSENname[ ] = "WindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance,////////////////////////////// BEGINN DER MIN_MAIN ///////////////////////////// HINSTANCE hPrevInstance, LPSTR lpszArgument, int meinFENSTERdar) { HWND meinFENSTER; MSG messages; WNDCLASSEX meinFENSTEReig; meinFENSTEReig.hInstance = hThisInstance; meinFENSTEReig.lpszClassName =FensterKLASSENname; meinFENSTEReig.lpfnWndProc = WindowsKommunikation; meinFENSTEReig.style = CS_DBLCLKS; meinFENSTEReig.cbSize = sizeof (WNDCLASSEX); meinFENSTEReig.hIcon = LoadIcon (NULL, IDI_APPLICATION); meinFENSTEReig.hIconSm = LoadIcon (NULL, IDI_APPLICATION); meinFENSTEReig.hCursor = LoadCursor (NULL, IDC_ARROW); meinFENSTEReig.lpszMenuName = NULL; meinFENSTEReig.cbClsExtra = 0; meinFENSTEReig.cbWndExtra = 0; meinFENSTEReig.hbrBackground = CreateSolidBrush(RGB(0,0,200)); if (!RegisterClassEx (&meinFENSTEReig)) return 0; meinFENSTER = CreateWindowEx ( 0, FensterKLASSENname, "<< der nette Herr KRUPP >>", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1000, 500, HWND_DESKTOP, NULL, hThisInstance, NULL ); ShowWindow (meinFENSTER, meinFENSTERdar); UpdateWindow (meinFENSTER); while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; } LRESULT CALLBACK WindowsKommunikation (HWND meinFENSTER, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: /// wie kann ich das ZEICHNEN DURCH EINE FUNKTION AUFRUFEN LASSEN ??? HPEN Stift; HBRUSH Pinsel; Stift = CreatePen(PS_SOLID,2,RGB(0,0,0)); Pinsel = CreateSolidBrush (RGB(0,0,0)); HDC HandleDC; PAINTSTRUCT myPS; HandleDC=BeginPaint (meinFENSTER, &myPS); MoveToEx (HandleDC,20,20,NULL); LineTo (HandleDC,100,100); EndPaint (meinFENSTER, &myPS); return 0; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (meinFENSTER, message, wParam, lParam); } return 0; }
so ich hoffe dieses Problem ist nicht zu einfach
für euch,
und jemand lässt sich dazu herab mir ne einfache und vernüftige Antwort zu geben. Gruß + THX CAYAMIDES
-
Ob Dir nun fertiger Code zum besseren Verständnis verhilft, weiß ich nicht...
// einfaches Programm #include <windows.h> // Funktionsprototypen LRESULT CALLBACK WindowsKommunikation (HWND, UINT, WPARAM, LPARAM); void Zeichne(HWND meinFENSTER); //GlobaleVariablen char FensterKLASSENname[ ] = "WindowsApp"; ////////////////////////////// BEGINN DER WIN_MAIN ///////////////////////////// int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int meinFENSTERdar) { HWND meinFENSTER; MSG messages; WNDCLASSEX meinFENSTEReig; meinFENSTEReig.hInstance = hThisInstance; meinFENSTEReig.lpszClassName =FensterKLASSENname; meinFENSTEReig.lpfnWndProc = WindowsKommunikation; meinFENSTEReig.style = CS_DBLCLKS; meinFENSTEReig.cbSize = sizeof (WNDCLASSEX); meinFENSTEReig.hIcon = LoadIcon (NULL, IDI_APPLICATION); meinFENSTEReig.hIconSm = LoadIcon (NULL, IDI_APPLICATION); meinFENSTEReig.hCursor = LoadCursor (NULL, IDC_ARROW); meinFENSTEReig.lpszMenuName = NULL; meinFENSTEReig.cbClsExtra = 0; meinFENSTEReig.cbWndExtra = 0; meinFENSTEReig.hbrBackground = CreateSolidBrush(RGB(0,0,200)); if (!RegisterClassEx (&meinFENSTEReig)) return 0; meinFENSTER = CreateWindowEx ( 0, FensterKLASSENname, "<< der nette Herr KRUPP >>", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1000, 500, HWND_DESKTOP, NULL, hThisInstance, NULL ); ShowWindow (meinFENSTER, meinFENSTERdar); UpdateWindow (meinFENSTER); while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; } LRESULT CALLBACK WindowsKommunikation (HWND meinFENSTER, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: Zeichne(meinFENSTER); return 0; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (meinFENSTER, message, wParam, lParam); } return 0; } void Zeichne(HWND meinFENSTER) { // Jedesmal, wenn Windows WM_PAINT sendet... HDC HandleDC; PAINTSTRUCT myPS; HPEN Stift; HBRUSH Pinsel; Stift = CreatePen(PS_SOLID,2,RGB(0,0,0)); Pinsel = CreateSolidBrush (RGB(0,0,0)); HandleDC=BeginPaint (meinFENSTER, &myPS); MoveToEx (HandleDC,20,20,NULL); LineTo (HandleDC,100,100); EndPaint (meinFENSTER, &myPS); }
-
THX @ Hepi
da hab ich die funktion falsch gebaut....
ich hab halt noch nich so die routine. jetzt kann ich wieder ein bissel rumexperimentieren.
Und das Buch von petzold ist dann auch nächste Woche fällig (is dann mein 4tes.)gruß cayamides
-
-cayamides- schrieb:
(is dann mein 4tes.)
Zur Windows-Programmierung reicht eins (Petzold).
-
btw. wie hießen die 3 Bücher ???
-
MoiN!
_________________________________________________________
1. HENING HANSEN ,, Windowsprogrammierung mit C++
(ist nicht sehr umfangreich + fehler im listing)2. DIRK LOUIS ,, C/C++ Kompendium
( ist richtig fett)3. eines über DIRECT-X programmierung in C++
_________________________________________________________
-
...und damit willst Du C/C++-Programmierung lernen?
Ich habe auch Louis' Kompendium, aber eins sag ich Dir: Damit C/C++-lernen würde ich nicht mal meiner Schwiegermutter vorschlagen!
An DirectX sollte man sich wagen, wenn man die Windows-Programmierung einigermaßen beherrscht und weiß, was man tut...
Ich habe C gelernt mit Prinz: C für PCs, 2. Auflage, das gibt es mittlerweile bei z. b. terrashop.org für knapp 3 Euro...