Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Andere GUIs - Qt, GTK+, wxWidgets ::  Bildschirm kurz aufblinken lassen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
ice86ac
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.03.2012
Beiträge: 6
Beitrag ice86ac Mitglied 15:45:15 29.03.2012   Titel:   Bildschirm kurz aufblinken lassen            Zitieren

Hallo Zusammen,

ich habe ein kleines Problem und bitte hier um einen Gedankenanstoß.

Ich programmiere mit C++ und Qt ein kleines Widget, welches nach Betätigung eines Buttons die Zeit misst. Dies ist kein Problem.

Beim Betätigen des Buttons soll mein Bildschirm aber einmal ganz kurz in einer Farbe (beispielsweise grün) komplett aufleuchten.
Dieses aufblinken soll als Synchronisationszeitpunkt für einen Screenrecorder dienen. Dies soll in weiteren Schritten mit einer Eye-Tracking-Kamera überlagert werden, was jetzt aber nichts zur Sache tut.

Also? Habt ihr eine Idee wie man den Bildschirm für eine kurze Zeit, 0,2s zB, grün macht?

Vielen Dank schonmal!
C++ Forumbot
Forumbot

Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 17120
Beitrag C++ Forumbot Forumbot 15:50:26 29.03.2012   Titel:              Zitieren

Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?


Dieses Posting wurde automatisch erzeugt.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
Thorgrim
Unregistrierter




Beitrag Thorgrim Unregistrierter 21:45:51 29.03.2012   Titel:              Zitieren

Kannst du nicht einfach ein "Popupfenster" mit der Hintergrundfarbe erzeugen, das den kompletten Bereich des von der App aktuell verwendeten Monitors bedeckt? Kenne mich mit Qt leider zu wenig aus.

Oder eben die OS-Funktionen. Für Windows: Sperr das Desktopfenster gegen Updates (LockWindowUpdate), hole dir den DC per GetDCEx mit den Flags DCX_CACHE | DCX_LOCKWINDOWUPDATE und fülle einfach ein Rechteck in diesem Bereich. Anschließend ein InvalidateRect/RedrawWindow. Für wenige 100 ms sollte das auch gut klappen (bei Taskswitches wird es aber vermutlich versagen).

Der Nachteil wäre natürlich, dass dies für alle unterstützten OSs implementiert werden müsste. Also am Besten doch ein Popupfenster.
ice86ac
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.03.2012
Beiträge: 6
Beitrag ice86ac Mitglied 22:22:30 29.03.2012   Titel:              Zitieren

Hmm n Popupfenster, welches sich automatisch wieder schließt, wäre eine Maßnahme! Danke für die Idee!

Das mit den Windowsbordmitteln hab ich nicht ganz verstanden. Das Programm soll aber auch nur unter Windows laufen.

Gibt es denn keine Möglichkeit mein Vorhaben direkt aus dem C++ Code anzusteuern?
Irgendwie die Pixel des Bildschirms anzusprechen und dann "färben"?
Thorgrim
Unregistrierter




Beitrag Thorgrim Unregistrierter 22:31:06 29.03.2012   Titel:              Zitieren

Naja, für Windows hätte ich mir im Zweifel sowas gedacht:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void PaintDesktop(COLORREF color, unsigned ms = 300)
{
    HWND hwnd;
    if(LockWindowUpdate(hwnd = GetDesktopWindow()))
    {
        HDC hdc = GetDCEx(hwnd, NULL, DCX_CACHE|DCX_LOCKWINDOWUPDATE);
        // Annahme: Primärer Monitor, ansonsten mit MonitorFromWindow & GetMonitorInfo arbeiten
        RECT client = {0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)};
        SetDCBrushColor(hdc, color);
        FillRect(hdc, &client, static_cast<HBRUSH>(GetStockObject(DC_BRUSH)));
        RedrawWindow(hwnd,NULL,NULL,RDW_INVALIDATE);
        Sleep(ms);
        ReleaseDC(hwnd, hdc);
        InvalidateRect(hwnd,0,true);
        LockWindowUpdate(NULL);
    }
}

Oder notfalls pollen und FillRect/RedrwWindow durch
C++:
unsigned end = GetTickCount()+ms;
while(unsigned cur = GetTickCount() < end)
{
    LockWindowUpdate(hwnd);
    FillRect(hdc, &client, static_cast<HBRUSH>(GetStockObject(DC_BRUSH)));
    RedrawWindow(hwnd,NULL,NULL,RDW_INVALIDATE);
}

ersetzen.
Aber wie geschrieben: Ein Popupfenster wäre die bessere Lösung.
ice86ac
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.03.2012
Beiträge: 6
Beitrag ice86ac Mitglied 14:30:52 11.04.2012   Titel:              Zitieren

Windows.h ist eingebunden, trotzdem bekomme ich folgende zwei Fehlermeldungen:

SetDCBrushColor was not declared in this scope sowie

DC_BRUSH was not declared in this scope

Um was gehts da genau?

Tut mir leid, aber mit der Windows API hab ichs wirklich garnicht -.-


EDIT: Okay, SetDCBrushColor hab ich nochmal neu initialisiert. Aber mit dem DC_BRUSH häng ich irgendwie aufm Schlauch...


Zuletzt bearbeitet von ice86ac am 17:15:01 11.04.2012, insgesamt 2-mal bearbeitet
$-BootLag-$
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.10.2010
Beiträge: 192
Beitrag $-BootLag-$ Mitglied 19:46:40 11.04.2012   Titel:              Zitieren

Ich würde das hanze viel einfacher angehen:
Schnell eine kleine .bat Datei mit dem Inhalt @echo off und color XX (XX=Farbcode) im Vollbildschirmmodus starten und fertig. Funktioniert als Gag in der Schule wunderbar^^
ice86ac
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.03.2012
Beiträge: 6
Beitrag ice86ac Mitglied 12:10:59 13.04.2012   Titel:              Zitieren

$-BootLag-$ schrieb:
Ich würde das hanze viel einfacher angehen:
Schnell eine kleine .bat Datei mit dem Inhalt @echo off und color XX (XX=Farbcode) im Vollbildschirmmodus starten und fertig. Funktioniert als Gag in der Schule wunderbar^^


Wie meinst du das genau? Könntest du mir vllt ne PM schreiben?

Wie schauts denn mit dem DC_BRUSH aus? Hat keiner Rat für mich?
c++.de :: Andere GUIs - Qt, GTK+, wxWidgets ::  Bildschirm kurz aufblinken lassen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.