DrawText & Backbuffering
-
Ich versuche nun schon länger einen flickerfreien Text mit DrawText über ein anderes programm zu zeichnen.
Das zeichnen klappt flickerfrei jedoch bei weitem nicht.
Daher hab ichs nun mit backbuffering versucht jedoch flickert es jetzt noch deutlich schlimmerhier mal der relevante code:
RECT rect; HWND hwnd = GetForegroundWindow(); HDC memhdc; HDC hdc = GetDC(hwnd); memhdc = CreateCompatibleDC(hdc); /// Create memory hdc HBITMAP memBM = CreateCompatibleBitmap(hdc,2000,2000); /// Create BITMAP SelectObject(memhdc, memBM); SetRect(&rect, xPos, yPos, 500, 500); SetBkMode(hdc, TRANSPARENT); SetBkMode(memhdc, TRANSPARENT); SetTextColor(hdc, RGB(0,255,0)); SetTextColor(memhdc, RGB(0,255,0)); DrawText(memhdc, szBuffer, iLength, &rect, 32); BitBlt(hdc,0,0,500, 500,memhdc,0,0,SRCCOPY); ReleaseDC(hwnd,hdc); DeleteDC(hdc); DeleteDC(memhdc); DeleteObject(memBM);so sieht der backbuffer teil der draw function aus. Die rufe ich mehrmals hintereinander auf (solange eben der hotkey dafür gedrückt ist)
also so:
while(hotkey_pressed)
{
draw(...);
}Hab nun lang versucht und rumgetan aber wird einfach nicht :(.
Flickerfrei sollt es sein mehr will ich garnich

Oder gibt es sonst noch eine Möglichkeit ein Text über in einer Vollbildanwendung anzuzeigen ohne zu hooken?
-
Dein Code berücksichtigt doch in keiner Weise den bisherigen Inhalt des Bildschirms...
-
und wie genau berücksichtige ich den aktuellen Bildschirm inhalt :/?
hab das ganze nach diesem thread aufgebaut:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-79310.html
-
Keiner ne Idee wie ich das lösen kann oder was ich falsch mach?
-
du solltest halt auf die entsprechenden Nachrichten reagieren, und nicht in einer while-schleife Zeichenen.
-
Und wie fange ich die Nachrichten ab? Ich zeichne ja nicht in meinem Programm gezeichnet wird auf die Oberfläche eines fremden Programms.
-
Habs immernoch nicht hinbekommen. kriegs einfach nicht flickerfrei
-
Wundert mich nicht, Du überschreibst ja immer das gesamte Rect.
Kann ja auch wiederum nicht anders sein. Würdest Du das nicht tun würdest Diu bei verändertem Text Artifakte (also Trümmer des vorherigen Textes) noch sehen.
Zudem weißt Du auch nicht wann das andere Programm wiederum seine Anzeige macht und damit Deinen Text weglöscht. Bis Du wieder dazu kommst die Daten zu zeichnen sieht das Auge eben nichts.Das muss Flackern...
-
Also kann ich DrawText garnicht flickerfrei bekommen :/?
-
Der Sinn und Zweck des Backbufferings ist es ja, nur dann etwas in das Bitmap zu zeichnen, wenn es wirklich nötig ist. Bei einem WM_PAINT ist dies normalerweise nicht nötig. Im WM_PAINT Zweig darf, neben einem Begin-und Endpaint natürlich, nur ein BitBlt stehen. hdcMem udn das Bitmap solltest du schon vorher erstellen, am Besten bei WM_SIZE, da du hier gleichzeitig auf Größenveränderungen reagieren kannst. Ich würde es auch so machen, dass wenn ein User die Fenstergröße ändert (das Fenster vergrößert), das Bitmap immer bspw. 1.2 mal der bisherigen Größe anzulegen (maximal GetSystemMetrics(SM_CX/YSCREEEN). Bei WM_CHAR oder WM_MOUSEMOVE oder sonst einer Nachricht wird dann in das Bitmap gezeichnet und ein InvalidateRect ausgelöst.
Bespiel:case WM_SIZE: GetClientRect(hWnd,&rcClient); if(cxImg<rcClient.right || cyImg<rcClient.bottom) { cxImg = min(GetSystemMetrics(SM_CXSCREEN),(int)(rcClient.right*1.2f)); cyImg = min(GetSystemMetrics(SM_CYSCREEN),(int)(rcClient.bottom*1.2f)); if(hdcMem) DeleteObject(hdcMem); if(hBitmap) DeleteObject(hBitmap); HDC hdc = GetDC(hWnd); hdcMem = CreateCompatibleDC(hdc); hBitmap = CreateCompatibleBitmap(hdc,cxImg,cyImg); ReleaseDC(hWnd,hdc); SelectObject(hdcMem,hBitmap); SelectObject(hdcMem,hPen); } break;cxImg und cyImg sind statische Variablen und speichern die aktuelle Größe (geht auch geschickter).
Bei WM_PAINT:case WM_PAINT: { PAINSTSTRCT ps; hdc = BeginPaint(hWnd, &ps); BitBlt(hdc,0,0,cxImg,cyImg,hdcMem,0,0,SRCCOPY); EndPaint(hWnd, &ps); break; }Und jetzt kannst du bei anderen Nachrichten wie WM_MOUSEMOVE, WM_CHAR etc. in das Bitmap zeichnen. Als Device-Kontext natürlich immer nur (das statische!) hdcMem verwenden!
Das Bitmap und hdcMem sollten dann süätestens bei WM_DESTROY zerstört werden.Oh nein, ich sehe gerade, du willst Text über eine Vollbildanwendung zeichnen. Das geht so natürlich nicht. Ich poste hier aber dennoch, vielleicht hilft es dem Ein oder Anderem.
-
hi
so ist es.
meinst du andete programme nemen rücksicht auf deine draw funktion!?
daher ist das verhalten undefiniert und nicht voraussagbar..auser du kannst die zielanwendung beeinflussen, bzw. kontrollieren.lowbyte