2016-04-08 4 views
0

У меня есть два окна, родительское окно, где я рендеринг D3D11 и второе дочернее окно, что я хочу переместить над родительским окном.GDI и рендеринг DirectX

вот код, как я создаю окно:

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; 
} 

и ребенок окна

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; 
} 

это WndProc дочернего окна

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); 

без LockWindowUpdate() функция у меня есть когда я перемещаю его. , так что конечным результатом является то, что дочернее окно является черным, пока я его перемещаю. Что я могу сделать больше? Я попробовал двойную буферизацию GDI. Я рисую в offscreen буфере на событие WM_MOUSEMOVE и рисую на окне по событию WM_PAINT, но с тем же результатом.

+0

В детской прок можно добавить 'случай WM_NCHITTEST: обратный HTCAPTION,' это будет перемещать окно (удалить 'WM_MOUSEMOVE/LBUTTONUP/DOWN') Также попробуйте изменить' WS_EX_COMPOSITED' на ноль –

+0

Я добавил 'случай WM_NCHITTEST: вернул HTCAPTION;' и удалил 'WM_MOUSEMOVE/LBUTTONUP/DOWN', но у меня есть следы дочернего окна, когда я его перемещаю , как старые позиции. – Alatriste

+0

Не должно быть никаких линий. Обновите свой вопрос, чтобы показать, что вы делаете. –

ответ

0

В моем коде есть почти все. Я показал вам, как я создаю окно, и я также DirectX цикл рендеринга:

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(); 
    } 
} 

так в этой функции Render() Я просто очистки цели визуализации и листать буфера. Ничего больше.

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


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

Это не ответ. Вы должны обновить свой вопрос и удалить его. Также выше код не является полной программой. См. Раздел справки http://stackoverflow.com/help/mcve –

0

В дочернем окне, переопределяют WM_NCHITTEST двигаться, и переопределить WM_WINDOWPOSCHANGING, чтобы заставить перекрасить:

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

Я переопределил 'WM_NCHITTEST' для перемещения и переопределения' WM_WINDOWPOSCHANGING' для принудительной перерисовки и да следов, следы исчезли, но когда я перемещаю дочернее окно, тогда края режут и дочернее окно стало меньше и меньше. – Alatriste

+0

Нет кода изменения размера, поэтому нет причин, по которым дочернее окно должно уменьшаться. Вы сделали что-то не так, или в вашем коде Direct3D есть что-то, что я не могу догадаться, что это такое. –

+0

Я обновил свой пост, где у меня есть полный код [ссылка] (http://stackoverflow.com/questions/36592524/gdi-and-directx-rendering) – Alatriste

Смежные вопросы