Win7 Programm hängt sich nach einer bestimmten Zeit auf.



  • Hallo Allerseits,
    ich habe ein Problem mit einem Win7 Programm.
    Auf dem Rechner wo ich es geschrieben habe funktioniert es einwandfrei(win7-Tablet), auch auf meinem Laptop gibt es keine Probleme. Jetzt hab ich es auf einem Desktop-Pc installiert und nach ungefähr einer Minute reagiert es nicht mehr richtig, das Menü reagiert überhaupt nicht mehr und wenn ich einen Button anklicke, welcher ein Childwindow öffnet, dann öffnet sich nur der Rahmen des Fensters und geht direkt wieder zu. Beenden geht aber normal.
    Ich bin total ratlos, weil es ja auf anderen Rechnern funktioniert.(Alle Betriebssysteme sind gleich Win7 32bit)
    Ich hab jetzt auf dem Rechner VC++ installiert und das Projekt nochmal neu erzeugt, hat aber nichts gebracht.
    Betriebssystem hab ich auch schon neu installiert.
    Ich weiß jetzt gar nicht wo ich nach dem Fehler suchen soll,
    wär cool wenn da jemand ein Tip hätte.....
    Schon mal danke für Antworten.

    Grüße



  • Ich vermute, das die Message Queue entweder vollläuft, verzögert wird oder sogar
    komplett blockiert wird.

    Ohne den zugehörigen Quelltext ist das aber nur geraten.

    Wir benötigen den Quelltext der Queue und wenn verhanden den Code der das Child-Fenster erzeugen soll.



  • Also es gibt da nicht nur ein Child-Window, das Programm ist schon recht komplex.
    Hier mal die Wnd-Proc:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent,check,ID;char path[1024]={0};	HRESULT rslt;
    	PAINTSTRUCT ps;SIMULATION sim;	Search srch;
    	static HPEN MyPen1,MyPen2,MyPen3;
    	static HFONT font,font1,font2,font3,font4,editfont,artfont;
    	HDC hdc;	HBRUSH BRSH=CreateSolidBrush(RGB(0,0,0)),BRSH2=CreateSolidBrush(RGB(255,255,255));
    	BOOL success=FALSE,set_success=TRUE;
    	toolbar TOOLBAR;Settings SET;LPITEMIDLIST root;OPENFILENAME ofn;FolderTags ft;SENDnRECIEVE sr;
    	static HWND hwndEdit,hwndList,button1,button2,button3,button4,button5,OVER,SetWnd,
    		combo,edit_send,znr_edit,bz_edit,SimWnd;
    
    	switch (message)
    	{
    	case WM_CREATE:
    		font=CreateFont(20,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Arial");
    		font1=CreateFont(120,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Federation");
    		font2=CreateFont(120,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Federation");
    		font3=CreateFont(85,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Federation");
    		font4=CreateFont(70,0,0,0,FW_REGULAR|FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Federation");
    		editfont=CreateFont(20,0,0,0,FW_NORMAL|FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Arial");
    		artfont=CreateFont(15,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Arial");
    /*************************************  TOOLBAR  ********************************************************/
    			OVER= TOOLBAR.CreateSimpleToolbar(hWnd,hInst);
    /*************************************  BUTTONS  ********************************************************/
    		button1 = CreateWindow("BUTTON","Senden",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			(cx-215),82,200,35,hWnd,(HMENU)IDM_SEND,(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),NULL);
    		button2 = CreateWindow("BUTTON","Empfangen",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			(cx-215),122,200,35,hWnd,(HMENU)IDM_RECIEVE,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    		button3 = CreateWindow("BUTTON","Simulation",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			(cx-215),162,200,35,hWnd,(HMENU)IDM_SIM,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    		button4 = CreateWindow("BUTTON" ,"Programmordner wählen",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			15,115,280,30,hWnd,(HMENU)IDM_NAV,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    		button5 = CreateWindow("BUTTON" ,"Programm suchen...",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			15,150,280,30,hWnd,(HMENU)IDM_SEARCH,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    		SendMessage(button1,WM_SETFONT,(WPARAM)font,TRUE);
    		SendMessage(button2,WM_SETFONT,(WPARAM)font,TRUE);
    		SendMessage(button3,WM_SETFONT,(WPARAM)font,TRUE);
    		SendMessage(button4,WM_SETFONT,(WPARAM)font,TRUE);
    		SendMessage(button5,WM_SETFONT,(WPARAM)font,TRUE);
    /*************************************  LISTBOX  ********************************************************/
    		hwndList = CreateWindowEx(0,"LISTBOX" ,"PROGRAMMORDNER INHALT",
    		WS_CHILD|WS_HSCROLL|WS_VISIBLE|WS_DLGFRAME|LBS_NOINTEGRALHEIGHT|LBS_STANDARD|LBS_DISABLENOSCROLL|LBS_HASSTRINGS,
    					15,190,280,(cy-318),hWnd,(HMENU)ID_LISTCHILD,hInst,NULL);
    		SendMessage(hwndList,WM_SETFONT,(WPARAM)font,TRUE);
    		SET.LoadRootFolder(hWnd);	ft.LoadFolderTagData();
    /*************************************  EDITBOX  ********************************************************/
            hwndEdit = CreateWindowEx(0, "EDIT",NULL,
    		WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|WS_DLGFRAME|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_UPPERCASE, 
    					310, 200, (cx-322), (cy-328),hWnd,(HMENU) ID_EDITCHILD,hInst,NULL);
    		SendMessage(hwndEdit,WM_SETFONT,(WPARAM)editfont,TRUE);
    		rslt=Autocomplete_Interface(hwndEdit);if(rslt!=S_OK){Handle_Error(hWnd,rslt);}
    /***************************************  TAGS  *********************************************************/
            znr_edit = CreateWindowEx(0, "EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_CENTER|WS_DLGFRAME, 
    					370, 110, 180, 25,hWnd,(HMENU) ID_ZNREDIT,hInst,NULL);
    		SendMessage(znr_edit,WM_SETFONT,(WPARAM)editfont,TRUE);
            bz_edit = CreateWindowEx(0, "EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_CENTER|WS_DLGFRAME, 
    					590, 110, 342, 25,hWnd,(HMENU) ID_BZEDIT,hInst,NULL);
    		SendMessage(bz_edit,WM_SETFONT,(WPARAM)editfont,TRUE);
    /*************************************  GRAPHICS  *******************************************************/
               MyPen1 = CreatePen( PS_INSIDEFRAME,6,RGB(0,0,0) );          // schwarz
               MyPen2 = CreatePen( PS_INSIDEFRAME,6,RGB(255,255,0) );        // gelb
    		   return 0;
    
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    		// Menüauswahl bearbeiten:
    		switch (wmId)
    		{
    		case IDM_SEND:	sr.sendFile(hwndEdit,EDITBOXMODE);break;
    		case IDM_RECIEVE:check=SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2)break;	
    						check=sr.recieveFile(hwndEdit,znr_edit,bz_edit,0);if(check==1)editchange=TRUE;
    						memset(szFile,0,sizeof(szFile));memset(file,0,sizeof(file));memset(strng,0,sizeof(strng));break;
    		case IDM_UNDO:	if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_UNDO,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_UNDO,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_UNDO,0,0);}break;
    		case IDM_COPY:	if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_COPY,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_COPY,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_COPY,0,0);}break;
    		case IDM_PASTE:	if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_PASTE,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_PASTE,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_PASTE,0,0);}break;
    		case IDM_CUT:	if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_CUT,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_CUT,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_CUT,0,0);}break;
    		case IDM_DELETE:if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_CLEAR,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_CLEAR,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_CLEAR,0,0);}break;
    		case IDM_OPEN:	check=SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2)break;
    						ofn=FileNameStruct(hWnd);if(GetOpenFileName(&ofn)==TRUE){memset(file,0,sizeof(file));
    						sprintf_s(file,"%s",szFile);success=LoadTextFileToEdit(hwndEdit,szFile);
    						if(success==TRUE)path_exist=TRUE;ft.LoadFileTAG(znr_edit,bz_edit,strng);editchange=FALSE;}break;
    		case IDM_SIM:	memset(notlpsz,0,sizeof(notlpsz));GetWindowText(hwndEdit,notlpsz,sizeof(notlpsz));
    						SimWnd=sim.CreateSimWnd(hWnd);SetFocus(hWnd);SimOpen=TRUE;break;
    		case IDM_NEW:	check=SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2){break;}
    						SetWindowText(hwndEdit,"");SetWindowText(znr_edit,"");SetWindowText(bz_edit,"");editchange=FALSE;
    						memset(szFile,0,sizeof(szFile));memset(file,0,sizeof(file));memset(strng,0,sizeof(strng));break;
    		case IDM_SAVEAS:ofn=FileNameStruct(hWnd);
    						if(GetSaveFileName(&ofn)==TRUE){success=SaveTextFileFromEdit(hwndEdit,szFile);
    						if(success==TRUE)path_exist=TRUE;
    						memset(file,0,sizeof(file));sprintf_s(file,"%s",szFile);
    						ft.SaveFileTAG(znr_edit,bz_edit,strng);editchange=FALSE;}
    						DlgDirList(hWnd,folder_path,ID_LISTCHILD,NULL,DDL_DIRECTORY);break;//???
    		case IDM_SAVE:	ft.SaveFileTAG(znr_edit,bz_edit,strng);
    						if(file[0]=='\0'){SendMessage(hWnd,WM_COMMAND,IDM_SAVEAS,0);break;}
    						if(path_exist==FALSE){sprintf_s(file,"%s\\%s",folder_path,strng);}
    						success=SaveTextFileFromEdit(hwndEdit,file);editchange=FALSE;break;
    		case IDM_SETTINGS:	SetWnd = CreateWindow(setWClass,"Schnittstellenkonfiguration",
    						WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,
    						300,100,600,480,hWnd,NULL,hInst,NULL);
    						ShowWindow(SetWnd,SW_SHOW);UpdateWindow(SetWnd);break;
    		case IDM_NAV:	ft.SaveFolderTagData();root=FolderID(hWnd,0);if(root!=NULL){	
    						SHGetPathFromIDList(root,path);SET.SaveRootFolder(path);memset(tag,0,sizeof(tag));
    						ft.LoadFolderTagData();DlgDirList(hWnd,path,ID_LISTCHILD,NULL,DDL_DIRECTORY);}
    						strcpy_s(folder_path,path);break;
    		case IDM_EXTDIR:do{check=sr.ExtDirect(hWnd);ID=sr.SR_Error(hWnd,check);}while(ID==IDRETRY);
    						if(ID==IDCANCEL){break;}else{sr.sendFile(hWnd,DIRECTMODE);break;}
    		case IDM_\1: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;
    		case ID_LISTCHILD:	if(HIWORD(wParam) == LBN_DBLCLK){		
    						check=SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2)break;
    						ft.GetSelItemTag(hwndList,znr_edit,bz_edit);
    						DlgDirSelectEx(hWnd,path,MAX_PATH,ID_LISTCHILD);strcpy_s(file,path);
    						LoadTextFileToEdit(hwndEdit,path);editchange=FALSE;
    						if(SimOpen==TRUE){DestroyWindow(SimWnd);SimWnd=sim.CreateSimWnd(hWnd);
    						UpdateWindow(SimWnd);SetFocus(hWnd);SimOpen=TRUE;}}break;
    		case ID_EDITCHILD:	if(HIWORD(wParam)==EN_CHANGE){editchange=TRUE;}
    							if(HIWORD(wParam)==EN_SETFOCUS){editCTRL=EDITBOX;}break;
    		case ID_ZNREDIT:	if(HIWORD(wParam)==EN_CHANGE){editchange=TRUE;}
    							if(HIWORD(wParam)==EN_SETFOCUS){editCTRL=ZNRBOX;}break;
    		case ID_BZEDIT:		if(HIWORD(wParam)==EN_CHANGE){editchange=TRUE;}
    							if(HIWORD(wParam)==EN_SETFOCUS){editCTRL=BZBOX;}break;
    		case IDM_SEARCH:	srch.CreateSearchWindow(hWnd);break;
    		case IDM_G31:	ShellExecute(hWnd,"open","epl_gewindezyklus",0,"c:\\EPL2 Terminal\\System",SW_SHOWNORMAL);break;
    		case IDM_MANUAL:ShellExecute(hWnd,"open","Anleitung.txt",0,"c:\\EPL2 Terminal\\System",SW_SHOWNORMAL);break;
    		case IDM_WKZ:	sim.CreateToolSetWnd(hWnd);SetFocus(hWnd);break;
    		case IDM_SIMSET:sim.CreateSimSetWnd(hWnd);break;
    		case IDM_EXIT:	check=SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2)break;
    						ft.SaveFolderTagData();set_success=SET.SaveComControl();
    						DestroyWindow(hWnd);break;
    		default:		return DefWindowProc(hWnd, message, wParam, lParam);}break;
       case WM_CTLCOLOREDIT:{	HWND ed=(HWND)lParam;	ID=GetDlgCtrlID(ed);
    							if(ID==ID_EDITCHILD){
    								SetBkColor((HDC)wParam, RGB(0,0,0));//background
    								SetTextColor((HDC)wParam, RGB(255,255,0) );//foreground
    									return (LONG)BRSH;}//CONTROL Background
    							if((ID==ID_ZNREDIT)||(ID==ID_BZEDIT)){
    							SetBkColor((HDC)wParam, RGB(255,255,255));
    							SetTextColor((HDC)wParam, RGB(0,0,0) );
    							return (LONG)BRSH2;}}
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd, &ps);
    		SetBkMode(hdc,TRANSPARENT);
    
    		SelectObject(hdc,font1);
    		TextOut(hdc,20,-10,"E",1);
    		TextOut(hdc,190,-10,"L",1);
    		SelectObject(hdc,font2);
    		SetTextColor(hdc,RGB(140,0,20));
    		TextOut(hdc,100,-10,"P",1);
    		SelectObject(hdc,font3);
    		SetTextColor(hdc,RGB(255,255,0));
    		TextOut(hdc,220,-5,"2",1);
    		SetTextColor(hdc,RGB(0,0,0));
    		TextOut(hdc,((cx/2)-220),-5,"TERMINAL",8);
    		SelectObject(hdc,font4);
    		TextOut(hdc,(cx-135),7,"2.1",3);
    		SelectObject(hdc,artfont);
    		TextOut(hdc,417,92,"Zeichnungs Nr.",14);
    		TextOut(hdc,720,92,"Bezeichnung",11);
    
    	SelectObject( hdc,MyPen2 );
    MoveToEx( hdc,5,100,NULL );LineTo( hdc,302,100);LineTo( hdc,360,70 );LineTo( hdc,(cx-5),70 );
    	SelectObject( hdc,MyPen1 );
    MoveToEx( hdc,5,107,NULL );LineTo( hdc,302,107);LineTo( hdc,302,(cy-120));LineTo( hdc,5,(cy-120));
    LineTo( hdc,5,0 );LineTo( hdc,(cx-5),0 );LineTo( hdc,(cx-5),(cy-120) );LineTo( hdc,302,(cy-120));
    MoveToEx( hdc,302,107,NULL );LineTo( hdc,362,77);LineTo( hdc,(cx-5),77);
    	DeleteObject(MyPen1);DeleteObject(MyPen2);DeleteObject(BRSH);
    		EndPaint(hWnd, &ps);
    		break;
    	case WM_DESTROY:	ft.SaveFolderTagData();set_success=SET.SaveComControl();free(ptr);
    	if(set_success==FALSE)MessageBox(hWnd,"Speichern der ComPort Einstellungen fehlgeschlagen!","Einstellungen",MB_OK|MB_ICONERROR);
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    	return 0;
    }
    

    Was mir auch aufgefallen ist, es hängt sich erst auf wenn ich das Menü berühre,
    aber auch erst nach einer kurzen Zeit
    Danke,

    viele Grüße



  • Nach einem return zusätzlich noch break ist ja schon paranoid.

    Bei WM_CTLCOLOREDIT würde ich jedoch eins vermissen ..

    Wenn es das noch nicht war: Tritt der Fehler bei jedem Menupunkt auf, oder lässt
    sich das Problem noch etwas besser eingrenzen ?


  • Mod

    Wenn Du schon alle Objekte statisch erzeugst, dann solltest Du diese nicht im OnPaint wegschmeißen.

    GDI-Leaks sehe ich in dem Code aber nicht.
    Was sagt der Debugger? Wo bleibt die Anwednung stehen?

    @merino: Ich finde einen break grundsätzlich guten Programmierstil, auch wenn zuvor ein return oder throw steht.



  • Ja, stimmt, es war das fehlende "return 0;" oder "break;" oder beides 🙄 bei WM_CTLCOLOREDIT......
    ....da hätt ich auch mal selbst drauf kommen können.
    Was ich nur komisch find: warum ist das nur auf dem einen Rechner?
    Aber egal, ich dank euch sehr...
    Grüße



  • BRSH und BRSH2 sehen mir aber auch verdächtig aus - Sollte da nicht auch ein static hin?



  • ja, kann schon sein, aber das deswegen die Message-Queue überläuft is doch eher unwarscheinlich.......
    Hab noch mal ein bisschen umgebaut, Variablen lokalisiert unso....

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent,check,ID;
    	HDC hdc;
    	PAINTSTRUCT ps;
    	static HPEN MyPen1,MyPen2,MyPen3;
    	static HFONT font,font1,font2,font3,font4,editfont,artfont;	
    	static HWND hwndEdit,hwndList,button1,button2,button3,button4,button5,OVER,SetWnd,
    		combo,edit_send,znr_edit,bz_edit,SimWnd;
    
    	switch (message)
    	{
    	case WM_CREATE:
    		font=CreateFont(20,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Arial");
    		font1=CreateFont(120,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Federation");
    		font2=CreateFont(120,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Federation");
    		font3=CreateFont(85,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Federation");
    		font4=CreateFont(70,0,0,0,FW_REGULAR|FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Federation");
    		editfont=CreateFont(20,0,0,0,FW_NORMAL|FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Arial");
    		artfont=CreateFont(15,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    			DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Arial");
    /*************************************  TOOLBAR  ********************************************************/
    		{toolbar TOOLBAR;OVER= TOOLBAR.CreateSimpleToolbar(hWnd,hInst);}
    /*************************************  BUTTONS  ********************************************************/
    		button1 = CreateWindow("BUTTON","Senden",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			(cx-215),82,200,35,hWnd,(HMENU)IDM_SEND,(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),NULL);
    		button2 = CreateWindow("BUTTON","Empfangen",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			(cx-215),122,200,35,hWnd,(HMENU)IDM_RECIEVE,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    		button3 = CreateWindow("BUTTON","Simulation",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			(cx-215),162,200,35,hWnd,(HMENU)IDM_SIM,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    		button4 = CreateWindow("BUTTON" ,"Programmordner wählen",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			15,115,280,30,hWnd,(HMENU)IDM_NAV,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    		button5 = CreateWindow("BUTTON" ,"Programm suchen...",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_BORDER,
    			15,150,280,30,hWnd,(HMENU)IDM_SEARCH,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    		SendMessage(button1,WM_SETFONT,(WPARAM)font,TRUE);
    		SendMessage(button2,WM_SETFONT,(WPARAM)font,TRUE);
    		SendMessage(button3,WM_SETFONT,(WPARAM)font,TRUE);
    		SendMessage(button4,WM_SETFONT,(WPARAM)font,TRUE);
    		SendMessage(button5,WM_SETFONT,(WPARAM)font,TRUE);
    /*************************************  LISTBOX  ********************************************************/
    		hwndList = CreateWindowEx(0,"LISTBOX" ,"PROGRAMMORDNER INHALT",
    		WS_CHILD|WS_HSCROLL|WS_VISIBLE|WS_DLGFRAME|LBS_NOINTEGRALHEIGHT|LBS_STANDARD|LBS_DISABLENOSCROLL|LBS_HASSTRINGS,
    					15,190,280,(cy-318),hWnd,(HMENU)ID_LISTCHILD,hInst,NULL);
    		SendMessage(hwndList,WM_SETFONT,(WPARAM)font,TRUE);
    		{Settings SET;	SET.LoadRootFolder(hWnd);	FolderTags ft;	ft.LoadFolderTagData();}
    /*************************************  EDITBOX  ********************************************************/
            hwndEdit = CreateWindowEx(0, "EDIT",NULL,
    		WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|WS_DLGFRAME|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_UPPERCASE, 
    					310, 200, (cx-322), (cy-328),hWnd,(HMENU) ID_EDITCHILD,hInst,NULL);
    		SendMessage(hwndEdit,WM_SETFONT,(WPARAM)editfont,TRUE);
    		{HRESULT rslt=Autocomplete_Interface(hwndEdit);if(rslt!=S_OK){Handle_Error(hWnd,rslt);}}
    /***************************************  TAGS  *********************************************************/
            znr_edit = CreateWindowEx(0, "EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_CENTER|WS_DLGFRAME, 
    					370, 110, 180, 25,hWnd,(HMENU) ID_ZNREDIT,hInst,NULL);
    		SendMessage(znr_edit,WM_SETFONT,(WPARAM)editfont,TRUE);
            bz_edit = CreateWindowEx(0, "EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_CENTER|WS_DLGFRAME, 
    					590, 110, 342, 25,hWnd,(HMENU) ID_BZEDIT,hInst,NULL);
    		SendMessage(bz_edit,WM_SETFONT,(WPARAM)editfont,TRUE);
    /*************************************  GRAPHICS  *******************************************************/
               MyPen1 = CreatePen( PS_INSIDEFRAME,6,RGB(0,0,0) );          // schwarz
               MyPen2 = CreatePen( PS_INSIDEFRAME,6,RGB(255,255,0) );        // gelb
    		   return 0;
    
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    		// Menüauswahl bearbeiten:
    		switch (wmId)
    		{
    		case IDM_SEND:	{SENDnRECIEVE sr;sr.sendFile(hwndEdit,EDITBOXMODE);}break;
    		case IDM_RECIEVE:	{saveN_load sl;	SENDnRECIEVE sr;
    						check=sl.SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2)break;
    						check=sr.recieveFile(hwndEdit,znr_edit,bz_edit,0);if(check==1)editchange=TRUE;
    						memset(szFile,0,sizeof(szFile));memset(file,0,sizeof(file));memset(strng,0,sizeof(strng));}break;
    		case IDM_UNDO:	if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_UNDO,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_UNDO,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_UNDO,0,0);}break;
    		case IDM_COPY:	if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_COPY,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_COPY,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_COPY,0,0);}break;
    		case IDM_PASTE:	if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_PASTE,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_PASTE,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_PASTE,0,0);}break;
    		case IDM_CUT:	if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_CUT,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_CUT,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_CUT,0,0);}break;
    		case IDM_DELETE:if(editCTRL==EDITBOX){SendMessage(hwndEdit,WM_CLEAR,0,0);}
    						else if(editCTRL==ZNRBOX){SendMessage(znr_edit,WM_CLEAR,0,0);}
    						else if(editCTRL==BZBOX){SendMessage(bz_edit,WM_CLEAR,0,0);}break;
    		case IDM_OPEN:	{FolderTags ft;	OPENFILENAME ofn;	saveN_load sl;
    						check=sl.SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2)break;
    						ofn=sl.FileNameStruct(hWnd);
    						if(GetOpenFileName(&ofn)==TRUE){memset(file,0,sizeof(file));
    						sprintf_s(file,"%s",szFile);BOOL success=sl.LoadTextFileToEdit(hwndEdit,szFile);
    						if(success==TRUE)path_exist=TRUE;ft.LoadFileTAG(znr_edit,bz_edit,strng);
    						editchange=FALSE;}}break;
    		case IDM_SIM:	{SIMULATION sim;
    						memset(notlpsz,0,sizeof(notlpsz));GetWindowText(hwndEdit,notlpsz,sizeof(notlpsz));
    						SimWnd=sim.CreateSimWnd(hWnd);SimOpen=TRUE;}break;
    		case IDM_NEW:	{saveN_load sl;
    						check=sl.SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2){break;}
    						SetWindowText(hwndEdit,"");SetWindowText(znr_edit,"");SetWindowText(bz_edit,"");editchange=FALSE;
    						memset(szFile,0,sizeof(szFile));memset(file,0,sizeof(file));memset(strng,0,sizeof(strng));}break;
    		case IDM_SAVEAS:	{FolderTags ft;saveN_load sl;OPENFILENAME ofn;ofn=sl.FileNameStruct(hWnd);
    						if(GetSaveFileName(&ofn)==TRUE){BOOL success=sl.SaveTextFileFromEdit(hwndEdit,szFile);
    						if(success==TRUE)path_exist=TRUE;
    						memset(file,0,sizeof(file));sprintf_s(file,"%s",szFile);
    						ft.SaveFileTAG(znr_edit,bz_edit,strng);editchange=FALSE;}
    						DlgDirList(hWnd,folder_path,ID_LISTCHILD,NULL,DDL_DIRECTORY);}break;//???
    		case IDM_SAVE:	{FolderTags ft;saveN_load sl;ft.SaveFileTAG(znr_edit,bz_edit,strng);
    						if(file[0]=='\0'){SendMessage(hWnd,WM_COMMAND,IDM_SAVEAS,0);break;}
    						if(path_exist==FALSE){sprintf_s(file,"%s\\%s",folder_path,strng);}
    						BOOL success=sl.SaveTextFileFromEdit(hwndEdit,file);editchange=FALSE;}break;
    		case IDM_SETTINGS:	{Settings SET;	SetWnd = SET.CreateComSetWnd(hWnd);}break;
    		case IDM_NAV:	{	LPITEMIDLIST root;	char path[1024]={0};	Settings SET;	FolderTags ft;
    						ft.SaveFolderTagData();root=FolderID(hWnd,0);if(root!=NULL){	
    						SHGetPathFromIDList(root,path);SET.SaveRootFolder(path);memset(tag,0,sizeof(tag));
    						ft.LoadFolderTagData();DlgDirList(hWnd,path,ID_LISTCHILD,NULL,DDL_DIRECTORY);}
    						strcpy_s(folder_path,path);}break;
    		case IDM_EXTDIR:	{SENDnRECIEVE sr;
    						do{check=sr.ExtDirect(hWnd);ID=sr.SR_Error(hWnd,check);}while(ID==IDRETRY);
    						if(ID==IDCANCEL){break;}else{sr.sendFile(hWnd,DIRECTMODE);break;}}
    		case IDM_\1: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;
    		case ID_LISTCHILD:	if(HIWORD(wParam) == LBN_DBLCLK){	
    						SIMULATION sim;	char path[1024]={0};	FolderTags ft;	saveN_load sl;
    						check=sl.SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2)break;
    						ft.GetSelItemTag(hwndList,znr_edit,bz_edit);
    						DlgDirSelectEx(hWnd,path,MAX_PATH,ID_LISTCHILD);strcpy_s(file,path);
    						sl.LoadTextFileToEdit(hwndEdit,path);editchange=FALSE;
    						if(SimOpen==TRUE){DestroyWindow(SimWnd);SimWnd=sim.CreateSimWnd(hWnd);
    							SimOpen=TRUE;}}break;
    		case ID_EDITCHILD:	if(HIWORD(wParam)==EN_CHANGE){editchange=TRUE;}
    							if(HIWORD(wParam)==EN_SETFOCUS){editCTRL=EDITBOX;}break;
    		case ID_ZNREDIT:	if(HIWORD(wParam)==EN_CHANGE){editchange=TRUE;}
    							if(HIWORD(wParam)==EN_SETFOCUS){editCTRL=ZNRBOX;}break;
    		case ID_BZEDIT:		if(HIWORD(wParam)==EN_CHANGE){editchange=TRUE;}
    							if(HIWORD(wParam)==EN_SETFOCUS){editCTRL=BZBOX;}break;
    		case IDM_SEARCH:	{Search srch;srch.CreateSearchWindow(hWnd);}break;
    		case ID_DISP_FILE:	{FolderTags ft;saveN_load sl;
    							check=sl.SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);
    							if(check==2){path_exist=FALSE;break;}
    							else{strcpy_s(strng,file);}
    							int i=SendMessage(hwndList,LB_FINDSTRINGEXACT,0,(LPARAM)file);
    							SendMessage(hwndList,LB_SETCURSEL,(WPARAM)i,0);
    							BOOL success=sl.LoadTextFileToEdit(hwndEdit,szFile);
    							if(success==TRUE)path_exist=TRUE;ft.LoadFileTAG(znr_edit,bz_edit,file);
    							editchange=FALSE;}break;
    		case IDM_G31:	ShellExecute(hWnd,"open","epl_gewindezyklus",0,"c:\\EPL2 Terminal\\System",SW_SHOWNORMAL);break;
    		case IDM_MANUAL:ShellExecute(hWnd,"open","Anleitung.txt",0,"c:\\EPL2 Terminal\\System",SW_SHOWNORMAL);break;
    		case IDM_WKZ:	{SIMULATION sim;	sim.CreateToolSetWnd(hWnd);}break;
    		case IDM_SIMSET:{SIMULATION sim;	sim.CreateSimSetWnd(hWnd);}break;
    		case IDM_EXIT:	{	Settings SET;	FolderTags ft;	saveN_load sl;
    						check=sl.SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);if(check==2)break;
    						ft.SaveFolderTagData();BOOL set_success=SET.SaveComControl();
    						DestroyWindow(hWnd);}break;
    		default:		return DefWindowProc(hWnd, message, wParam, lParam);}break;
       case WM_CTLCOLOREDIT:{	HWND ed=(HWND)lParam;	ID=GetDlgCtrlID(ed);
    							HBRUSH BRSH=CreateSolidBrush(RGB(0,0,0)),BRSH2=CreateSolidBrush(RGB(255,255,255));
    							if(ID==ID_EDITCHILD){
    								SetBkColor((HDC)wParam, RGB(0,0,0));//background
    								SetTextColor((HDC)wParam, RGB(255,255,0) );//foreground
    									return (LONG)BRSH;}//CONTROL Background
    							if((ID==ID_ZNREDIT)||(ID==ID_BZEDIT)){
    							SetBkColor((HDC)wParam, RGB(255,255,255));
    							SetTextColor((HDC)wParam, RGB(0,0,0) );
    							return (LONG)BRSH2;}}return 0;
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd, &ps);
    		SetBkMode(hdc,TRANSPARENT);
    
    		SelectObject(hdc,font1);
    		TextOut(hdc,20,-10,"E",1);
    		TextOut(hdc,190,-10,"L",1);
    		SelectObject(hdc,font2);
    		SetTextColor(hdc,RGB(140,0,20));
    		TextOut(hdc,100,-10,"P",1);
    		SelectObject(hdc,font3);
    		SetTextColor(hdc,RGB(255,255,0));
    		TextOut(hdc,220,-5,"2",1);
    		SetTextColor(hdc,RGB(0,0,0));
    		TextOut(hdc,((cx/2)-220),-5,"TERMINAL",8);
    		SelectObject(hdc,font4);
    		TextOut(hdc,(cx-135),7,"2.1",3);
    		SelectObject(hdc,artfont);
    		TextOut(hdc,417,92,"Zeichnungs Nr.",14);
    		TextOut(hdc,720,92,"Bezeichnung",11);
    
    	SelectObject( hdc,MyPen2 );
    MoveToEx( hdc,5,100,NULL );LineTo( hdc,302,100);LineTo( hdc,360,70 );LineTo( hdc,(cx-5),70 );
    	SelectObject( hdc,MyPen1 );
    MoveToEx( hdc,5,107,NULL );LineTo( hdc,302,107);LineTo( hdc,302,(cy-120));LineTo( hdc,5,(cy-120));
    LineTo( hdc,5,0 );LineTo( hdc,(cx-5),0 );LineTo( hdc,(cx-5),(cy-120) );LineTo( hdc,302,(cy-120));
    MoveToEx( hdc,302,107,NULL );LineTo( hdc,362,77);LineTo( hdc,(cx-5),77);
    		EndPaint(hWnd, &ps);
    		return 0;
    	case WM_CLOSE:		{saveN_load sl;check=sl.SaveCheck(hWnd,hwndEdit,znr_edit,bz_edit);
    						if(check==2){return 0;}else{DestroyWindow(hWnd);}}
    	case WM_DESTROY:	{	Settings SET;	FolderTags ft;
    						ft.SaveFolderTagData();BOOL set_success=SET.SaveComControl();
    						if(set_success==FALSE)MessageBox(hWnd,"Speichern der ComPort Einstellungen fehlgeschlagen!","Einstellungen",MB_OK|MB_ICONERROR);
    						PostQuitMessage(0);}return 0;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    	return 0;
    }
    


  • Ich lese immer weider, dass man sich doch die Objekte, die von Windows stammen und per SelectObject überschrieben werden, zwischenspeichern soll und am Ende wieder reinladen. Ist das gar nicht der Fall?



  • LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent,check,ID;char path[1024]={0};	HRESULT rslt;
    	PAINTSTRUCT ps;SIMULATION sim;	Search srch;
    	static HPEN MyPen1,MyPen2,MyPen3;
    	static HFONT font,font1,font2,font3,font4,editfont,artfont;
    	HDC hdc;	HBRUSH BRSH=CreateSolidBrush(RGB(0,0,0)),BRSH2=CreateSolidBrush(RGB(255,255,255));
    

    Genau hier habe ich aufgehört, weiter zu lesen. Bei jeder Fensternachricht erzeugst du GDI-Objekte, die nicht wieder freigegeben werden. Außerdem was ist SIMULATION und was ist Search (gleiches Problem: unnötiges Erzeugen bei jeder Nachricht)?



  • ja, vieleicht hättste mal weiter lesen sollen, im zweiten Code den ich gepostet hab ist das nämlich alles schon bereinigt.....
    der rest ist static
    Simulation und Search sind Klassen

    @decimad: Wie meinst du das? Wenn du sie mit static erzeugst sind sie doch gespeichert, und wo willst du die Objekte denn wieder reinladen?



  • Wenn man einen DC erhält, ist da irgendein Stock-Font, ein Stock-Pen, ein Stock-Brush usw. selektiert. Wenn Du SelectObject aufrufst, bekommst Du Handles zu den ersetzten Objekten, die Du laut Dokumentation speichern sollst und bevor Du den DC zurückgibst wieder laden sollst. So steht das 1:1 in der Doku von SelectObject.



  • Mhhh, stimmt. Hab ich noch nie gemacht, ging immer auch so. Was soll denn auch passieren wenn mans nicht speichert und wieder zurückgibt?



  • Sagen wir, Du gibst Deinem besten Freund eine Schachtel mit einem Ferrero Roché und schaust weg. Während Du wegschaust, nimmt er das Ferrero Roché raus, packt ein Rafaello rein und schmiert in der Box damit etwas rum, weil die Sonne so knallt. Du schaust wieder hin und forderst die Box zurück. Du machst die Box auf und siehst viel Schmiererei und ein Rafaello und weißt: Alle Ressourcen müssen vernichtet werden, also mampfst Du das Rafaello ganz schnell auf, weil muss ja weg. Wer hat nun das Ferrero Roché? Du oder Dein bester Freund? Und wollte Dein Freund, dass Du das Rafaello aufmampfst? Oder wollte er Dir lieber das Roché wiedergeben, nachdem er mit seinen Schmierereien fertig war? (Ich weiß, das ist jetzt ganz klar eine Geschmacksfrage!)

    Du bist Win32, die Box ist der DC und das Ferrero Roché ist ein Handle zu einem Stock-Pen, das zu Beginn im DC liegt.

    So erkläre ich mir gerade die Doku.



  • Und wenn Dein bester Freund jetzt das Roché einfach immer ignoriert, das er durch seine Rafaellos ersetzt, dann gibt es irgendwann kein Roché mehr, er steht in einem Haufen davon, und alle müssen Wasa Knäckebrot essen 😢



  • Ja, ok, Knäckebrot schmeckt überhaupt nicht.... da will ich nicht der schuldige sein wenn Alle das essen müssen 😃
    Sehr bildhaft beschrieben, aber ich versteh was du meinst.
    Da mach ich das jetzt so...



  • @jacky c++:
    Ich hoffe du hast deinen Quelltext extra für das C++ Forum komprimiert. 😉

    Dein Programmierstil ist etwas unschön:

    1.) Faustregel: Eine Anweisung pro Zeile.

    check=sr.recieveFile(hwndEdit,znr_edit,bz_edit,0);if(check==1)editchange=TRUE;
    

    Zeilen wie diese sind etwas unschön zu gebuggen, da Debugger immer Zeile für Zeile für Zeile abarbeiten.

    2.) Verlagere nicht static Variablen in die entsprechende Stelle, wo sie auch benötigt werden:

    case WM_PAINT:
    {
      HDC hdc;
      PAINTSTRUCT ps;
    
      hdc = BeginPaint(hWnd, &ps);
      if (!hdc)    
        return 1;  // Wenn wir hier einen Breakpoint setzen, wird bei jedem Fehler von BeginPaint() der Debugger hier stehen bleiben
      //if (!hdc) return 1;  // Ein Breakpoint hier bedeutet dass der Debugger immer hier stehen bleibt!
    
      SetBkMode(hdc,TRANSPARENT);
    
      SelectObject(hdc,font1);
      TextOut(hdc,20,-10,"E",1);
      TextOut(hdc,190,-10,"L",1);
      SelectObject(hdc,font2);
      SetTextColor(hdc,RGB(140,0,20));
      TextOut(hdc,100,-10,"P",1);
      SelectObject(hdc,font3);
      SetTextColor(hdc,RGB(255,255,0));
      TextOut(hdc,220,-5,"2",1);
      // ...
      EndPaint(hWnd, &ps);
      return 0;
    

Anmelden zum Antworten