Mal wieder ein Flackern am Bildschirm!
-
Hallo Leute!
Sorry wenn ich hier schon wieder ein Frage zu diesem Thema stelle, aber ich kann mit den gebenen antworrten wenig anfangen.
Ich möchte auf mein dialogfeld 2 Rechtecke(ein großes im hintergrund des andere, darauf gesetzt) zeichen. das kleiner soll dann mittels timer alle x sekunden verschwinden. das problem das kleine Rechteck flackert! da die meisten beitrage zu dem thema nur auf bitmaps beziehen helfen die mir nicht viel weiter. ich denke mal da ist nicht viel unterschiedlich zu den bitmaps, aber vielleicht kann mir einer von euch sagen was ich da anderes schreiben muss.
mfg hussi
-
Erstens wäre dein Code interessant, denn Flackern kann viele Gründe haben, und zweitens wäre es schön, wenn du so einen Lösungsansatz, den du im Auge hast, auch mal gepostet hättest.
-
Zeige mal Code. Mit Flackern kenne ich mich ein wenig aus, würde ich mal behaupten.
-
Also hier erstmal meinen Code. ich hab ihn aber noch um gebaut jetzt nur noch ein Rechteck das die farbe ändert. und schon mal vielen dank für die mühe.
void CReaktionszeitDlg::OnButtonStart() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen UpdateData(true); int nInt = atoi(m_sZeit); SetTimer(ID_TIMER, nInt ,NULL); } void CReaktionszeitDlg::OnTimer(UINT nIDEvent) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen zeichen(); CDialog::OnTimer(nIDEvent); } void CReaktionszeitDlg::zeichen() { UpdateData(true); CClientDC dc(this); //CRect GrundRechteck(300,300,400,400); CRect HinterRechteck(200,200,700,500); if(m_ni%2){ m_Hintergrundfarbe = RGB(m_nHinterRot,m_nHinterGruen,m_nHinterBlau); dc.FillSolidRect(HinterRechteck,m_Hintergrundfarbe); }else{ m_Grundfarbe= RGB(m_nGrundRot, m_nGrundGruen,m_nGrundBlau); dc.FillSolidRect(HinterRechteck,m_Grundfarbe); } m_ni++; //UpdateData(false); }
und hier der link zu dem anderem Beitrag:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-3073.html
-
Versuch mal:
void CReaktionszeitDlg::zeichen() { CClientDC dc(this); //CRect GrundRechteck(300,300,400,400); CRect HinterRechteck(200,200,700,500); if(m_ni%2){ m_Hintergrundfarbe = RGB(m_nHinterRot,m_nHinterGruen,m_nHinterBlau); dc.FillSolidRect(HinterRechteck,m_Hintergrundfarbe); }else{ m_Grundfarbe= RGB(m_nGrundRot, m_nGrundGruen,m_nGrundBlau); dc.FillSolidRect(HinterRechteck,m_Grundfarbe); } m_ni++; Invalidate(false); }
Vielleicht hilft das schon ein wenig.
-
danke für den tipp aber leider flackert es damit immer noch.
-
Hm, vielleicht solltest du aber auch wie üblich, das Zeichnen auch OnPaint() bzw. OnDraw() überlassen.
Das heisst, du schreibst:
void CReaktionszeitDlg::OnButtonStart() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen UpdateData(true); int nInt = atoi(m_sZeit); SetTimer(ID_TIMER, nInt ,NULL); } void CReaktionszeitDlg::OnTimer(UINT nIDEvent) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen Invalidate(false); // zeichen(); CDialog::OnTimer(nIDEvent); } void CReaktionszeitDlg::OnPaint() { CPainzDC dc(this); //CRect GrundRechteck(300,300,400,400); CRect HinterRechteck(200,200,700,500); if(m_ni%2){ m_Hintergrundfarbe = RGB(m_nHinterRot,m_nHinterGruen,m_nHinterBlau); dc.FillSolidRect(HinterRechteck,m_Hintergrundfarbe); }else{ m_Grundfarbe= RGB(m_nGrundRot, m_nGrundGruen,m_nGrundBlau); dc.FillSolidRect(HinterRechteck,m_Grundfarbe); } m_ni++; }
-
nein damit geht es auch nicht. aber danke nochmal
-
Sieh dir das einmal an. Absolut einfach zu verwenden und nie wieder flackerts.
http://www.codeproject.com/gdi/flickerfree.asp
Kurt
-
Dort nutzen die auch den Back-/Doubblebuffer.
Manchmal ist das ja aber gar nicht notwendig. Daher ist dann die Frage, wie man selbst Flackern definiert. Ist es stark am flackern oder oder eher ab und zu?
Ich wollte es ihm ohne DB zeigen.
-
Also ich hab es versucht und meiner meinung auch alles so verändert wie es auf der homepage stand, aber es flackert immer noch
!!!
Vielleicht könnt ihr ja noch mal drüber schauen.
// Reaktionszeit1_1View.cpp : Implementierung der Klasse CReaktionszeit1_1View // #include "stdafx.h" #include "Reaktionszeit1_1.h" #include "Reaktionszeit1_1Doc.h" #include "Reaktionszeit1_1View.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CReaktionszeit1_1View IMPLEMENT_DYNCREATE(CReaktionszeit1_1View, CView) BEGIN_MESSAGE_MAP(CReaktionszeit1_1View, CView) //{{AFX_MSG_MAP(CReaktionszeit1_1View) ON_WM_TIMER() ON_WM_ERASEBKGND() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CReaktionszeit1_1View Konstruktion/Destruktion CReaktionszeit1_1View::CReaktionszeit1_1View() { // ZU ERLEDIGEN: Hier Code zur Konstruktion einfügen, } CReaktionszeit1_1View::~CReaktionszeit1_1View() { //KillTimer(ID_TIMER); } BOOL CReaktionszeit1_1View::PreCreateWindow(CREATESTRUCT& cs) { // ZU ERLEDIGEN: Ändern Sie hier die Fensterklasse oder das Erscheinungsbild, indem Sie // CREATESTRUCT cs modifizieren. return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CReaktionszeit1_1View Zeichnen void CReaktionszeit1_1View::OnDraw(CDC* dc) { CMemDC pDC(dc); CReaktionszeit1_1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen CRect HinterRechteck; GetClientRect(HinterRechteck); if(m_ni%2){ m_Hintergrundfarbe = RGB(0,0,0); pDC->FillSolidRect(HinterRechteck,m_Hintergrundfarbe); }else{ //pDC->SetBkMode(TRANSPARENT); m_Grundfarbe= RGB(255, 0,0); pDC->FillSolidRect(HinterRechteck,m_Grundfarbe); } m_ni++; } ///////////////////////////////////////////////////////////////////////////// // CReaktionszeit1_1View Diagnose #ifdef _DEBUG void CReaktionszeit1_1View::AssertValid() const { CView::AssertValid(); } void CReaktionszeit1_1View::Dump(CDumpContext& dc) const { CView::Dump(dc); } CReaktionszeit1_1Doc* CReaktionszeit1_1View::GetDocument() // Die endgültige (nicht zur Fehlersuche kompilierte) Version ist Inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CReaktionszeit1_1Doc))); return (CReaktionszeit1_1Doc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CReaktionszeit1_1View Nachrichten-Handler void CReaktionszeit1_1View::OnTimer(UINT nIDEvent) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen Invalidate(); CView::OnTimer(nIDEvent); } BOOL CReaktionszeit1_1View::OnEraseBkgnd(CDC* pDC) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen return FALSE; } void CReaktionszeit1_1View::OnInitialUpdate() { CView::OnInitialUpdate(); srand( (unsigned)time( NULL ) ); SetTimer(101,10,NULL); // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen } void CReaktionszeit1_1View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) { // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen pDC->SetBkColor(RGB(0, 0, 0)); CView::OnPrepareDC(pDC, pInfo); }
-
Ich denke OnEraseBkgnd() sollte > 0 zurückgeben.
Kurt
-
nein des ist es auch nicht. hab ich auch schon versucht
-
mh, funktioniert eigentlich sehr gut, doch warum zeigt es mir keine bilder mehr an wenn ich sie vorher so anzeigen konnte?
CDC MemDC_AUFL; MemDC_AUFL.CreateCompatibleDC(pDC); CBitmap *BmpPrevious = MemDC_AUFL.SelectObject(&bitmap_2wAuflager_0); pDC->BitBlt(pp1->get_x()-24,pp1->get_y()-24,49,49,&MemDC_AUFL,0,0,SRCCOPY); pDC->SelectObject(BmpPrevious);
danke für eure hilfe
EDIT:
Frage hat sich erübrigt: hab etwas gefunden und lade das Bild nun anders.Gruss
-
Hat noch jemand einen tipp für mich???
Bin absolut ratlos!!