Wo ist mein denkfehler



  • ich brauch in meinem programm einige radiobuttons

    da dacht ich - machste die inner schleife:

    for(int i=0; i<8; ++i){
        LoadString(hInst, IDS_NAME+i, strName, sizeof(strName)/sizeof(strName[0]));
        m_Radios[i] = CreateWindow(_T("button"), strName, WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, front, 2, 80, 20, hWnd, (HMENU)ID_RADIO1+i, hInst, NULL);
        front += 80;
        ::SendMessage(m_Radios[i], WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
    }
    

    alles gut und schoen

    aber wenn ich dann die messages abfrag:

    switch(message)	{
        case WM_COMMAND:
            switch(LOWORD(wParam)){
                case ID_RADIO1:
                    button = 1;
                    CheckRadioButton(hWnd, ID_RADIO1, ID_RADIO8, ID_RADIO1);
                    break;
                case ID_RADIO2:
                    button = 2;
                    CheckRadioButton(hWnd, ID_RADIO1, ID_RADIO8, ID_RADIO2);
                    break;
    .
    .
    .
    

    kommt die message immer falsch - bei radiobutton 1 stimmts, da ist dann wParam die richtige ID, aber jede nachfolgende ist immer ein paar nummern zu hoch

    #define ID_RADIO1 40001  // Message: 40001
    #define ID_RADIO2 40002  // Message: 40005
    #define ID_RADIO3 40003  // Message: 40009
    #define ID_RADIO4 40004  // Message: 40012
    .
    .
    

    im Release Mode sogar noch mehr

    wenn ich aber die elemente einzelnd erstell:

    LoadString(hInst, IDS_NAME, strName, sizeof(strName)/sizeof(strName[0]));
    m_Radios[0] = CreateWindow(_T("button"), strName, WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, front, 2, 80, 20, hWnd, (HMENU)ID_RADIO1, hInst, NULL);
    ::SendMessage(m_Radios[0], WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
    front += 80;
    LoadString(hInst, IDS_NAMEA, strName, sizeof(strName)/sizeof(strName[0]));
    m_Radios[1] = CreateWindow(_T("button"), strName, WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, front, 2, 80, 20, hWnd, (HMENU)ID_RADIO2, hInst, NULL);
    ::SendMessage(m_Radios[1], WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
    front += 80;
    

    dann funktionieren die messages richtig {so hab ich es bisher}

    wo ist das problem ?



  • Versuch mal statt ID_RADIO1+i

    den reinen zahlenwert deiner id 40001+i zu verwenden



  • dann ist (im Debug) nur Radio1 und Radio2 richtig, die restlichen werden weiterhin nicht erreicht
    sehr raetselhaft #gruebel



  • Das dürfte keinen Unterschied machen. Ich glaube eher du müsstest das ID_RADIO1+i in Klammern setzen bevor du es in HMENU castest.
    Wie du es gemacht hast, wird ID_RADIO1 zum Zeiger gecastet (=HMNUE). Wenn du den Zeiger dann um eins erhöhst, zeigt er 4 Byte weiter, was ja nicht sein soll, der Wert soll ja nur um eins erhöht werden.

    void main()
    {
    	HMENU Bla = NULL;
    	Bla++;
    	printf( "%.8X\n", Bla );  // 0x00000004
    }
    

    Also einfach (HMENU)(ID_RADIO1+i) 🙂



  • hei klasse - funktioniert

    ne ahnung wie ich diese warnung unterbinden kann ?

    warning C4312: 'type cast' : conversion from 'int' to 'HMENU' of greater size
    


  • #pragma warning ( disable: 4312 )
    Ist eher ein medium-guter Weg, aber vielleicht trotzdem gut zu wissen...

    Besser ist: (HMENU)(ULONG_PTR)(ID_RADIO1+i). Das ist dann "sauber"...



  • vielen dank - diese saubere loesung gefaellt sehr gut, bin nur nicht auf den unsigned long pointer gekommen {=

    dankeschoen {=



  • Du solltest Du Warnung aber möglichst danach wieder aktivieren mit:

    #pragma warning(default: 4312)
    

    da diese in manchen Fällen auch wichtig ist (und zu Fehlern führen kann).



  • ich hab die warnung gar nicht deaktiviert {o;


Anmelden zum Antworten