2016-04-08 24 views
0

Ich habe zwei Fenster, Elternfenster, wo ich von D3D11 und zweiten Kindfenster rendern, was ich über Elternfenster verschieben möchte.GDI und DirectX-Rendering

hier ist der Code, wie ich bin Erstellen von Fenstern:

wcex.cbSize   = sizeof(WNDCLASSEX); 
wcex.style   = 0; 
wcex.lpfnWndProc = WndProc; 
wcex.cbClsExtra  = 0; 
wcex.cbWndExtra  = 0; 
wcex.hInstance  = hInstance; 
wcex.hIcon   = LoadIcon(NULL,IDI_APPLICATION); 
wcex.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wcex.hbrBackground = (HBRUSH)0; 
wcex.lpszMenuName = 0; 
wcex.lpszClassName = L"Parent"; 
wcex.hIconSm  = LoadIcon(NULL,IDI_APPLICATION); 

if(!RegisterClassEx(&wcex)){ 
    return E_FAIL; 
} 

if(!(hWnd = CreateWindowEx(WS_EX_COMPOSITED,L"Parent",L"WINDOW", 
          WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | 
          WS_VISIBLE, 
          CW_USEDEFAULT,CW_USEDEFAULT, 
          WIDTH,HEIGHT, 
          NULL,NULL, 
          hInstance,NULL))){ 
    return E_FAIL; 
} 

und Kind Fenster

wcex2.cbSize   = sizeof(WNDCLASSEX); 
wcex2.style   = 0; 
wcex2.lpfnWndProc = WndProc2; 
wcex2.cbClsExtra  = 0; 
wcex2.cbWndExtra  = 0; 
wcex2.hInstance  = hInstance; 
wcex2.hIcon   = LoadIcon(NULL,IDI_APPLICATION); 
wcex2.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wcex2.hbrBackground = (HBRUSH)0; 
wcex2.lpszMenuName = 0; 
wcex2.lpszClassName = L"Child"; 
wcex2.hIconSm  = LoadIcon(NULL,IDI_APPLICATION); 

if(!RegisterClassEx(&wcex2)){ 
    return E_FAIL; 
} 
if(!(chilWnd = CreateWindowEx(0, wcex2.lpszClassName, NULL, 
           WS_CHILD|WS_CLIPSIBLINGS, 
            0,0, 
            200, 100, 
            hWnd,NULL, 
            hInstance,0))) 
{ 
    return FALSE; 
} 

das ist WndProc Kinder Fenster

case WM_LBUTTONDOWN: 
dragWindow = true; 
SetCapture(hWnd); 
break; 

case WM_LBUTTONUP: 
ReleaseCapture(); 
dragWindow = false; 
break; 

case WM_MOUSEMOVE: 

