2012-04-05 10 views
3

Ich bin auf der Suche nach einer Möglichkeit, einen Zeichenpuffer auf den Inhaltsbereich eines Fensters rendern. Dies ist nur Pseudo aber soll zeigen, was ich wirklich tun möchte:Render Buffer auf dem Bildschirm in Windows

char buffer[300][200][3]; // 300px x 200px x RGB bytes 
// ... render stuff into buffer 
FancyWindowsFunctionToRenderBufferOnWindow(my_hwnd, buffer, 300, 200, offset_x, offset_y); 

Gibt es eine Möglichkeit, etwas Ähnliches zu tun?

+1

Diese Frage ist sehr breit, vielleicht möchten Sie [winapi DrawText] (http://stackoverflow.com/search?q= [winapi] + drawtext)? –

+0

Zeichnest du den Text in dein eigenes Fenster oder in ein anderes Programmfenster? – chris

+0

@ Jesse, chris Wie kommst du zu dem Entschluss, dass ich Text auf einem Fenster zeichnen will? '^^ –

Antwort

6

Ich denke, Sie müssen eine geräteunabhängige Bitmap (DIB) erstellen. Wenn Sie bereits über ein Pixelfeld verfügen, das in ein Anwendungsfenster eingefügt werden kann, müssen Sie möglicherweise das gesamte Array in den von der API CreateDIBSection zugewiesenen Puffer kopieren und BitBlt aufrufen, um die DIB in das Fenster zu übertragen. Dies ist die einzige Art, wie ich weiß, eine bloße Anordnung von Pixeln als sichtbares Bild auf dem Computerbildschirm auf Win32-Plattform zu zeigen, und es ist sehr kompliziert und schwer zu verstehen.

Hier sind die Schritte, die ich Dinge zu testen, nehmen verwendet, um ähnlich dem, was Sie tun möchten:

Erstellen von DIB:

BITMAPINFO bmi; 
memset(&bmi, 0, sizeof(bmi)); 
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
bmi.bmiHeader.biWidth = /* Width of your image buffer */ 
bmi.bmiHeader.biHeight = - /* Height of your image buffer */ 
bmi.bmiHeader.biPlanes = 1; 
bmi.bmiHeader.biBitCount = 32; 
bmi.bmiHeader.biCompression = BI_RGB; 

HDC hDesktopDC = GetDC(GetDesktopWindow()); 
HBITMAP hDib = CreateDIBSection(hDesktopDC, &bmi, DIB_RGB_COLORS, (void **)&buffer, 0, 0); 
if (buffer == NULL) { /* ERROR */ } 
HDC hDibDC = CreateCompatibleDC(hDesktopDC); 
HGDIOBJ hOldObj = SelectObject(hDibDC, hDib); 

/* Copy your array of pixels to buffer allocated above. */ 

ReleaseDC(GetDesktopWindow(), hDesktopDC); 

Implementierung WM_PAINT-Ereignishandler (die hWnd Variable enthält das Fenster unten Griff):

case WM_PAINT: 
    PAINTSTRUCT paint; 
    HDC hWndDc = BeginPaint(hWnd, &paint); 
    BitBlt(hWndDC, 0, 0, /* Width of DIB */, /* Height of DIB */, 
      /* HDC of DIB (hDibDC in the above) */, 0, 0, SRCCOPY); 
    EndPaint(hWnd, &paint); 
    break; 

Ich erwarte nicht wirklich, dass die oben genannten Codeschnipsel dir direkt helfen würden. Wenn Sie entschlossen sind, GDI-Funktionen wie die in den obigen Snippets zu verwenden, empfehle ich Ihnen, ihre API-Dokumente auf MSDN sorgfältig zu lesen. Weil es sehr schwierig ist, DCs oder GDI-Objekte, die während der Verwendung der APIs erfasst wurden, ordnungsgemäß zu veröffentlichen oder zu löschen.

5

Es klingt, als ob Sie ein Bild (Raster) als ein Array von Zeichen gespeichert haben (was eine seltsame Wahl ist, da Sie normalerweise ein Array von nicht signierten Zeichen für rohe Bitmap-Bilder wünschen).

Wenn Sie bestimmte Ausrichtungsbedingungen erfüllen, können Sie Ihre Bitmap direkt mit SetDIBits anzeigen. Sie füllen eine BITMAPINFO-Struktur aus, die das Pixelformat und die Bilddimensionen beschreibt. Anschließend übergeben Sie diese zusammen mit Ihren Daten an SetDIBits. Es wird sie zu einem DC malen. Es kann ein wenig schwierig sein, alle Parameter richtig zu machen.

Die Ausrichtungsanforderung besteht darin, dass jede Scanline an einer 4-Byte-Grenze beginnen muss. Wenn Sie diese Anforderung nicht erfüllen, erhalten Sie Müll, der dem falschen Schritt ähnelt. Sie können bei Bedarf eine Kopie der Daten mit der korrekten Ausrichtung erstellen.

+0

Danke, ich werde es dir anschauen! Du hast recht, du verwendest normalerweise "unsigned char" für RGB-Werte, erinnerst dich nicht daran, während du die Frage geschrieben hast. –