Usuwanie dynamicznie utworzonych obiektów
Stronę tą wyświetlono już: 2384 razy
Wstęp
Skoro zrealizowane zostało dodawanie obiektów oraz ich zaznaczanie najwyższa pora nadeszła aby zacząć coś robić z tymi zaznaczonymi obiektami. Pierwszą taką operacją będzie usuwanie obiektów. Realizację tego zadania przekażemy w "ręce" klasy select_obj, gdyż ta przechowuje wewnątrz pewne informacje, które powinny zostać odpowiednio ustawione w przypadku usuwania obiektów. Oczywiście usuwanie obiektów powinno zostać podpięte pod przycisk delete klawiatury, a co za tym idzie do projektu konieczne będzie dodanie akceleratorów.
Dodawanie akceleratorów do zasobów programu
Na razie dodany zostanie tylko jeden akcelerator tak jak na poniższym rysunku zostało to pokazane.

Akcelerator należy oczywiście podpiąć do projektu w sposób już wcześniej omawiany na stronie Programowanie → C++ WinApi → Dodawanie menu, akceleratora, ikony i kursora do programu, toteż ja skupię się jedynie na obsłudze komunikatu przychodzącego od akceleratora do okna rysowanie:
- case WM_COMMAND:
- {
- if((HWND)lParam == toolbar){
- UINT n = LOWORD(wParam);
- if(n != ID_SELECT && st == state::sel){
- SelObjAct.Clear();
- InvalidateRect(hWndDraw, NULL, true);
- }
- switch(n){
- case ID_LINE: // komunikat przychodzący od przycisku toolbar-a o identyfikatorze ID_LINE
- {
- st = dr_line;
- SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie linii"); // ustawienie tekstu w ostatnim polu statusbar-u
- }
- break;
- case ID_CIRCLE: // to samo co poprzednio, tylko dla ID_CIRCLE
- {
- st = dr_circle;
- SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie okręgu"); // ustawienie tekstu w ostatnim polu statusbar-u
- }
- break;
- case ID_RECTANGLE: // to samo co poprzednio, tylko dla ID_RECTANGLE
- {
- st = dr_rect;
- SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie prostokąta"); // ustawienie tekstu w ostatnim polu statusbar-u
- }
- break;
- case ID_SELECT: // to samo co poprzednio, tylko dla ID_SELECT
- {
- st = sel;
- SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie edycja"); // ustawienie tekstu w ostatnim polu statusbar-u
- }
- break;
- }
- }else if(HIWORD(wParam) == 1){ // obsługa akceleratora
- switch(LOWORD(wParam)){ // id akceleratora
- case ID_ACCELERATOR_DELETE: // usuwanie obiektów
- {
- switch(st){
- case state::sel:
- {
- SelObjAct.Delete(hWndDraw, tObj); // wywołanie metody klasy SelObjAct, która usunie obiekty zaznaczone
- }
- break;
- }
- }
- break;
- }
- }
- }
- break;
Powyżej został wstawiony cały kod związany z komunikatem WM_COMMAND obsługiwanym wewnątrz funkcji procedury okna WndDrawingProc.
Metoda Delete klasy select_obj
Pozostało już tylko dodanie do klasy select_obj nowej metody o nazwie Delete, która będzie wyglądała następująco:
- void Delete(HWND hWndDraw, std::vector<i_dr_obj*> &tObj){
- if(!tSelObj.empty()){ // jak coś jest zaznaczone to
- if(objundercursor && objundercursor->Selected()){ // jeżeli obiekt pod kursorem jest już zaznaczony
- objundercursor = NULL; // to trzeba ustawić NULL bo ten obiekt zostanie usunięty
- }
- for(int i = 0; i < tObj.size(); i++){ // iterowanie po tablicy interfejsów graficznych obiektów
- if(tObj[i]->Selected()){ // jak zaznaczony
- delete tObj[i]; // zwalniam dynamicznie przypisaną pamięć
- tObj.erase(tObj.begin() + i); // usuwam obiekt
- i --; // muszę przesunąć ideks w dół bo jeden już usunąłem
- }
- }
- SetRectEmpty(&selrect); // prostokąt zaznaczenia powinien być pusty
- tSelObj.clear(); // czyszczę tablicę zaznaczonych obiektów
- InvalidateRect(hWndDraw, NULL, false); // i odświerzam jagby nigdy nic się nie stało okno
- }
- }
Po serii tych jakże wyczerpujących operacji można się cieszyć programem, który nie tylko dodaje, rysuje i zaznacza obiekty, ale również umożliwia ich usuwanie!

Tytuł:
Architektura oprogramowania bez tajemnic. Wykorzystaj język C++ do tworzenia wydajnych aplikacji i systemów
Autor:
Adrian Ostrowski, Piotr Gaczkowski

Tytuł:
Opus magnum C++ 11. Programowanie w języku C++. Wydanie II poprawione (komplet)
Autor:
Jerzy Grębosz

Tytuł:
Programowanie wieloplatformowe z C++ i wxWidgets 3
Autor:
Bartosz W. Warzocha

Tytuł:
Język C++ i przetwarzanie współbieżne w akcji. Wydanie II
Autor:
Anthony Williams

Tytuł:
C++ dla bystrzaków. Wydanie VII
Autor:
Stephen R. Davis

Tytuł:
Tablice informatyczne. Podstawy C++
Autor:
Radosław Sokół

Tytuł:
Opus magnum C++11. Programowanie w języku C++ (komplet)
Autor:
Jerzy Grębosz

Tytuł:
OpenCV 3. Komputerowe rozpoznawanie obrazu w C++ przy użyciu biblioteki OpenCV
Autor:
Adrian Kaehler, Gary Bradski

Tytuł:
C++ w 24 godziny. Wydanie VI
Autor:
Rogers Cadenhead, Jesse Liberty

Tytuł:
C++ Optymalizacja kodu. Sprawdzone techniki zwiększania wydajności
Autor:
Guntheroth Kurt