Grafikproblem bei RedrawWindow()
-
Hallo Leute!
Ich hab ein Programm, was von einem Thread mit Farbdaten versorgt wird. Diese werden in einer Editbox angezeigt, bzw. werden die Farbdaten da umgesetzt.
Dazu folgender hier im Forum gefundener und umgesetzter Code:
HBRUSH CFarbsensorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(pWnd->GetDlgCtrlID() == IDC_EDIT_COLOR) { hbr = CreateSolidBrush(RGB(rot,gruen,blau)); pDC->SetBkMode(TRANSPARENT); return hbr; } else return hbr; }Das funktioniert auch soweit, wenn man bei neuen Daten das Editfeld mit RedrawWindow (0,0,RDW_INVALIDATE) neu zeichnen lässt.
Wenn ich nun im TAskmanager das ganze Proggy verfolge wird die GDI Zahl ständig nach oben getrieben und bei 9999 ist aus. Die Grafik allgemein steigt aus, aber das Programm läuft normal weiter.
Kann mir jemand nen Tipp geben, was ich falsch mache und wo ich suchen muss?Danke Ranger
-
Eigentlich habe ich nicht wirklich Ahnung, was dein Problem betrifft. Allerdings sieht CreateSolidBrush in OnCtlColor ziemlich verdächtig aus... Ich würde mal versuchen, eine Membervariable m_hbr in der Header-Datei zu erzeugen, dieser dann in OnInitDialog den Wert zuweisen ( m_hbr = CreateSolidBrush(RGB(rot,gruen,blau)); ), dann in OnCtlColor die Zeile mit CreateSolidBrush auskommentieren und zwei Zeilen weiter den Member m_hbr statt hbr mit return zurück geben. Dann wird CreateSolidBrush nur einmal ausgeführt, nicht zigmal. Aber wie gesagt: ist nur eine vage Vermutung, aber ist vielleicht einen Versuch wert...
-
Der Dialog sieht jetzt gut aus, aber er reagiert nicht mehr auf RedrawWindow bzw. bleibt die FArbe jetzt schwarz.
Trotzdem erstmal Danke Ranger
-
Hi Leute ich bins wieder!
Das Problem hat sich etwas vergrößert.
Ich habe isabeaus Vorschlag versucht. Er erhöht nicht die Anzahl der GDI Objekte, aber zeichnet auch nicht neu. Wenn ich es nach folgendem Weg umsetze werden sogar GDI Objekte erzeugt, wenn ich ein Fenster über diese Editboxen ziehe. Ich weis, dass es an meinem Code liegt, aber habe keine Ahnung oder keine Idee, wie man das anders machen könnte.HBRUSH CFarbsensorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(pWnd->GetDlgCtrlID() == IDC_EDIT_COLOR) { hbr = CreateSolidBrush(RGB(rot,gruen,blau)); pDC->SetBkMode(TRANSPARENT); return hbr; } if(pWnd->GetDlgCtrlID() == IDC_ROT) { hbr = CreateSolidBrush(RGB(255,0,0)); pDC->SetBkMode(TRANSPARENT); return hbr; } if(pWnd->GetDlgCtrlID() == IDC_GRUEN) { hbr = CreateSolidBrush(RGB(0,255,0)); pDC->SetBkMode(TRANSPARENT); return hbr; } if(pWnd->GetDlgCtrlID() == IDC_BLAU) { hbr = CreateSolidBrush(RGB(0,0,255)); pDC->SetBkMode(TRANSPARENT); return hbr; } else return hbr; }die IDC_COLOR (dieses Editfeld) wird folgendermaßen mit Farbe belebt.
Beispiel:
CEdit * edit = (CEdit *)GetDlgItem(IDC_COLOR) rot = 200; gruen = 100; blau = 150; edit->RedrawWindow(0,0,RDW_INVALIDATE);Für Vorschläge oder weitere Fehlererkenntnisse wäre ich dankbar
Gruß Ranger