Dialog - Alle Controls auf Disabled setzen (Edit auf Readonly)



  • Ein FAQ Antrag, denn ich denke mal der folgende Quellcode könnte nützlich sein, wenn man alle Controls in einem Dialog auf disabled setzen möchte:

    .cpp

    BOOL CALLBACK CDeinDlg::EnumChildProc(HWND hwnd,LPARAM lParam)
    {
    	CWnd* pcWnd = FromHandle(hwnd);
    	CString strClassName;
    	TCHAR cClassName[255];
    	memset(cClassName, 0, sizeof(cClassName));
    
    	//Klassenname holen
    	GetClassName(hwnd, cClassName, sizeof(cClassName));
    	strClassName = cClassName;
    
    	//Wenn 1 dann setze diabled
    	if(lParam == 1)
    	{
    		//Wenn Edit dann setze Readonly
    		if(strClassName == "Edit")
    		{
    			CEdit* pEdit = static_cast<CEdit*>(pcWnd);
    			pEdit->SetReadOnly(TRUE);
    			return TRUE;
    		}
    		pcWnd->EnableWindow(FALSE);
    	}
    	//Wenn was anderes als 1 dann setze enabled
    	else
    	{
    		if(strClassName == "Edit")
    		{
    			CEdit* pEdit = static_cast<CEdit*>(pcWnd);
    			pEdit->SetReadOnly(FALSE);
    			return TRUE;
    		}
    		pcWnd->EnableWindow(TRUE);
    	}
    
    	return TRUE;
    }
    
    void CDeinDlg::OnBnClickedButton()
    {
    	EnumChildWindows(this->m_hWnd,EnumChildProc, 1 /*oder 2 für enabled*/);
    }
    

    in .h

    public:
    static BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam);
    

    Über den LPARAM beim Anruf wird bestimmt ob Enabled oder Disabled gesetzt wird. Alle Controls werden dabei auf Dis/En gesetzt. Ausnahme Editfelder diese werden auf Readonly(TRUE) gesetzt. Dies gilt nur als Ansatz und sollte natürlich nach belieben verfeinert werden.

    *winke*
    Hellsgore



  • Hmm.. :

    Ich bremse ja ungern deinen Eifer aber :

    CDialog::EnableWindow() auf false und alles ist inaktiv

    und wenn du das Fenster nicht disablen willst eine Groupbox um die Elemente und diese disabeln 😉



  • Eine Frechheit das du meinen FAQ Antrag in Frage stellst, das kann nur ein teuflischer Hintergrund haben 😃 Scherz beiseite.

    Der Hintergrund wie in dem Thread vorher von mir ist immernoch, das ich nicht weiss wieviel Controls etc. sich auf dem Dialog befinden. Ich möchte nun nur alle EditFelder inaktiv setzen und den Rest lassen. Schonmal mit CDialog::EnableWindow() probiert? Ja klar man könnte jetzt für die einzelnen Controls wieder Membervariabeln anlegen, aber genau deswegen habe ich das ja gemacht um das zu verhindern und auch der Vorschlag mit den Groupboxen ist zwar eine gute Idee doch muss man dann einen größeren Aufwand betreiben. Die zwei Sachen von mir packste in eine Klasse und kannst sie bei jedem Projekt wiederverwenden ohne was ändern zu müssen.

    Es geht darum keine mVariablen zu erstellen, kein Aufwand betreiben mit neuen Controls anlegen, bestimmte Controls ausschließen.

    Ich meine im Prinzip kann es mir ja egal sein ob es andere nutzen oder nicht, doch man sollte sich den Hintergrund dazu überlegen und dies soll eh nur ein Ansatz sein.

    *winke*
    Hellsgore


Anmelden zum Antworten