Thread und Invalidate
-
Hallo
Ich hab nun einen Thread, der permanent eine Variable "s", implementiert in "a" ausliest und diese einem Editfeld wiedergibt. Klappt alles wunderbar, wenn Eintragungen vorhanden sind (oder vorher das Feld Leer war und später ein EIntrag hinzugekommen ist) wie auf Bild 1 zu erkennen:
So, wenn nun aber ein weiterer Eintrag folgt, werden alle bestehenden Einträge erst mal überschrieben
(man sieht es ! es sollte nicht sein) und erst wenn man ins Editfeld klickt und den Text markiert sieht es wieder normal aus wie es sollte!
Siehe Bild 2:Warum ist das so?? Ich hab das Invalidate mal auch unter a.Delte(0,1) gesetzt, es mit Clear versucht, keine Chance. Mit UpdateData erhalte ich während der Laufzeit des Programmes ein Kritischer Abbruch mit einer Fehlermeldung in der winccp.h..

Hier mal der entsprechende Thread:
UINT CHauptDlg::WarnList(LPVOID pParam) { CString somecode, s; CString a; CInternetSession session("Verbindungstest",1,INTERNET_OPEN_TYPE_PRECONFIG); CStdioFile* pFile = NULL; CString strUrl("http://www.nfws.ch/inc/warnlist_scmt.php"); CEdit *pEdit = (CEdit*)pParam; do { try { pFile = session.OpenURL(strUrl,1,INTERNET_FLAG_TRANSFER_BINARY,NULL,0); if(pFile) { while (pFile->ReadString(somecode) != NULL) { a = s + somecode; a.Replace(_T("\\r\\n"), _T("\r\n")); a.Delete(0,1); } pFile->Close(); } } catch (CInternetException* e) { e->Delete(); session.Close(); CloseHandle(session); } pEdit->SetWindowText(a); pEdit->Invalidate(); } while(1+1); return 0; }Und in OnInitiDialog hab ich :
LPVOID pParam = &m_ctlEditWarn; ::AfxBeginThread(WarnList,pParam); m_ctlEditWarn.SetTextColor(RGB(255,255,255)); m_ctlEditWarn.SetBackColor(TRANSPARENT); m_CtrlsResize.SetParentWnd(this); m_CtrlsResize.AddControl(IDC_EDIT1, BIND_BOTTOM | BIND_RIGHT | BIND_LEFT); m_CtrlsResize.AddControl(IDC_BACKGROUND, BIND_TOP | BIND_LEFT | BIND_RIGHT | BIND_BOTTOM); m_CtrlsResize.FixControls();Kann man die Überschreibung des Textes wie auf Bild2 zu erkennen irgendwie unterdrücken??

Greetz
Wolf und Danke
-
1. Was ist m_ctlEditWarn für ein Control Ein Normales Control hat kein SetBackColor!
2. Wenn Du nicht erlaubst dass ein Control seinen Hintergrund zeichnet, dann muss es doch Artifakte geben, also Reste der vorherigen Anzeige. Was sonst?
Wenn ein Edit/Static Control eswirklich richtug machen will transparent dargestellt zu werden, dann muss es sein Parent veranlassen sich neu zu zeichnen.
3. In Invalidate führt nicht dazu, dass die Daten neu angezeigt werden. Sondern signalisiert für dieses Fenster: Beim nächsten WM_APINT musst Du zeichnen. Aber das geschieht nur bei einer laufenden Message Loop. Also entweder UpdateWindow verwenden oder eine Message-Loop.
-
Martin Richter schrieb:
1. Was ist m_ctlEditWarn für ein Control Ein Normales Control hat kein SetBackColor!
Das ist ein Editfeld, abgeleitet von CEditTeaser.h...
Eine Resize-Klasse von Sourceforge (glaub ich), welche automatisch alle Controls welche mit ADD-Control hinzugefügt wurden bei einer Maximierung des Dialoges vergrössern, korrekt und mit der richtigen Position. Das mit dem Transparent benötige ich wegen dem Hintergrundbild. Die Klasse sieht eigentlich (CEditTrans) TRANS_BACK vor, was bei mir allerdings Fehlermeldungen produziert somit funktioniert TRANSPARENT auch. 
UpdateWindow bringt dasselbe Ergebnis. Werde es noch mit nem Message-Loop probieren. Keine Garantie.

