Fehler bei der quellenübergabe...
-
Hi...
Ich habe ein problem... vllt sogar viele probleme...
Bevor ich zum Problem komme, möchte ich grade mal nachfragen ob ich die WinAPI verstanden habe, oder nur denke, dass ich sie verstanden habe...
Ich habe die Main-funktion... Da wird alles angelegt fürs ChildProc
Dann das childproc etwa so...IrgendeineKlasse var; // Soll ne Instanz darstellen... Mir viel nicht besseres ein. Int a =1; Main() { \\ alle für ChildProc etc } LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int parameter1 = 10; int parameter1 = 20; switch… { case für buuton 1 { auslesen der parameterwerte; } case für Button 2 { parameter1 = 20; parameter2 = 1000; a = 5678; } } }wenn ich jetzt zuerst Button2 drücke werden die werte der Variablen parameter1 und 2 geändert...
Wenn ich danach Button1 drücke, sollten, so glaube ich, die werte 20 und 1000 noch drinne stehen, weil der case-teil ja noch zu ChildProc gehört...Die variable a kann ich in allen unterprogrammen abfragen ohne das der Wert immer wieder 1 wird.
Wenn ich einer jetzt var.i = 1000 mache, sollte meiner meinung nach in allen funktionen der wert gleich bleiben weil ich die instanz ja global angelegt habe.
Gehe ich da richtig in der Annahme, dass das Programm in etwa so läuft? (sonnst habe ich mehrere Proble mit denen ich mich noch einmal befassen sollte.)
Jetzt mein wirkliches Problem... Hängt unmittelbar damit zusammen...
Denn ich habe eben dieses Konstruckt...
LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { Objeckte für fomde; Char quelle[1000] = „013 Culcha_Candela a –tanz.mp3”; switch… { case für buuton 1 { system->genrateSound(„quelle“, etc) system->playSound( abspielzeug); } case für Button 2 { holt den text aus nem editfeld und schreibt ihn auf quelle. } } }Wenn ich jetzt den Button2 drücke holt der den text auch raus (das prüfe ich in dem ich ihn danach ausgebe). Klicke ich danach auf den ersten Button zum abspielen geht das jedoch nicht...
Wenn ich den Button1 aber direkt zu beginn drücke ohne quelle einmal zu überschreiben dann funktioniert es...
Weiß vielleicht jemand ob das daran liegt, dass ich das system der WinAPI nicht verstanden habe, oder liegt es an meiner denkweise.
Den code habe ich jetzt mal versucht zu 99 zu zerkleinern damits nichts so viel ist, und damit ich auch noch was zu tun habe

