2017-04-25 55 views
1

目前我正在创建使用dx9重叠的应用程序。 现在我遇到一个问题,它不会使用Alpha通道,因为我将Windows 10升级到最新版本(创作者更新) E.g.如果我试图呈现一个透明的矩形它始终保持100%,可见C++ D3D9阿尔法与创作者混合更新

设置

WNDCLASSEX wc = { 
    sizeof(WNDCLASSEX), 
    0, 
    WndProc, 
    0, 
    0, 
    nullptr, 
    LoadIcon(nullptr, IDI_APPLICATION), 
    LoadCursor(nullptr, IDC_ARROW), 
    nullptr, 
    nullptr, 
    OverlayName.c_str(), 
    LoadIcon(nullptr, IDI_APPLICATION) 
}; 

if (!RegisterClassEx(&wc)) 
    return false; 

m_hWndOverlay = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED, 
    OverlayName.c_str(), 
    OverlayName.c_str(), 
    WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, nullptr, nullptr, nullptr, nullptr); 

if (!m_hWndOverlay) 
    return false; 

if (!SetLayeredWindowAttributes(m_hWndOverlay, RGB(NULL, NULL, NULL), 255, ULW_COLORKEY | LWA_ALPHA)) 
    return false; 

static MARGINS DWMMargins = { -1, -1, -1, -1 }; 
if (!HR(DwmExtendFrameIntoClientArea(m_hWndOverlay, &DWMMargins), "DwmExtendFrameIntoClientArea()")) 
    return false; 

ShowWindow(m_hWndOverlay, SW_SHOWDEFAULT); 
if (!UpdateWindow(m_hWndOverlay)) 
    return false; 

if (!HR(Direct3DCreate9Ex(D3D_SDK_VERSION, &m_pDirect3D9Ex),  "Direct3DCreate9Ex()")) 
    return false; 

D3DPRESENT_PARAMETERS params; 
ZeroMemory(&params, sizeof(D3DPRESENT_PARAMETERS)); 

params.Windowed = TRUE; 
params.SwapEffect = D3DSWAPEFFECT_DISCARD; 
params.BackBufferFormat = D3DFMT_A8R8G8B8; 
params.EnableAutoDepthStencil = TRUE; 
params.AutoDepthStencilFormat = D3DFMT_D16; 
params.MultiSampleType = D3DMULTISAMPLE_NONE; 
params.PresentationInterval = 0x80000000L; 
DWORD dwMSQAAQuality = 0; 

if (HR(m_pDirect3D9Ex->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_A8R8G8B8, true, D3DMULTISAMPLE_NONMASKABLE, &dwMSQAAQuality), "CheckDeviceMultiSampleType()")) 
{ 
    params.MultiSampleType = D3DMULTISAMPLE_NONMASKABLE; 
    params.MultiSampleQuality = dwMSQAAQuality - 1; 
} 

if (!HR(m_pDirect3D9Ex->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWndOverlay, D3DCREATE_HARDWARE_VERTEXPROCESSING, &params, nullptr, &m_pDirect3D9Device), "CreateDeviceEx()")) 
    return false; 

Render方法

void DrawFilledRect(float x, float y, float w, float h, DWORD color) const 
{ 
VERTEX_2D_DIF V[4]; 

V[0].color = V[1].color = V[2].color = V[3].color = color; 

V[0].z = V[1].z = V[2].z = V[3].z = 0; 
V[0].rhw = V[1].rhw = V[2].rhw = V[3].rhw = 1; 

V[0].x = x; 
V[0].y = y; 
V[1].x = x + w; 
V[1].y = y; 
V[2].x = x + w; 
V[2].y = y + h; 
V[3].x = x; 
V[3].y = y + h; 

m_pDirect3D9Device->SetFVF(VERTEX_2D_DIF::FVF); 
m_pDirect3D9Device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, &V, sizeof(VERTEX_2D_DIF)); 
} 

函数调用

DrawFilledRect(25.f, 25.f, 25.f, 25.f, 0x10FFFFFF); 

有什么建议吗?它在更新之前运行良好...

+0

它会工作,如果你会禁用MSAA? – Soonts

+0

也许将'CS_PARENTDC'设置为窗口类风格和/或不设置颜色键会有帮助吗? – VTT

+0

感谢您的建议!不幸的是,它没有工作..到目前为止我尝试过的是通过设置D3DRS_ALPHABLENDENABLE和D3DRS_SEPARATEALPHABLENDENABLE来创建一个“较暗”的矩形,例如渲染设置。与颜色键0x3F00FF00但仍然没有alpha渲染.. – ZeraPain

回答

1

我现在已经找到了解决方案。

我不得不删除ULW_COLORKEY选项,该选项旨在使用crkey作为透明度颜色。这可能无法正确使用最新的创建者更新。

+0

感谢分享,今天跑到这里,并删除ULW_COLORKEY解决了它。 – Ricky65