[Code::Block + MinGW] Problem z INITCOMMONCONTROLSEX

0

Witam.

Mam spory problem dotyczący Code::Block (+ MinGW). Mam taki fragment kodu:

HWND g_hRebar;
[...]
    INITCOMMONCONTROLSEX iccx;
    iccx.dwSize = sizeof (INITCOMMONCONTROLSEX);
    iccx.dwICC = ICC_COOL_CLASSES;
    InitCommonControlsEx(&iccx);
    
    g_hRebar = CreateWindowEx(NULL , REBARCLASSNAMEW , L"" , WS_CHILD | WS_VISIBLE |
                              RBS_AUTOSIZE | RBS_BANDBORDERS | RBS_TOOLTIPS , 0 , 0 , 0 , 0 ,
                              g_hWnd , NULL , hInstance , NULL);

Kompilator wysypuje błędy typu:

error: 'RBS_AUTOSIZE' was not declared in this scope
error: 'INITCOMMONCONTROLSEX' was not declared in this scope

a przecież w pliku commctrl.h który jest dołączony do projektu (i biblioteka libcomctrl32.a oczywiście dodana do do projektu)jest "czarne na białym":

#define RBS_AUTOSIZE 8192
[...]
#if (_WIN32_IE >= 0x0300)
typedef struct tagINITCOMMONCONTROLSEX {
        DWORD dwSize;
        DWORD dwICC;
} INITCOMMONCONTROLSEX,*LPINITCOMMONCONTROLSEX;
#endif

z pierwszym błędem mogę sobie łatwo poradzić wstawiając np. w pliku z kodem #define ale z drugim błędem już nie jest tak łatwo. Nie chcę wiele z tym kombinować bo chciałbym żeby wszystko działało tak jak powinno tylko nie bardzo wiem co zrobić. Żeby było dziwniej to gdy wezmę w edytorze PPM na RBS_AUTOSIZE albo INITCOMMONCONTROLSEX i wybiorę z menu Find declaration of 'XXX' to otwiera się nowy plik commctrl.h i to co szukam jest zaznaczone. Podobny problem miałem też ze stylami z pliku winuser.h (style okna i innych kontrolek). Ten błąd pokazuje się tylko przy niektórych stylach itp.

Używam wersję 10.05 ale na poprzedniej wersji był oto samo.
Dodam jeszcze że rozwiązanie problemu jest dla mnie bardzo ważne bo bez tego nie mogę dalej ruszyć z nauką WinAPI
Czy ktoś z Was wie co jest nie tak ?

0

a czy w pliku cpp z tym kodem masz:

#include <commctrl.h>

To, że dodałeś do projektu to jeszcze za mało plik nagłówkowy musi być widziany przez kod.

0

tak dodałem ten plik nagłówkowy. C::B go na pewno widzi bo jak szukam deklaracji (przez menu kontekstowe w edytorze) to otwiera ten plik. Męczę się z tym i rozwiązania nie mogę znaleźć a na Visuala nie chce przechodzić :/

0

No to innym powodem problemu może być błąd typu COPY-PASTE, polegający na tym, że ktoś skopiował teść nagłówka by stworzyć nowy, popoprawiał ten nagłówek do własnych potrzeb, a zapomniał poprawić strażnika (czyli to co stoi zaraz przy pierwszym #ifdef w nagłówku jest użyte dwukrotnie w rożnych nagłówkach). Względnie ty coś zamieszałeś z tym symbolami próbując naprawić coś innego - przynajmniej twój pierwszy post to sugeruje, bo opisałeś jak nie powinno się naprawiać błędów kompilacji.

0

commctrl.h jest nietknięty. próbowałem poprawić w lamerski sposób kopiując to do pliki main.cpp (głównego pliku) ale też nie pomogło.

0

Poszukaj w naglowkach definicji #define _WIN32_IE ??? i sprawdz jaka ma wartosc. Nie pamietam niestety co to jest za stala, ale mialem kiedys wlasnie taki problem, ze wszystko bylo z kodem ok, a jakas podobna stala blokowala mi kompilacje.
Proponuje zajrzec najpierw do windef.h. Jak znajdziesz to sobie ja zwieksz bez obaw, poniewaz te stale sa zalezne od daty napisania plikow naglowkowych, a nie od samego systemu. Przynajmniej jesli chodzi o pakiet MinGW.

1

Taki dziwny błąd a takie proste rozwiązanie :|
Wyczytałem, że takie coś rozwiązuje problem i faktycznie działa :-)

#define _WIN32_IE 0x0400 /* min */

Dziękuje wszystkim za zainteresowanie i pomoc bo gdyby nie wasze odpowiedzi to bym nie miał chęci do rozwiązania tego błędu ;]
.Pozdrawiam</cpp>

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