Hintergrundfarbe in DialogFeld
-
Hi Leute,
hab mal wieder ein Prob
Folgendes: Habe ein dialogfenster auf dem eine CEdit-Komponente platziert ist. Nun schreibe ich zur Laufzeit etwas rein, und setze das Editfeld auf Readonly. Nun gibt es da nen tollen Effekt, nämlich der Teil des Editfensters, in den ich den Text schreibe ist weiß und der Rest der Editkomponente bleibt grau
. Das kann ich mir irgendwie net erklären. Weiß jemand vielleicht wie ich das abschaffe?
Habe auch bei CodeGuru nachgesehen, aber damit kann ich nur den Hintergrund des Textes ändern, d.h. was grau war wird schlichtweg ignoriert (als ob die Editkomponente kleiner geworden wäre, aber die Umrandung trotzdem gleichgeblieben ist.)
Danke für die Hilfe,
Gruß Marcus
-
editCtrl->InvalidateRect();
Müsste helfen denke ich.
-
Das was du bei CodeGuru gelesen hast, bezieht sich auf OnCtlColor?
Wenn ja, dann war der Artikel entweder nciht vollständig, oder du hast was übersehen:
Die Funktion gibt nen Brush (HBRUSH) zurück. Den musst du auf die Farbe setzen, die der Rest des Editfeldes haben soll ...
-
Hat leider net gefunzt..
mein Code sieht etwa so aus (OnPaint und OnCtlColor): (vielleicht mach ich ja was falsch...)
void MainWindow::OnPaint() { CPaintDC dc(this); CRect rect; CEdit& ed_ActVal =*(CEdit*)GetDlgItem(IDC_ED_ACTVAL); CFont* m_fActVal = new CFont; //Schrift ändern m_fActVal->CreateFont(86, 0, 0, 0, FW_BOLD-50, 0, 0, 0, DEFAULT_CHARSET, OUT_STRING_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, _T("Arial")); //Die erzeugten Schriften zuweisen ed_ActVal.SetFont(m_fActVal,TRUE); ed_ActVal.SetReadOnly(); // Bin mir net sicher ob das hier stimmt... ed_ActVal.GetClientRect(&rect); ed_ActVal.InvalidateRect(rect); } HBRUSH MainWindow::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr ; COLORREF cl_white; CBrush br_white; cl_white = RGB(255,255,255); br_white.CreateSolidBrush(cl_white); // TODO: Change any attributes of the DC here switch (pWnd->GetDlgCtrlID()) { case IDC_ED_ACTVAL: // mein EditCtrl pDC->SetBkColor(cl_white); // change the background color //pDC->SetBkMode(TRANSPARENT); hbr = (HBRUSH) br_white; // apply the brush break; // otherwise do default handling of OnCtlColor default: hbr=CFormView::OnCtlColor(pDC,pWnd,nCtlColor); break; } return hbr; }
wie gesagt, die Farbe um den Text außenrum ändert sich, aber der Rest des EditFeldes bleibt grau, bzw. wird gar nicht geüllt. Ich versteh das ehrlichgesagt nicht. Dachte eigentlich wenn ich ein EditCtrl auf nem Dialog platzier, daß dann alle Änderungen für das GANZE Edit gelten und net nur für den text...
Vielleicht habt ihr noch ne Idee, kann mir net vorstellen daß ich der einzige bin der ein EditCtrl readonly verwendet und vorher was reinschreibt
Eine Möglichkeit wäre vielleicht wenn ich das Rechteck um das Editfeld rauskrieg, aber da weiss ich auch net wie ich das mache. Wenn ihr für weiter oben nichts wisst, kann mir vielleicht jemand dabei helfen.
tnx auf jeden fall
-
oh, hoppla
hab dein problem genau falschrum verstandenmach noch das in OnCtlColor:
pWnd.SetTextBkColor(cl_white);
ausserdem kann du statt
ed_ActVal.GetClientRect(&rect); ed_ActVal.InvalidateRect(rect);
einfach
ed_ActVal.Invalidate();
schreiben.
-
Meinst Du anstelle von
pWnd.SetTextBkColor(cl_white);
vielleicht
pDC->SetTextColor(RGB(0,0,0));(würde ich das auch auf weiss setzen, dann seh ich gar nix mehr :))?
weil pWnd und pDC haben beide keine SetTextBkColor Methode, die hab ich nur bei nem ListCtrlobjekt (zumindest ist das bei mir so ;)).
Leider hab ich immer noch den selben effekt
Aber vielleicht kannst du mir sagen wie ich das Rechteck von dem Control rauskrieg, dann überpinsel ich einfach den grauen scheiss wenns net anders geht
tnx
-
Original erstellt von Der_Digge:
**Aber vielleicht kannst du mir sagen wie ich das Rechteck von dem Control rauskrieg, dann überpinsel ich einfach den grauen scheiss wenns net anders geht
**GetWindowRect()
-
Hi!
Füg mal die WM_CTRLCOLOR (oder so ähnlich) einnewbiew
-
So, jetzt wird hier mal was gescheites (getestet
)gepostet:
HBRUSH CMFCTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr; switch (pWnd->GetDlgCtrlID()) { case IDC_EDIT: // CEdit control ID pDC->SetBkColor(RGB(0,0,255)); pDC->SetTextColor(RGB(255,0,0)); hbr = (HBRUSH) m_Brush; break; default: hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor); break; } return hbr; }
m_Brush ist ein CBrush und Member der Klasse. Wird in OnInitDialog mit
m_Brush.CreateSolidBrush(RGB(0,255,0));
initialisiert.
Das Editfeld sieht dann so aus:
Grüner Hintergrund.
Blauer Texthintergrund.
Roter Text.m_Brush darf nicht Funktionslokal sein!!
[ Dieser Beitrag wurde am 30.08.2002 um 01:58 Uhr von dEUs editiert. ]
-
ES FUNZT !!!!!!!!
Unglaublich aber wahr, diesmal wird tatsächlich das ganze ctrl richtig gezeichnet, deshalb
**
TNX @ ALL
**und SPECIAL TNX @ dEUs
P.S.: Ich versteh zwar net warum das net funzt wenns lokal is (macht für mich logisch keinen Unterschied...) aber egal. Hauptsache ich hab was gelernt
-
Original erstellt von Der_Digge:
**
P.S.: Ich versteh zwar net warum das net funzt wenns lokal is (macht für mich logisch keinen Unterschied...) aber egal. Hauptsache ich hab was gelernt ;)**Weil der Destruktor von CBrush aufgerufen würde und somit der 'Brush' nicht mehr existieren würde.
{ CBrush brush; brush.Create... return brush; // brush.~CBrush() }
-
Jetzt ist alles klar,
tnx Nemesyzz