Neuzeichnen der "Explorer-Details" Liste funzt nicht



  • Hallo,

    Ich habe in einem Programm eine spezielle Art der Liste benutzt, die im Explorer zum anzeigen von Details benutzt wird. Das Problem ist immer wenn das komplette Fenster neu gezeichnet werden muss oder die breite einer Spalte verändert wird, werden alle bisherigen Einträge mit dem letzten überschrieben. Allerdings ist es problemlos möglich neue Einträge hinzuzufügen.

    z.B.

    1 | 1 | 1 3 | 3 | 3
    2 | 2 | 2 --> 3 | 3 | 3
    3 | 3 | 3 3 | 3 | 3

    Hier der Code, es kann sein das einige deklarationen von Variabeln fehlen, er ist aber im ganzen kompelierbar:

    //Message Handler:
    static HINSTANCE hinstance = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
    	static char xy1[100], xy2[100], xy3[100];
    	static int iSubItem = 0;
    	static deque<VOKABEL_DATEN> vok_daten;
    	static LVCOLUMN list;
    	LVITEM item;
    	INITCOMMONCONTROLSEX icex; 
    	TEST text = {"xy", "xy", "xy"};
    	switch(message)
    	{
    		case WM_CREATE:
      			icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
              	icex.dwICC  = ICC_LISTVIEW_CLASSES;
              	InitCommonControlsEx(&icex);
    
    			CreateWindow("button", "Speichern", WS_VISIBLE | WS_CHILD, 270,360,100,40,hwnd,(HMENU) BT_SPEICHERN,hinstance,0);
    			CreateWindow("button", "Abbrechen", WS_VISIBLE | WS_CHILD, 20,360,100,40,hwnd,(HMENU) BT_ABBRECHEN,hinstance,0);
    			CreateWindow("button", "Hinzufügen", WS_VISIBLE | WS_CHILD, 280,70,100,40,hwnd,(HMENU) BT_HINZUFUGEN,hinstance,0);
    			CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_VISIBLE | WS_CHILD, 80,50,170,20,hwnd,(HMENU) EDIT_LATEIN,hinstance,0);
    			CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_VISIBLE | WS_CHILD, 80,80,170,20,hwnd,(HMENU) EDIT_DEUTSCH,hinstance,0);
       			CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_VISIBLE | WS_CHILD, 80,110,170,20,hwnd,(HMENU) EDIT_ZUSATZ,hinstance,0);
          		CreateWindow("static", "Latein:", WS_VISIBLE | WS_CHILD, 20,52,60,50,hwnd,0,hinstance,0);
            	CreateWindow("static", "Deutsch:", WS_VISIBLE | WS_CHILD, 20,82,60,50,hwnd,0,hinstance,0);
             	CreateWindow("static", "Zusatz:", WS_VISIBLE | WS_CHILD, 20,112,60,50,hwnd,0,hinstance,0);
              	CreateWindowEx(WS_EX_CLIENTEDGE,WC_LISTVIEW, "", WS_VISIBLE | WS_CHILD | LVS_REPORT, 20,200,350,150,hwnd,(HMENU)LB_LIST,hinstance,0);         	
    
               	list.mask = LVCF_TEXT | LVCF_WIDTH;
              	list.pszText = "Latein";
              	list.cx = 100;
               	ListView_InsertColumn(GetDlgItem(hwnd,LB_LIST),0,&list);
               	list.mask = LVCF_TEXT | LVCF_WIDTH;
              	list.pszText = "Deutsch";
              	list.cx = 100;
               	ListView_InsertColumn(GetDlgItem(hwnd,LB_LIST),1,&list);
               	list.pszText = "Zusatz";
              	list.cx = 100;
               	ListView_InsertColumn(GetDlgItem(hwnd,LB_LIST),2,&list);
    
                EnumChildWindows(hwnd, EnumChildProc, 0);            
    			break;
       		case WM_COMMAND:
         		switch(LOWORD(wParam))
           		{
           			case BT_HINZUFUGEN:
           				VOKABEL_DATEN voktemp;
    
              			GetDlgItemText(hwnd, EDIT_LATEIN, xy1, 100);
                 		GetDlgItemText(hwnd, EDIT_DEUTSCH, xy2, 100);  
              			GetDlgItemText(hwnd, EDIT_ZUSATZ, xy3, 100);
                 		LV_ITEM lvI;        
                		int    iSubItem;
    
    		            strcpy(test.xy1, xy1);
    		            strcpy(test.xy2, xy2);
    		            strcpy(test.xy3, xy3);
    
    		            strcpy(voktemp.heimatsprache, xy1);
    		            strcpy(voktemp.fremdsprache, xy2);
    		            strcpy(voktemp.bemmerkungen, xy3);
    
    		            vok_daten.push_back(voktemp);
    
    		            iSubItem++;
    
    		            lvI.mask    = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
    		            lvI.state    = 0;      
    		            lvI.stateMask    = 0;  
    		            lvI.iItem    = iSubItem;
    		            lvI.iSubItem    = 0;
    		            lvI.pszText    = LPSTR_TEXTCALLBACK;
    		            lvI.cchTextMax    = MAX_PATH;
    		            lvI.lParam    = (LPARAM)&test;
    
    		            ListView_InsertItem(GetDlgItem(hwnd, LB_LIST), &lvI);
              			break;
                  	case BT_ABBRECHEN:
       					DestroyWindow(hwnd);
       					break;
            		case BT_SPEICHERN:
            			char filename[255];
            			SpeichernFenster(filename, hwnd, "Vokabeldatei speichern");
            			WriteFile(filename, vok_daten);		        			
            			break;			
    	         	}
    	          	break;
           	case WM_NOTIFY:       		
      			switch(wParam)
    			{
    		    case LB_LIST:
    		    	{
       					LV_DISPINFO *pLvdi = (LV_DISPINFO *)lParam;
               			TEST *pTest = (TEST*)(pLvdi->item.lParam);
    			        switch(pLvdi->hdr.code)
    			        {
    			        	case LVN_GETDISPINFO:
    			        		switch(pLvdi->item.iSubItem)
    			        		{
    		                    	case 0:  
    		                    		pLvdi->item.pszText = pTest->xy1;		                                
    	                    			break;
                        			case 1:  
                        				pLvdi->item.pszText = pTest->xy2;                                          
                        				break;
                    				case 2:  
                    					pLvdi->item.pszText = pTest->xy3;                                          
                    					break;
                        			default:
                        				break;
            					}
            					break;
    		              }		              
    	              }
    	              break;
                  default:
                  	return DefWindowProc(hwnd, message, wParam, lParam);
                  	break;
    		    };
       			break;
    
    		default:
      			return DefWindowProc (hwnd, message, wParam, lParam);
         		break;			
    	}	
    }
    


  • Wenn ihr irgendwas an der Frage nicht versteht dann müsst ihrs sagen


Anmelden zum Antworten