+ Antworten
Ergebnis 1 bis 11 von 11

MFC - Größe von Strings im Statictext

Diskussion über MFC - Größe von Strings im Statictext in C++: Compiler, IDEs, APIs der Kategorie Programmierung; Hey, Ich habe ein seltsames und zugleich sehr ärgerliches Problem. Ich wollte ein Statictext auf die Größe seiner Caption einstellen. ...

  1. #1
    Reg.-Benutzer Avatar von Artery
    Reg.-Datum
    24.08.2010
    Ort
    Kassel
    Beiträge
    84

    Standard MFC - Größe von Strings im Statictext

    Hey,

    Ich habe ein seltsames und zugleich sehr ärgerliches Problem.

    Ich wollte ein Statictext auf die Größe seiner Caption einstellen. Das klappt auch fast gut, denn manchmal ist der Statictext etwas zu groß oder etwas zu klein und ich weiß einfach nicht wie ich das fixen kann. Denn das Problem ist, dass ich die Hintergrundfarbe geändert habe, die aber nur direkt hinter dem Text die eingestellte Farbe hat, wenn der Statictext zu groß für die Caption ist, ist der Rest des Steuerelements leider grau.

    Ich hab es mit folgendem Code realisiert:

    Code:
    CRect c_RectStaticrect;
    		CStatic* p_c_StaticDialogItem = (CStatic*)GetDlgItem(IDSC_PRFLMNGRUSRNMTXT);
    		p_c_StaticDialogItem->GetWindowRect(c_RectStaticrect);
    		// Ermittelte Koordinaten bzw Maße umwandeln
    		ScreenToClient(&c_RectStaticrect);
    
    		int iStaticWidth = c_RectStaticrect.Width();
    		int iStaticHeight = c_RectStaticrect.Height();
    		int iStaticPositionLeft = c_RectStaticrect.left;
    		int iStaticPositionTop = c_RectStaticrect.top;
    
    		CRect c_RectPicturerect;
    		CStatic* p_c_StaticDialogItem2 = (CStatic*)GetDlgItem(IDPC_PRFLMNGRUSRNMBACKGRD);
    		p_c_StaticDialogItem2->GetWindowRect(c_RectPicturerect);
    		// Ermittelte Koordinaten bzw Maße umwandeln
    		ScreenToClient(&c_RectPicturerect);
    
    		int iPictureControlWidth = c_RectPicturerect.Width();
    		int iPictureControlHeight = c_RectPicturerect.Height();
    		int iPictureControlPositionLeft = c_RectPicturerect.left;
    		int iPictureControlPositionTop = c_RectPicturerect.top;
    
    		CDC* p_DeviceContext;
    		p_DeviceContext = this->GetDlgItem(IDSC_PRFLMNGRUSRNMTXT)->GetDC();
    
    		CString c_StringUsername(get_ProfilebyIndex(m_cComboBoxAvailableProfiles.GetCurSel())->get_Username().c_str());
    		CSize c_SizeTextsize = p_DeviceContext->GetTextExtent(c_StringUsername);
    		
    		//c_SizeTextsize.cx += 12;
    		p_c_StaticDialogItem->MoveWindow(((iPictureControlPositionLeft+(iPictureControlWidth/2))-(iStaticWidth/2)),((iPictureControlPositionTop+(iPictureControlHeight/2))-(iStaticHeight/2)),c_SizeTextsize.cx,c_SizeTextsize.cy,true);
    		this->GetDlgItem(IDSC_PRFLMNGRUSRNMTXT)->SetWindowText(get_ProfilebyIndex(m_cComboBoxAvailableProfiles.GetCurSel())->get_Username().c_str());

    Ich hoffe es gibt eine nicht allzu umständliche Lösung :/


    MfG Artery

  2. #2
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von Artery Beitrag anzeigen
    Denn das Problem ist, dass ich die Hintergrundfarbe geändert habe, die aber nur direkt hinter dem Text die eingestellte Farbe hat, wenn der Statictext zu groß für die Caption ist, ist der Rest des Steuerelements leider grau.
    Das sollte nicht sein. Wie hast du die Hintergrundfarbe denn geändert?

    Und nochmal die Frage: Sind diese ganzen grafischen Details wirklich Teil der Aufgabe, oder ist das nur Spielerei? Wenn du wirklich ein schickes GUI brauchst, solltest du das eher nicht mit MFC, sondern vielleicht mit WPF machen.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  3. #3
    Reg.-Benutzer Avatar von Artery
    Reg.-Datum
    24.08.2010
    Ort
    Kassel
    Beiträge
    84

    Standard

    Ich habe die Hintergrundfarbe folgendermaßen geändert:

    Code:
    HBRUSH CProfilmanager::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	// TODO:  Ändern Sie hier alle Attribute für den DC.
    
    	if(pWnd->GetDlgCtrlID() == IDSC_PRFLMNGRACCPTPRFLTXT)
    	{
    		pDC->SetBkColor(RGB(149,247,161));
    		pDC->SetTextColor(RGB(255,255,255));
        }
    Naja letztlich ist es eigentlich nicht direkt Teil der Aufgabe, die Aufgabe war es eine Anwendung mit MFC zuschreiben und eben eine GUI drüber basteln, weil wir vorher alles mit der Konsole gemacht haben. Aber in anbetracht der Zeit, ich muss Donnerstag abgeben, bin ich einfach schon zu tief drin, es soll jetzt möglichst ohne viel Aufwand das bestehende funktioneren...

    Also bitte gebt mir eine schnelle und einfache Antwort

    MfG Artery

  4. #4
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von Artery Beitrag anzeigen
    Ich habe die Hintergrundfarbe folgendermaßen geändert:
    So macht man das nicht.

    Man setzt die Texthintergrundfarbe auf transparent und steuert die Hintergrundfarbe des Steuerlementes über den Rückgabewert der Methode, siehe Beispiel in der MSDN-Library.
    Geändert von Klotzkopp (10.01.2012 um 14:43 Uhr)
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  5. #5
    Reg.-Benutzer Avatar von Artery
    Reg.-Datum
    24.08.2010
    Ort
    Kassel
    Beiträge
    84

    Standard

    Ohh..mmm.. Ja ich hatte das ihrgendwo aus dem Internet her :/

    Wo finde ich denn dieses Beispiel? Bzw. kannstes mir nicht evt kurz zeigen?
    Da ich wirklich untern hohen Zeitrdruck arbeite wäre das echt nett


    MfG Artery

  6. #6
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  7. #7
    Reg.-Benutzer Avatar von Artery
    Reg.-Datum
    24.08.2010
    Ort
    Kassel
    Beiträge
    84

    Standard

    :/
    Ja toll, der Background ist jetzt aber nicht wirklich Transperent.
    Denn ich habe hinter alle StaticTexte noch Picture Controls gelegt, jetzt sind die Backgrounds nicht einfach "durchlässig" und man sieht die Picture Controls, sonder einfach Weiß oder so..

  8. #8
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von Artery Beitrag anzeigen
    jetzt sind die Backgrounds nicht einfach "durchlässig" und man sieht die Picture Controls, sonder einfach Weiß oder so..
    Dann hast du in OnCtlColor wohl einen weißen Brush zurückgegeben. Die Farbe legst du doch selbst fest.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  9. #9
    Reg.-Benutzer Avatar von Artery
    Reg.-Datum
    24.08.2010
    Ort
    Kassel
    Beiträge
    84

    Standard

    Code:
    HBRUSH CVokabeltrainer20enhancedView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    	HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	// TODO:  Ändern Sie hier alle Attribute für den DC.
    
    	if(pWnd->GetDlgCtrlID() == IDSC_PRFLBTNTXT)
    	{
    		pDC->SetBkMode(TRANSPARENT);
    		//pDC->SetBkColor(RGB(149,247,161));
    		pDC->SetTextColor(RGB(255,255,255));
    
        }
    	// TODO:  Gib einen anderen Pinsel zurück, wenn der Standard nicht erwünscht ist.
    	return hbr;
    }
    So habe ich es jetzt, wie lege ich denn die Farbe fest?? Und ich dachte es soll transparent sein, ich checke das grad nicht..

  10. #10
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von Artery Beitrag anzeigen
    So habe ich es jetzt, wie lege ich denn die Farbe fest??
    Hast du dir den Bespielcode, die Kommentare und den Text drumherum überhaupt mal genauer angesehen?

    Zitat Zitat von Artery Beitrag anzeigen
    Und ich dachte es soll transparent sein, ich checke das grad nicht..
    Du musst den Texthintergrund und den Steuerelement-Hintergrund auf transparent setzen. Bisher setzt du nur den Texthintergrund, mit SetBkMode.

    Den Steuerelement-Hintergrund steuerst du über den Brush, den die Methode zurückgibt.

    Um es kurz zu machen:
    Code:
    hbr = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
    in den if-Block.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  11. #11
    Reg.-Benutzer Avatar von Artery
    Reg.-Datum
    24.08.2010
    Ort
    Kassel
    Beiträge
    84

    Standard

    Ahh okay!

    Wirklichen vielen vielen dank an dich!

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Ähnliche Themen

  1. strings
    Von wulfgang im Forum C++: Compiler, IDEs, APIs
    Antworten: 2
    Letzter Beitrag: 06.02.2009, 12:05
  2. Datei Größe und Größe auf Datenträger?
    Von netfireman im Forum Windows Betriebssysteme
    Antworten: 5
    Letzter Beitrag: 20.05.2008, 20:53
  3. Strings
    Von reuabreliz im Forum C und C++
    Antworten: 5
    Letzter Beitrag: 30.12.2006, 18:39
  4. c++ strings?
    Von Reality im Forum C und C++
    Antworten: 27
    Letzter Beitrag: 04.12.2006, 10:06
  5. Strings in VBA
    Von HangManAtWork im Forum Delphi/RPG+CL/Sonstige
    Antworten: 2
    Letzter Beitrag: 15.11.2001, 11:40

Die häufigsten Suchbegriffe für diese Seite:

Bisher noch keine Treffer von einer Suchmaschine