Wenn das bischen „code“ da oben zu wenig ist für eine sinnvolle antwort, oder um mein anliegen raus zu kriegen poste ich den richtigen code...
MFG Sqwan
-
Sqwan schrieb:
wenn ich jetzt zuerst Button2 drücke werden die werte der Variablen parameter1 und 2 geändert...
Wenn ich danach Button1 drücke, sollten, so glaube ich, die werte 20 und 1000 noch drinne stehen, weil der case-teil ja noch zu ChildProc gehört...Nein - die Fenster-Prozedur wird für jede ankommende Nachricht neu aufgerufen - und ihre internen Variablen parameter1 und parameter2 werden dabei jeweils neu mit 10 bzw. 20 initialisiert (außer du definierst sie als 'static').
Die variable a kann ich in allen unterprogrammen abfragen ohne das der Wert immer wieder 1 wird.
Wenn ich einer jetzt var.i = 1000 mache, sollte meiner meinung nach in allen funktionen der wert gleich bleiben weil ich die instanz ja global angelegt habe.
Soweit richtig - a und var sind globale Variablen und deshalb unabhängig von den einzelnen Funktionen.
Wenn ich jetzt den Button2 drücke holt der den text auch raus (das prüfe ich in dem ich ihn danach ausgebe). Klicke ich danach auf den ersten Button zum abspielen geht das jedoch nicht...
Das selbe Verständnisproblem - quelle ist lokal und wird bei jeder ankommenden Windows-Nachricht neu angelegt und initialisiert.
-
Zitat:
Wenn ich jetzt den Button2 drücke holt der den text auch raus (das prüfe ich in dem ich ihn danach ausgebe). Klicke ich danach auf den ersten Button zum abspielen geht das jedoch nicht...
Das selbe Verständnisproblem - quelle ist lokal und wird bei jeder ankommenden Windows-Nachricht neu angelegt und initialisiert.
Naja... Wie gesagt... Genau über dieses verständnis problem habe ich bereits nachgedacht.. Doch leider wird die quelle bei einer neuen windows-nachrricht nicht neu initalisiert... Dann funktioniert es einfach garnicht mehr...
Vielleicht weißt du ja wieso das nicht klappt.
Das neu gelernt ist weitestgehend eingebaut.
ChildProc 2 ist nur der wichtige Teil. Der rest zeigt nur wie ich die fenster etc erstellt habe falls das wichtig sein sollte.Hier mal der richtige quellcode:
#include <windows.h> #include <stdio.h> #include <iostream.h> #include <stdlib.h> #include <fstream.h> #include <conio.h> #include "winimage.h" #include "fmod.hpp" #include "fmod_errors.h" #pragma comment(lib,"fmodex_vc.lib") LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ChildProc2(HWND, UINT, WPARAM, LPARAM); const char szChildName[] = "Farbtabelle"; const char szChildName2[] = "Anders"; char buffer[100] = "13 tanz.mp3"; unsigned int version; bool playing = 0; unsigned int ms = 0; unsigned int lenms = 0; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; char szAppName[] = "Das Child Window"; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); //WHITE_BRUSH wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); //LTGRAY_BRUSH wc.hIcon = NULL; wc.lpfnWndProc = ChildProc; wc.lpszClassName = szChildName; RegisterClass(&wc); wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); //LTGRAY_BRUSH wc.hIcon = NULL; wc.lpfnWndProc = ChildProc2; wc.lpszClassName = szChildName2; RegisterClass(&wc); hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPEDWINDOW, 100, 100, 800, 600, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hChild1; static HWND hChild2; static RECT rect; switch (message) { case WM_SIZE: { rect.right=LOWORD(lParam); rect.bottom=HIWORD(lParam); MoveWindow(hChild1,5, 5,rect.right-10 , 100, TRUE); MoveWindow(hChild2,5, 110, rect.right-10, rect.bottom-115, TRUE); return 0; } case WM_CREATE: { GetClientRect(hWnd, &rect); hChild1 = CreateWindow( szChildName, NULL, WS_CHILD | WS_VISIBLE | WS_DLGFRAME, // Erzeugt Rahmen um Child -> 5, // Startpunkt von Links 5, // Startpunkt von oben (rect.right-10)/4, // Breite rect.bottom - 10, // Höhe hWnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL); hChild2 = CreateWindow( szChildName2, NULL, WS_CHILD | WS_VISIBLE | WS_DLGFRAME, // Erzeugt Rahmen um Child -> rect.right/4+5, // Startpunkt von Links 5, // Startpunkt von oben (rect.right) - (rect.right/4+5) - 5, // Breite rect.bottom - 10, // Höhe hWnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static RECT rect; switch (message) { case WM_PAINT: { GetClientRect(hWnd, &rect); HDC hDC; PAINTSTRUCT ps; const char szText[] = "MP3-Player version 1.0.1.3"; hDC = BeginPaint(hWnd, &ps); { DrawText(hDC, szText, lstrlen(szText), &rect, DT_SINGLELINE | DT_CENTER); } EndPaint(hWnd, &ps); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } LRESULT CALLBACK ChildProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static RECT rect; static HWND hEdit; static HWND hList; static HWND hButton_Play; static HWND hButton; //static C_Image img; //static C_ImageSet imgset; //static C_AnimationWindow anim, anim2, anim3; switch (message) { case WM_SIZE: { rect.left = 0; rect.top = 0; rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); //anim.Display (10,100); //anim2.Display (110,100); //anim3.Display (210,100); MoveWindow(hEdit,rect.right-220, rect.top+25, 200, 30, TRUE); MoveWindow(hList,0, 60, rect.right, rect.bottom-60, TRUE); MoveWindow(hButton,rect.right-320, rect.top+25, 100, 30, TRUE); MoveWindow(hButton_Play,5, rect.top+25, 100, 30, TRUE); return 0; } case WM_CREATE: { GetClientRect(hWnd, &rect); char *buffer = NULL; FILE *fp; char pclinebuffer[1000]; fp = fopen("Text.txt", "a+"); //img.LoadBMP ("logo.bmp"); //imgset.LoadGIF("sample.gif"); //anim.Create (hWnd,(HMENU)1,&imgset); //anim2.Create (hWnd,(HMENU)1,&imgset); //anim3.Create (hWnd,(HMENU)1,&imgset); hButton = CreateWindow("button", "Suchen", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hButton_Play = CreateWindow("button", "Play", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", buffer, WS_CHILD | WS_VISIBLE | ES_MULTILINE |ES_AUTOVSCROLL | WS_DLGFRAME, //sdgs /**/| WS_VSCROLL 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hList = CreateWindow ( TEXT("listbox"), TEXT(""), WS_CHILD | WS_VISIBLE | LBS_STANDARD | LBS_MULTIPLESEL , 0, 0, 0, 0, hWnd, (HMENU)8, (HINSTANCE) GetWindowLong (hWnd, GWL_HINSTANCE), NULL); while(fgets(pclinebuffer, sizeof(pclinebuffer), fp)) { int i = lstrlen(pclinebuffer)-1; pclinebuffer[i]=' '; SendMessage(hList, LB_ADDSTRING, 0, (LONG)(LPCSTR)pclinebuffer); } return 0; } case WM_COMMAND: { char pclinebuffer2[7]="Hallo"; if(lParam == (LPARAM)hButton_Play) { if(HIWORD(wParam)==BN_CLICKED) { FMOD::System *system; FMOD::Sound *sound1; FMOD::Channel *channel = 0; FMOD::Sound *currentsound = 0; FMOD_RESULT result; //unsigned int version; //bool playing = 0; //unsigned int ms = 0; //unsigned int lenms = 0; result = FMOD::System_Create(&system); result = system->getVersion(&version); result = system->init(32, FMOD_INIT_NORMAL, 0); result = system->createSound(buffer, FMOD_HARDWARE, 0, &sound1); result = system->playSound(FMOD_CHANNEL_FREE, sound1, false, &channel); } } if(lParam == (LPARAM)hButton) { if(HIWORD(wParam)==BN_CLICKED) { int iLength; iLength = GetWindowTextLength(hEdit); //buffer = (char*)malloc(iLength); GetWindowText(hEdit, buffer, iLength+1); //buffer = "02 Red Flag.mp3"; SendMessage(hList, LB_ADDSTRING, 0, (LONG)(LPCSTR)buffer); } } return 0; } case WM_PAINT: { GetClientRect(hWnd, &rect); HDC hDC; PAINTSTRUCT ps; const char szText[] = ""; unsigned int ms = 0; hDC = BeginPaint(hWnd, &ps); { DrawText(hDC, szText, lstrlen(szText), &rect, DT_SINGLELINE | DT_CENTER); //img.GDIPaint (hDC,10,150); } EndPaint(hWnd, &ps); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }