Dialogproblem



  • Hallo!

    Wenn ich einen Dialog erstelle und anzeigen, dann kann ich den nciht verschieben. (egal ob Parent = Null oder hauptfenster). Aber seine titelleiste ist jedenfalls blau, also aktiviert. Rufe ich von diesem Dialog nun zB eine MessageBox auf, dann kann man die gar nicht anklicken. Genau so ist es mit GetOpenFileName, kann man auch nicht anklicken und nur mit doppelklick auf Dateinamen beednen (Oder Affengriff)
    Was kann man denn da machen?



  • Das klingt ziemlich eigenartig...

    Kannst du den Code herzeigen mit dem du den Dialog erstellst?



  • also, wird aus seiner resource erstellt...
    Hier wie ich ihn azeige:

    //in WM_COMMAND:
    case ID_KARTE_TILEDATA:
      DialogBox(hInst, MAKEINTRESOURCE(IDD_TILEDATA), NULL, TileDataProc);
    break;
    
    // und dann hier im Dialog:
    // wennichb auf einen Button drücke:
    int result = MessageBox(0, "Soll eine Binär-Datei (Ja) oder eine ASCII-Datei(NEIN) erstellt werden?", "Dateiart?", MB_YESNOCANCEL);
    
    // Diese MesageBox kann man icht anklicken
    


  • Ich denke als dritten Parameter darfst du kein NULL übergeben. Die MSDN schweigt nämlich darüber was passiert wenn man bei diesem Parameter ein NULL übergibt, was höchstwahrscheinlich bedeutet, dass das nicht erlaubt ist und zu Fehlern führen kann.

    Also Übergib das Handle zu deinem Hauptfenster. Ich würd mich wundern wenns danach nicht funktionieren würde. Außerdem solltest du 0 zurückgeben statt break.



  • wenn ich das so mache:

    // hWnd ist 0x00000e1c oder so, also != NULL
    DialogBox(hInst, MAKEINTRESOURCE(IDD_TILEDATA), g_hWnd, TileDataProc);
    

    dann passiert genau das gleiche. Bei der MesageBox ist geb ich dann zB das Dialoghandel oder das globale an, aber es ist immer das selbe

    kann das vieleicht an der NAchrichten schleife liegen?

    // Hauptnachrichtenschleife:
    	while( GetMessage(&msg, NULL, 0, 0) ) 
    	{
    		if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) ) 
    		{
    			TranslateMessage( &msg );
    			DispatchMessage( &msg );
    		}
    	}
    


  • Zeig mal deine TileDataProc



  • Hier, ist aber ziemlcih lang, und außerdem ist es bei allen Dailogen so, dass man die nicht verschieben kann.

    INT CALLBACK TileDataProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
    	char c[64];
    	int i = 0;
    
    	static DWORD* data;
    	static CurrentLine = -1;
    
    	switch(Msg)
    	{
    	case WM_INITDIALOG:
    		if(!MapInit)
    		{
    			MSG_ERROR("Es ist keine Karte geladen!");
    			EndDialog(hWnd, 1);
    			return 0;
    		}
    
    		data = new DWORD[g_Map->GetNumTiles(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);
    
    			// Daten abfragen
    			data[i] = *g_Map->GetTileData(0, i);
    		}
    
    		SendDlgItemMessage(hWnd, IDC_TILE, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_MapStruct->TexBmp);
    
    		break;
    
    	case WM_COMMAND:
    		switch(LOWORD(wParam))
    		{
    		case IDC_OK:
    			// Daten kopieren
    			for(i = 0; i < g_Map->GetNumTiles(0); i++)
    				*g_Map->GetTileData(0, i) = data[i];
    			EndDialog(hWnd, 0);
    			break;
    
    		case IDC_CANCEL:
    			EndDialog(hWnd, 1);
    			break;
    
    		case IDC_TILELIST:
    			if(HIWORD(wParam) == LBN_SELCHANGE)
    			{
    				// Alte Daten in Tiledata schreiben
    				// Alle checkboxes durchgehen
    				DWORD tmpdata = 0;
    				DWORD bit = 1;
    				for(DWORD i = 0; i < 32; i++)
    				{
    					if(IsDlgButtonChecked(hWnd, IDC_FLAG0+i))
    						tmpdata = tmpdata | bit;
    					bit = bit * 2;
    				}
    				if(CurrentLine != -1)
    					data[CurrentLine] = tmpdata;
    
    				CurrentLine = SendDlgItemMessage(hWnd, IDC_TILELIST, LB_GETCURSEL, 0, 0);
    				// Chechboxen nach daten aktualisieren
    				tmpdata = data[CurrentLine];
    				bit = 1;
    				for(i = 0; i < 32; i++)
    				{
    					if(tmpdata & bit)
    						CheckDlgButton(hWnd, IDC_FLAG0+i, TRUE);
    					else
    						CheckDlgButton(hWnd, IDC_FLAG0+i, FALSE);
    					bit = bit * 2;
    				}
    			}
    			break;
    
    		case IDC_LOADDATA:
    			{
    				char filename[MAX_PATH];
    				filename[0] = 0;
    				if(!GetFileNameFromDialog(hWnd, DIA_LOAD, "Tiledata files (*.tda)\0*.tda\0All Files (*.*)\0*.*\0\0", filename))
    					return 0;
    				else
    				{
    					me2DMap* ptr = g_Map;
    					ptr->LoadTileData(filename);
    					delete data;
    					SendMessage(hWnd, WM_INITDIALOG, 0, 0);
    				}
    			}
    			break;
    		case IDC_SAVEDATA:
    			{
    				char filename[MAX_PATH];
    				filename[0] = 0;
    				if(!GetFileNameFromDialog(hWnd, DIA_SAVE, "Tiledata files (*.tda)\0*.tda\0All files (*.*)\0*.*\0\0", filename))
    					return 0;
    				else
    				{
    					// Daten kopieren
    					for(i = 0; i < g_Map->GetNumTiles(0); i++)
    						*g_Map->GetTileData(0, i) = data[i];
    					// ASCII oder Binär?
    					int result = MessageBox(hWnd, "Soll eine Binär-Datei (Ja) oder eine ASCII-Datei(NEIN) erstellt werden?", "Dateiart?", MB_YESNOCANCEL);
    					if(result == IDYES)
    						// Und in BinärDatei speichern:
    						g_Map->SaveTileDataBinary(filename);
    					else if(result == IDNO)
    						g_Map->SaveTileDataASCII(filename);
    				}
    
    			}
    			break;
    
    		//	break;
    
    		default:
    
    			return DefWindowProc(hWnd, Msg, wParam, lParam);
    		}
    		break;
    
    	case WM_DESTROY:
    		CurrentLine = -1;
    		delete data;
    		break;
    
    	default:
    		return DefWindowProc(hWnd, Msg, wParam, lParam);
    	}
    	return 0;
    }
    


  • Du solltest dir wohl nochmal die Beispiele zu Dialog-Prozeduren in der MSDN-Library durchlesen. DefWindowProc hat da nämlich nichts zu suchen - allgemein verwendet man return TRUE oder FALSE 😉



  • komisch... ohne DefWindowProc klappt es...
    Mit DefDlgProc gibts nen AusnahmeFehler...

    naja, werd mir mal die beispiele anschauen


Anmelden zum Antworten