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;