Listbox problem
-
Hallo!
Ich habe in einer dialogresource eine Listbox, habe auch das häkchen bei Benachrichtigung gesetzt.
Aber ich empfange keine Nachrichten, wenn ich die Auswahl bei der Box ändere:INT CALLBACK TileDataProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { char c[64]; int i = 0; switch(Msg) { case WM_INITDIALOG: if(!MapInit) { MSG_ERROR("Es ist keine Karte geladen!"); EndDialog(hWnd, 1); return 0; } // Alle Tiles auflisten for(i = 0; i < g_Map->GetNumTiles(0); i++) { sprintf(c, "Tile %d", i); SendDlgItemMessage(hWnd, IDC_TILELIST, LB_ADDSTRING, 0, (long)c); } break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_OK: EndDialog(hWnd, 0); break; case IDC_CANCEL: EndDialog(hWnd, 1); break; case LBN_SELCANCEL: case LBN_DBLCLK: case LBN_SELCHANGE: MSG_INFO("selchange!"); // Weder hier kommt ne MessageBox break; default: return DefWindowProc(hWnd, Msg, wParam, lParam); } break; case LBN_SELCANCEL: case LBN_DBLCLK: case LBN_SELCHANGE: MSG_INFO("selchange!"); // noch hier... break; default: return DefWindowProc(hWnd, Msg, wParam, lParam); } return 0; }
-
Die Message kommt als WM_COMMAND, allerding ist im LOWORD(wParam) der ListBox-Identifier!
ALso mut Du case IDC_LIST1 (oder wie auch immer Deine Listbox heißt) innerhalb WM_COMMAND abfangen!
Dann kannst Du per switch(HIWORD(wParam)) die Message abfangen (z. B. LBN_SELCANCEL)...
Siehe auch MSDN: LBN_SELCANCEL.
In Deinem Beispiel wäre das also so:
INT CALLBACK TileDataProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { char c[64]; int i = 0; switch(Msg) { case WM_INITDIALOG: if(!MapInit) { MSG_ERROR("Es ist keine Karte geladen!"); EndDialog(hWnd, 1); return 0; } // Alle Tiles auflisten for(i = 0; i < g_Map->GetNumTiles(0); i++) { sprintf(c, "Tile %d", i); SendDlgItemMessage(hWnd, IDC_TILELIST, LB_ADDSTRING, 0, (long)c); } break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_OK: EndDialog(hWnd, 0); break; case IDC_CANCEL: EndDialog(hWnd, 1); break; case IDC_LIST1: switch(HIWORD(wParam) { case LBN_SELCANCEL: MSG_INFO("LBN_SELCANCEL!"); break; case LBN_DBLCLK: MSG_INFO("LBN_DBLCLK!"); break; case LBN_SELCHANGE: MSG_INFO("LBN_SELCHANGE!"); break; } break; default: return DefWindowProc(hWnd, Msg, wParam, lParam); } break; default: return DefWindowProc(hWnd, Msg, wParam, lParam); } return 0; }Anstatt INT CALLBACK TileDataProc solltest Du lieber beim Standard BOOL CALLBACK TileDataProc bleiben und statt "return 0;" lieber "return TRUE;" zurückgeben, wenn Du die Message bearbeitet hast, ansonsten "return FALSE;"!
Es kann sonst zu seltsamen Verhalten deines Dialoges führen, da Windows (bzw. der DialogManager) TRUE erwartet, wenn die Nachricht bearbeitet wurde...
-
Schon 4 Jahre ist dass hier her,
und auch heut fällt ein anfang schwer.Hey @ll.
Ich habe einen Interessanten Fehler.
Ich habe quasi den von Hepi geposteten Code
WM_COMMAND->(LOWORD)LISTBOX->(HIGHWORD)LBN_SELCHANGE
und es Funktioniert nicht.Ich bin sehr verwundert...
hier mein Code:
#define false FALSE #define true TRUE #define bool BOOL #define limFormat 5 HWND liFormat; LRESULT CALLBACK WndProc( HWND targetWnd, UINT wndMsg, WPARAM wParam, LPARAM lParam ) { bool visitMsg = false; int liSel; switch( wndMsg ) { case WM_CREATE: liFormat = CreateWindow( "LISTBOX", "Formatliste", LBS_NOTIFY | WS_CHILD | WS_DLGFRAME, 235, 15, 100, 110, targetWnd, (HMENU)limFormat, ((LPCREATESTRUCT)lParam)->hInstance, NULL ); break; case WM_COMMAND: switch( LOWORD(wParam) ) { case limFormat: switch( HIWORD(wParam) ) { case LBN_SELCHANGE: printf( "selection: " ); liSel = (int)SendMessage( liFormat, LB_GETCURSEL, 0, 0 ); printf( "%d\n", liSel ); setFormat( liSel );//nebensache( setzt Format von RichEdit) break; } hideAll(); //versteckt dieses Fenster break; } break; } if( !visitMsg ) return DefWindowProc( targetWnd, wndMsg, wParam, lParam ); return 0; }EDIT: einen default unter SELCHANGE würde ich übrigens bekommen.
-
Kann mir da keiner wwas zu sagen?
-
[war Quatsch]
-
Problem hat sich selbst gelöst...
Fehler unbekannt.
Habe lediglich die hideAll() funktion in Zeile 29 verschoben....
Vielleicht liegt es daran das Zeit zum bearbeiten gebraucht wwurde oder so...
Danke trotzdem...
