2013-05-25 1 views
0

Я создаю приложение, которое использует directx для рендеринга изображений через окно захвата win32 с веб-камеры, но я это окно мигает каждый другой кадр. (Кажется, это происходит от directx, очищающего экран от каждого кадра, так как мигающий цвет совпадает с четким цветом)C++ проблескивает при рендеринге элементов directx над win32 camCaptureWindow

Есть ли способ исправить эту проблему? (Я не был в состоянии понять, как обеспечить подачу камеры без использования win32)

И вот мой код проекта:

Windows.cpp:

#include <windows.h> 
#include <vfw.h> 
#include <wchar.h> 
#include "Game.h" 
#include "resource.h" 
#include "Mouse.h" 

LRESULT CALLBACK WindowProc (HWND, UINT, WPARAM, LPARAM); 

static KeyboardServer kServ; 
static MouseServer mServ; 

char szAppName [] = TEXT("Webcam"); 
HWND camhwnd; 
HDC hdc ; 
HDC hdcMem; 
PAINTSTRUCT ps; 
HBITMAP hbm; 
RECT rc; 

//WinMain -- Main Window 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 

    HWND hwnd; 
    MSG msg; 

    WNDCLASS wc; 
    wc.style = CS_HREDRAW|CS_VREDRAW; 
    wc.lpfnWndProc = WindowProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(GetModuleHandle(NULL), IDI_APPLICATION); 
    wc.hCursor = LoadCursor (NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = szAppName; 

    RegisterClass (&wc); 


    hwnd = CreateWindow (szAppName,szAppName,WS_POPUP | WS_VISIBLE,0,0,1920,1080,0,0,hInstance,0); 


    ShowWindow (hwnd,SW_SHOW); 
    UpdateWindow (hwnd); 

    ShowWindow(camhwnd,SW_SHOW); 
    SendMessage(camhwnd,WM_CAP_DRIVER_CONNECT,0,0); 
    SendMessage(camhwnd, WM_CAP_SET_SCALE, true , 0); 
    SendMessage(camhwnd, WM_CAP_SET_PREVIEWRATE, 66, 0); 
    SendMessage(camhwnd, WM_CAP_SET_PREVIEW, true , 0); 



    Game theGame(hwnd,kServ,mServ); 


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

    return msg.wParam; 
} 

//Main Window Procedure WindowProc 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { 
    HINSTANCE hInstance = GetModuleHandle(NULL); 

    switch (message) { 
     case WM_CREATE: { 

      camhwnd = capCreateCaptureWindow ("camera window", WS_CHILD , 0, 0, 1920, 1080, hwnd, 0); 
      SendMessage(camhwnd,WM_CAP_DRIVER_CONNECT,0,0); 
      SendMessage(camhwnd,WM_CAP_DLG_VIDEOSOURCE,0,0); 

      break; 

     } 

     case WM_DESTROY: { 
      SendMessage(camhwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0); 
      PostQuitMessage(0); 
      break; 
     } 

     default: 
      return DefWindowProc(hwnd, message, wParam, lParam); 
    } 
    return 0; 
} 

Часть игры .cpp:

void Game::Go() 
{ 
    gfx.BeginFrame(); 
    ComposeFrame(); 
    gfx.EndFrame(); 
} 

И, наконец, кусок D3DGraphics.cpp:

D3DGraphics::D3DGraphics(HWND hWnd) 
{ 
    HRESULT result; 

    backRect.pBits = NULL; 

    pDirect3D = Direct3DCreate9(D3D_SDK_VERSION); 
    assert(pDirect3D != NULL); 

    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory(&d3dpp,sizeof(d3dpp)); 
    d3dpp.Windowed = TRUE; 
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; 
    d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; 
    d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; 

    result = pDirect3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, 
     D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,&d3dpp,&pDevice); 
    assert(!FAILED(result)); 

    result = pDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackBuffer); 
    assert(!FAILED(result)); 
} 

void D3DGraphics::BeginFrame() 
{ 
    HRESULT result; 

    result = pDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255),0.0f,0); 
    assert(!FAILED(result)); 

    result = pBackBuffer->LockRect(&backRect,NULL,NULL); 
    assert(!FAILED(result)); 
} 

void D3DGraphics::EndFrame() 
{ 
    HRESULT result; 

    result = pBackBuffer->UnlockRect(); 
    assert(!FAILED(result)); 

    result = pDevice->Present(NULL,NULL,NULL,NULL); 
    assert(!FAILED(result)); 
} 

ответ

0

Вы можете попробовать добавить WS_CLIPSIBLINGS и WS_CLIPCHILDREN в главное окно. Подробнее об этих стилях окна here.

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