Bildschirm kurz aufblinken lassen
-
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!
-
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.
-
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.
-
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"?
-
Naja, für Windows hätte ich mir im Zweifel sowas gedacht:
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
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.
-
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...
-
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^^
-
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?