if (dragWindow == true) 
{ 
    RECT mainWindowRect; 
    POINT pos; 
    int windowWidth, windowHeight; 

    pos.x = (int)(short) LOWORD(lp); 
    pos.y = (int)(short) HIWORD(lp); 

    GetWindowRect(hWnd,&mainWindowRect); 
    windowHeight = mainWindowRect.bottom - mainWindowRect.top; 
    windowWidth = mainWindowRect.right - mainWindowRect.left; 

    ClientToScreen(hWnd, &pos); 

    HDWP hdwp = BeginDeferWindowPos(1); 

    DeferWindowPos(hdwp, 
        hWnd, 
        HWND_TOP, 
        pos.x, 
        pos.y, 
        windowWidth, 
        windowHeight, 
        SWP_NOZORDER); 

    EndDeferWindowPos(hdwp); 

    LockWindowUpdate(hWnd); 
    RedrawWindow(hWnd, 0, 0, RDW_UPDATENOW); 
    LockWindowUpdate(NULL); 
    .... 
    case WM_PAINT: 
    hdc = BeginPaint(hWnd, &Ps); 

    FillRect(hdc, &r, (HBRUSH)GetStockObject(GRAY_BRUSH)); 

    EndPaint(hWnd, &Ps); 

ohne LockWindowUpdate() Funktion Ich habe Kind Fenster Spuren, wenn ich es bewege. Endergebnis ist, dass Kindfenster schwarz ist, während ich es bewege. Was kann ich mehr tun? Ich versuchte GDI doppelte Pufferung, d. H. In Offscreen-Puffer auf WM_MOUSEMOVE Ereignis zeichnen und auf Fenster WM_PAINT Ereignis, aber das gleiche Ergebnis.

+0

In Kind proc können Sie hinzufügen 'Fall WM_NCHITTEST: return HTCAPTION;' das wird das Fenster bewegen (Entfernen Sie 'WM_MOUSEMOVE/LBUTTONUP/DOWN') Versuchen Sie auch' WS_EX_COMPOSITED' auf Null zu setzen –

+0

Ich habe 'case WM_NCHITTEST: HTCAPTION zurückgeben;' und 'WM_MOUSEMOVE/LBUTTONUP/DOWN' entfernt, aber ich habe Spuren des untergeordneten Fensters, wenn ich es verschiebe wie alte Positionen. – Alatriste

+0

Es sollte keine Zeilen folgen. Aktualisieren Sie Ihre Frage, um zu zeigen, was Sie gerade tun. –

Antwort

0

Da ist fast alles von meinem Code. Ich zeigte Ihnen, wie ich bin Fenster zu schaffen, und ich habe auch DirectX-Rendering-Schleife:

bool done = false; 
MSG msg; 

while(!done) 
{ 
    if(PeekMessage(&msg,0,0,0,PM_REMOVE)) 
    { 
     if(msg.message == WM_QUIT) 
     { 
      done = true; 
     } 
     else 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 
    else 
    { 
     Render(); 
    } 
} 

so in dieser Render() Funktion Ich Clearing nur Ziel machen und Spiegeln Puffer. Nichts anderes.

D3DXCOLOR color(0.5f,0.5f,0.85f,1.0f); 
pDevContext->ClearRenderTargetView(pRenderTarget,color); 


pSwapChain->Present(1,0); 
+0

Das ist keine Antwort. Sie sollten Ihre Frage aktualisieren und diese löschen. Auch der obige Code ist kein vollständiges Programm. Siehe Hilfe http://StackOverflow.com/Help/Mcve –

0

In Kind Fenster, außer Kraft setzen WM_NCHITTEST, sich zu bewegen und WM_WINDOWPOSCHANGING außer Kraft setzen Repaint zu erzwingen:

LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_WINDOWPOSCHANGING: Render(); break; 
    case WM_NCHITTEST: return HTCAPTION;  
    } 
    return DefWindowProc(hWnd, message, wParam, lParam); 
} 

LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    if (msg == WM_DESTROY) 
    { 
     PostQuitMessage(0); 
     return 0; 
    } 
    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) 
{ 
    HWND hWnd; 
    WNDCLASSEX wc = { sizeof(WNDCLASSEX) }; 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = WindowProc; 
    wc.hInstance = hInstance; 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.lpszClassName = L"WindowClass"; 
    RegisterClassEx(&wc); 

    hWnd = CreateWindow(wc.lpszClassName, L"appName", 
     WS_CLIPCHILDREN | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
     0, 0, 800, 600, NULL, NULL, hInstance, NULL); 

    //initialize Direct3D 
    initD3D(hWnd, 800, 600); 

    wc.lpfnWndProc = ChildProc; 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); 
    wc.lpszClassName = L"child"; 
    RegisterClassEx(&wc); 
    CreateWindow(wc.lpszClassName, 0, 
     WS_BORDER | WS_VISIBLE | WS_CHILD, 
     0, 0, 300, 200, hWnd, 0, 0, 0); 

    MSG msg = { 0 }; 
    while (msg.message != WM_QUIT) 
    { 
     if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
     else 
     { 
      Render(); 
     } 
    } 

    // clean up Direct3D 
    cleanD3D(); 

    return msg.wParam; 
} 
+0

Ich übersteuerte 'WM_NCHITTEST' zu bewegen, und überschreiben' WM_WINDOWPOSCHANGING' zu erzwingen Repaint und Ja Trails, Spuren gegangen, aber wenn ich Kind-Fenster verschieben, dann schneidet Kanten und Kind Fenster wurde kleiner und kleiner Quad. – Alatriste

+0

Es gibt keinen Größenänderungscode, daher gibt es keinen Grund, das untergeordnete Fenster kleiner zu werden. Sie haben etwas falsch gemacht oder es ist etwas in Ihrem Direct3D-Code, von dem ich nicht erraten kann, was es ist. –

+0

Ich habe meinen Beitrag aktualisiert, wo ich den vollständigen Code habe [link] (http://stackoverflow.com/questions/36592524/gdi-and-directx-rendering) – Alatriste