Artery Geschrieben 8. Januar 2012 Teilen Geschrieben 8. Januar 2012 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: 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 9. Januar 2012 Teilen Geschrieben 9. Januar 2012 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Artery Geschrieben 10. Januar 2012 Autor Teilen Geschrieben 10. Januar 2012 Ich habe die Hintergrundfarbe folgendermaßen geändert: 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 :D MfG Artery Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 10. Januar 2012 Teilen Geschrieben 10. Januar 2012 (bearbeitet) 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. Bearbeitet 10. Januar 2012 von Klotzkopp Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Artery Geschrieben 10. Januar 2012 Autor Teilen Geschrieben 10. Januar 2012 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 10. Januar 2012 Teilen Geschrieben 10. Januar 2012 CWnd::OnCtlColor Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Artery Geschrieben 10. Januar 2012 Autor Teilen Geschrieben 10. Januar 2012 :/ 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.. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 10. Januar 2012 Teilen Geschrieben 10. Januar 2012 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Artery Geschrieben 10. Januar 2012 Autor Teilen Geschrieben 10. Januar 2012 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.. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 10. Januar 2012 Teilen Geschrieben 10. Januar 2012 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? 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: hbr = (HBRUSH)GetStockObject(HOLLOW_BRUSH); in den if-Block. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Artery Geschrieben 10. Januar 2012 Autor Teilen Geschrieben 10. Januar 2012 Ahh okay! Wirklichen vielen vielen dank an dich! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.