2016-04-11 10 views
0

Ich versuche, Text von TextOut zu bewegenDXGI Textausgabe Spur

hier Code

IDXGISurface1* g_pSurface1 = NULL; 
HRESULT hr = pSwapChain->GetBuffer(0, __uuidof(IDXGISurface1), (void**)&g_pSurface1); 

if (SUCCEEDED(hr)) 
{ 
    hr = g_pSurface1->GetDC(FALSE, &hdc); 
    if (SUCCEEDED(hr)) 
    { 


     TextOut(hdc, pos.x, pos.y, L"DXGI's GDI text output works", strlen("DXGI's GDI text output works") + 1); 

     g_pSurface1->ReleaseDC(NULL); 
    } 
    else 
    { 
     MessageBox(0,0,0,0); 
    } 
    g_pSurface1->Release(); 
} 
else 
{ 
    MessageBox(0,0,0,0); 
} 
pDevContext->OMSetRenderTargets(1, &pRenderTarget, pDepth); 

wo

pos.x and pos.y are mouse coordinates 

und wenn ich Verschieben von Text oder Kind Fenster GDI and DirectX rendering

Ich habe diese enter image description here

+0

Warum verwenden Sie GDI statt Direct? –

+0

Weil ich DirectWrite nicht verwenden kann – Alatriste

+0

Warum nicht? Es ist nicht klar aus Ihrer Frage, warum Sie die ältere GDI-Interop verwenden? –

Antwort

1

strlen ist für ANSI, es kann nicht mit Unicode gemischt werden. Verwenden Sie stattdessen "Wide-C-String" -Funktionen wcs xxx. Zum Beispiel wcslen:

const wchar_t* text = L"DXGI's GDI text output works"; 
TextOut(hdc, pos.x, pos.y, text, wcslen(text)); 

loswerden der Spur zu erhalten, müssen Sie den Hintergrund manuell löschen. Zum Beispiel:

case WM_MOUSEMOVE: 
{ 
    HDC hdc = GetDC(hWnd); 

    //erase background: 
    RECT rc; 
    GetClientRect(hWnd, &rc); 
    HBRUSH brush = CreateSolidBrush(RGB(128, 128, 255)); 
    FillRect(hdc, &rc, brush); 
    DeleteObject(brush); 

    //draw text: 
    const wchar_t *text = L"DXGI's GDI text output works"; 
    SetBkMode(hdc, OPAQUE); 
    SetBkColor(hdc, RGB(255,255,255)); 
    TextOut(hdc, LOWORD(lParam), HIWORD(lParam), text, wcslen(text)); 
    ReleaseDC(hWnd, hdc); 
    break; 
} 

Bearbeiten, Mischen dieser mit Direct3D

case WM_MOUSEMOVE: 
{ 
    //call directx rendering to reset the background: 
    Render(); 

    //draw text: 
    HDC hdc = GetDC(hWnd); 
    const wchar_t *text = L"DXGI's GDI text output works"; 
    SetBkMode(hdc, OPAQUE); 
    SetBkColor(hdc, RGB(255,255,255)); 
    TextOut(hdc, LOWORD(lParam), HIWORD(lParam), text, wcslen(text)); 
    ReleaseDC(hWnd, hdc); 
    break; 
} 
+0

ist hier eine andere Möglichkeit, Hintergrund ohne Farbfüllung zu löschen? – Alatriste

+0

weil ich auch Echtzeit-DirectX-Rendering auf demselben Fenster habe, wo ich Text von GDI rende – Alatriste

+0

Das wäre relativ einfach, wenn Hintergrund einfarbig ist. Aber in Ihrem Fall müssen Sie den Hintergrund als Bitmap speichern. Verwenden Sie 'DrawText' anstelle von' TextOut', stellen Sie die alten Textrechtecke wieder her. Es wäre einfacher, den gesamten Hintergrund zu malen. Sie können DirectX verwenden, um in einen Puffer zu malen, um das Neuzeichnen zu beschleunigen. In Ihrem Fall möchten Sie sich vielleicht auf die vorherige Frage konzentrieren, bei der Sie stattdessen ein untergeordnetes Fenster verwenden. –