WinAPI złe odczytanie ID kontrolki

1

Witam. Stworzyłem własną listę opierającą się na tworzeniu własnych przycisków i ustawianiu ich kolejno pod sobą.
Na początku przedstawię funkcje:

  1. Funkcja dodania kontrolki
bool fList_DodajElement(char *sciezka, HWND *hwnd){
    //strcat(tekst2, "start: ");
    //strcat(tekst2, sciezka);
    //strcat(tekst2, "\r\n");
    int ID = fList_WyszukajWolneID();
    HWND hNew = CreateWindowEx(WS_EX_ACCEPTFILES, "WH_LISTCLASSELEMENT", sciezka, WS_CHILD | WS_VISIBLE, 0, int(hListaElementy.size())*21, 250, 21, hListaOdtwarzania, (HMENU)ID, *hInstance, NULL);
    if(hwnd == NULL)
    {
        char tekst[5];
        itoa(ID, tekst, 10);
        MessageBox(0, tekst, "liczba", MB_OK);
        hListaElementy.push_back(&hNew);
    }
    return true;
}
 
  1. Funkcja wyszukiwania wolnego ID dla kontrolki (aby 2 kontrolki nie miały takiego samego ID)
int fList_WyszukajWolneID(){ // blad
    //strcat(tekst2, "fList_WyszukajWolneID()\r\n");
    int ID=0;
    bool znalezione=false;
    while(!znalezione)
    {
        ID++;
        ///========================================================
        //strcat(tekst2, "fList_WolneID z arg: ID =");
        //char tekst[5];
        //itoa(ID, tekst, 10);
        //strcat(tekst2, tekst);
        //strcat(tekst2, "\r\n");
        ///========================================================
        znalezione = fList_WolneID(ID);
    }
    strcat(tekst2, "znaleziono wolne ID\r\n");
    return ID;
}
 
  1. Funkcja pomocnicza do powyższej - sprawdza, czy podane ID posiada już jakas kontrolka.
bool fList_WolneID(int ID){
    for(int n=0; n<(int)hListaElementy.size(); n++)
    {
        ///========================================================
        //strcat(tekst2, ">> sprawdzanie ID kontrolki (n = ");
        //char tekst[5];
        //itoa(n, tekst, 10);
        //strcat(tekst2, tekst);
        //strcat(tekst2, "): ");
        //itoa(GetDlgCtrlID( *hListaElementy[n]), tekst, 10);
        //strcat(tekst2, tekst);
        //strcat(tekst2, "\r\n");
        ///========================================================
        if(ID == GetDlgCtrlID( *hListaElementy[n]))
        {
            //strcat(tekst2, ">> Podane ID istnieje ! \r\n");
            return false;
        }
    }
    //strcat(tekst2, ">> Nie istnieje podane ID !\r\n");
    return true;
}
 
  1. Dodatkowo vector na przechowywanie uchwytów kontrolek
    vector <HWND*> hListaElementy;

Opis problemu:

Funkcja znajdująca unikatowe ID dla kontrolki zawsze zaczyna od ID = 1. Jeżeli jest zajęte przez jakąś kontrolkę z kontenera sprawdza ID = 2 itd. Niestety... Pierwsza kontrolka dostaje ID=1, druga kontrolka dostaje ID=2, natomiast 3 kontrolka dostaje ID=1 (powinno być 3).

Moje działania w celu znalezienia problemu:

Stworzyłem tablice znaków i sprawiłem, aby podane funkcje wypisywały w kontrolce Edit każdy swój ruch. problem pojawił się na samym końcu.
imgur.com/VISk7ue

Jak widzicie faktycznie tworzenie kontrolki 1 oraz 2 przebiega bez zarzutu. Kontrolka 1 otrzymuje ID1, kontrolka 2 otrzymuje ID2. Przy tworzeniu kontrolki nr 3, program sprawdza dostępne ID.

  1. sprawdza czy wolne jest ID: 1
  2. sprawdza ID pierwszej kontrolki (tu jest błąd, ponieważ kontrolka takowa ma ID = 1, a nie jak jest napisane: 2)
  3. sprawdza ID drugiej kontrolki (tu wynik jet prawidłowy - id wynosi 2)
  4. Stwierdza, że nie wystąpiło nigdzie ID = 1 i przypisuje kolejnej kontrolce ID=1.

O co proszę:

Mógłby ktoś podpowiedzieć, co jest w tym kodzie źle? czyżbym źle odczytywał ID kontrolek? Używam funkcji GetDlgCtrlID(). Z góry dziękuję za pomoc.

0

Sprawdziłem jeszcze, czy prawidłowo odczytuje mi ID z kontrolek:

strcpy(tekst2, "");
                    char cID[5];
                    for(int n=0; n<(int)hListaElementy.size(); n++)
                    {
                        char tekst[5];
                        itoa(GetDlgCtrlID(*hListaElementy[n]), tekst, 10);
                        strcat(tekst2, tekst);
                        strcat(tekst2, "\r\n");
                    }
                    SetWindowText(hEdit, tekst2); 

dla:

HWND new2;
            new2 = CreateWindowEx(WS_EX_ACCEPTFILES, "WH_LISTCLASSELEMENT", ":)", WS_CHILD | WS_VISIBLE, 0, int(hListaElementy.size())*21, 250, 21, hListaOdtwarzania, (HMENU)1, *hInstance, NULL);
            hListaElementy.push_back(&new2);
            new2 = CreateWindowEx(WS_EX_ACCEPTFILES, "WH_LISTCLASSELEMENT", ":)", WS_CHILD | WS_VISIBLE, 0, int(hListaElementy.size())*21, 250, 21, hListaOdtwarzania, (HMENU)2, *hInstance, NULL);
            hListaElementy.push_back(&new2); 

o ID 1 oraz 2 otrzymuję, że obie kontrolki mają ID = 2 :(

Edit:
Próbowałem także poruszać się iteratorem i taki sam efekt.

1

Ehhh temat do zamknięcia :(

Zamiast HWND hNew = CreateWindowEx(...)
dałem:
HWND *hNew = new HWND;
*hNew = CreateWindowEx(...) i smiga :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1