Ale stop...
Czyli wywołuje się WM_DESTROY okna potomnego. Zwalniam zasoby i przekazuję komunikat do okna nadrzędnego. Tam też mam komunikat WM_DESTROY : / Jak sam utworzyłem kontrolkę, zapisałem w niej strukturę zawierającą wszystkie bitmapy, wskaźniki itp. to chyba okienko nadrzędne nic nie powinno mieć do okna - dziecka tak? Jeżeli kontroluję to co zwalniam i nie zostawiam po sobie syfu to nic nie powinno złego się stać. A jeżeli mogłoby, to wytłumaczcie mi na chłopski rozum, dlaczego zamyka mi się program :(
W sumie to idiota ze mnie, bo źle wszystko opisałem:
okno główne (hwnd)
GetParent(hListaOdtwarzania) -> hwnd
I w tej liście odtwarzania tworzę kontrolki (przyciski symbolizujące utwór), które klawiszem delete mogę w każdej chwili usunąć z listy jak na odtwarzacz przystało. Uchwyty do wszystkich okien-utworów trzymam w std::vector<hwnd*>. Każdy utwór jest oknem-dzieckiem hListaOdtwarzania.
Procedura WM_DESTROY uchwytu hwnd:
case WM_DESTROY:{
BASS_Free();
DeleteObject(hBmpTlo);
DeleteObject(hPedzelekStatic1);
ReleaseDC(hwnd, hDCTlo);
PostQuitMessage (0);
break;
}
Procedura WM_DESTROY uchwytu hListaOdtwarzania:
case WM_DESTROY:{
for(int n=0; n<(int)hListaElementy.size(); n++)
DestroyWindow(*hListaElementy[n]);
break;
}
Procedura WM_DESTROY każdego uchwytu hUtwor przesiadującego w wektorze:
case WM_DESTROY:{
struct sListElement *wsk = (struct sListElement *)GetWindowLong(hwnd, 0);
ReleaseDC(hwnd, wsk->hDC);
DeleteObject(wsk->hBmp1);
DeleteObject(wsk->hBmp2);
DeleteObject(wsk->hBmp3);
DeleteObject(wsk->hBmp4);
DeleteObject(wsk->hBmp5);
delete wsk;
struct sListTrackInfo *wsk2 = (struct sListTrackInfo *)GetWindowLong(hwnd, 4);
delete wsk2->dlugosc;
delete wsk2->nazwa;
delete wsk2->sciezka;
delete wsk2;
return 0;
}
Tu wszystko wygląda poprawnie według mnie.
Co w ogóle daje oddanie komunikatu do kontrolki funkcją CallWindowProc? W kursach było napisane, że zawsze trzeba zwracać komunikat procedurze kontrolki nadrzędnej, a ja w procedurze hUtwor zwracam do procedury okna hwnd. Są 3 opcje procedury okna hUtwor i zachowanie programu:
- CallWindowProc(WindowProcedure, ...);
REAKCJA: Przy usuwaniu jakiegos elementu program znika po prostu jakbym kliknął na krzyżyk.
case WM_DESTROY:{
struct sListElement *wsk = (struct sListElement *)GetWindowLong(hwnd, 0);
ReleaseDC(hwnd, wsk->hDC);
DeleteObject(wsk->hBmp1);
DeleteObject(wsk->hBmp2);
DeleteObject(wsk->hBmp3);
DeleteObject(wsk->hBmp4);
DeleteObject(wsk->hBmp5);
delete wsk;
struct sListTrackInfo *wsk2 = (struct sListTrackInfo *)GetWindowLong(hwnd, 4);
delete wsk2->dlugosc;
delete wsk2->nazwa;
delete wsk2->sciezka;
delete wsk2;
break;
}
case WM_DROPFILES:{
fDrop_ReadFirst(wParam, &hwnd);
SetWindowText(hInfo, "");
break;
}
}
return CallWindowProc( WindowProcedure, hwnd, mesg, wParam, lParam );
- CallWindowProc(ListProc, ...);
REAKCJA: Przy usuwaniu jakiegos elementu program sie wiesza jak przy while(true){}
case WM_DESTROY:{
struct sListElement *wsk = (struct sListElement *)GetWindowLong(hwnd, 0);
ReleaseDC(hwnd, wsk->hDC);
DeleteObject(wsk->hBmp1);
DeleteObject(wsk->hBmp2);
DeleteObject(wsk->hBmp3);
DeleteObject(wsk->hBmp4);
DeleteObject(wsk->hBmp5);
delete wsk;
struct sListTrackInfo *wsk2 = (struct sListTrackInfo *)GetWindowLong(hwnd, 4);
delete wsk2->dlugosc;
delete wsk2->nazwa;
delete wsk2->sciezka;
delete wsk2;
break;
}
case WM_DROPFILES:{
fDrop_ReadFirst(wParam, &hwnd);
SetWindowText(hInfo, "");
break;
}
}
return CallWindowProc( ListProc, hwnd, mesg, wParam, lParam );
- Obojętnie czy jest WindowProcedure, czy ListProc, ale wewnątrz WM_DESTROY zamiast break; daję return 0;
REAKCJA: Wszystko działa
case WM_DESTROY:{
struct sListElement *wsk = (struct sListElement *)GetWindowLong(hwnd, 0);
ReleaseDC(hwnd, wsk->hDC);
DeleteObject(wsk->hBmp1);
DeleteObject(wsk->hBmp2);
DeleteObject(wsk->hBmp3);
DeleteObject(wsk->hBmp4);
DeleteObject(wsk->hBmp5);
delete wsk;
struct sListTrackInfo *wsk2 = (struct sListTrackInfo *)GetWindowLong(hwnd, 4);
delete wsk2->dlugosc;
delete wsk2->nazwa;
delete wsk2->sciezka;
delete wsk2;
return 0;
}
case WM_DROPFILES:{
fDrop_ReadFirst(wParam, &hwnd);
SetWindowText(hInfo, "");
break;
}
}
return CallWindowProc( ListProc, hwnd, mesg, wParam, lParam );
Jeżeli jestem skończonym cymbałem i kretynem i macie zamiar mnie zwyzywać to wiedzcie, że nie stać mnie na książki i uczę się WinAPI tylko z kursów z internetu, a teraz próbuję wszystko sobie utrwalić pisząc program zawierający wszystko po trochu.
W załączniku przesłałem cały program. Sam uważam, że jest to jeden wielki syf kodzisty i powinienem to poukładać, ale wszystko robiłem spontanicznie. Jeżeli się ktoś baaaardzo nudzi może uda się znaleźć błąd. Jak nie potraficie sie w tym syfie odnaleźć piszcie jaki fragment podać, to go wkleję.