DirectX9 auf layered, transparent window
-
Ich versuche seit Tagen den Fehler zu finden, bin echt verzweifelt ^^ Das Problem ist: ich versuche auf einem Fenster mit den Eigenschaften: WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST mit DirectX9 eine weiße (RGB(255,255,255)) Linie zu zeichnen, den Hintergrund zeichne ich mit d3d9 Clear auf RGB(0,0,0). Mit SetLayeredWindowAttributes will ich den Hintergrund Transparent machen (alles mit der Farbe (RGB(0,0,0)) aber es ist immer nur das ganze Fenster Transparent und nicht nur der Hintergrund... Ich hoffe mir kann hier jmd helfen!
#include <windows.h> #include <d3d9.h> #include <d3dx9.h> #pragma comment(lib, "d3dx9.lib") #pragma comment (lib, "d3d9.lib") IDirect3D9Ex* p_Object = 0; IDirect3DDevice9Ex* p_Device = 0; D3DPRESENT_PARAMETERS p_Params; ID3DXLine* p_Line; ID3DXFont* pFontSmall = 0; void initD3D(HWND hWnd); void render(void); MSG msg; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPWSTR cmdLine, int cmdShow) { UNREFERENCED_PARAMETER(prevInstance); UNREFERENCED_PARAMETER(cmdLine); WNDCLASSEX wndClass = { 0 }; wndClass.cbClsExtra = NULL; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.cbWndExtra = NULL; wndClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 0, 0)); wndClass.hCursor = LoadCursor(0, IDC_ARROW); wndClass.hIcon = LoadIcon(0, IDI_APPLICATION); wndClass.hIconSm = LoadIcon(0, IDI_APPLICATION); wndClass.hInstance = hInstance; wndClass.lpfnWndProc = WndProc; wndClass.style = CS_VREDRAW | CS_HREDRAW; wndClass.lpszMenuName = NULL; wndClass.lpszClassName = "WndClass"; if (!RegisterClassEx(&wndClass)) return -1; HWND hwnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED, "WndClass", "Window", WS_POPUP, 0, 0, 1000, 1000, 0, 0, 0, 0); if(!hwnd) return -1; SetLayeredWindowAttributes(hwnd, RGB(0,0,0), 0, LWA_COLORKEY | LWA_ALPHA); ShowWindow(hwnd, SW_SHOW); initD3D(hwnd); for (;;) { if(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) { DispatchMessage(&msg); TranslateMessage(&msg); } Sleep(1); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_PAINT: render(); break; case WM_DESTROY: p_Device->Release(); p_Object->Release(); PostQuitMessage(0); return 0; break; default: return DefWindowProc(hwnd, message, wParam, lParam); break; } return 0; } void initD3D(HWND hwnd) { if(FAILED(Direct3DCreate9Ex(D3D_SDK_VERSION, &p_Object))) exit(1); ZeroMemory(&p_Params, sizeof(p_Params)); p_Params.Windowed = TRUE; p_Params.SwapEffect = D3DSWAPEFFECT_DISCARD; p_Params.hDeviceWindow = hwnd; p_Params.MultiSampleQuality = D3DMULTISAMPLE_NONE; p_Params.BackBufferFormat = D3DFMT_A8R8G8B8 ; p_Params.BackBufferWidth = 1000; p_Params.BackBufferHeight = 1000; p_Params.EnableAutoDepthStencil = TRUE; p_Params.AutoDepthStencilFormat = D3DFMT_D16; if(FAILED(p_Object->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &p_Params, 0, &p_Device))) exit(1); if(!p_Line) D3DXCreateLine(p_Device, &p_Line); D3DXCreateFont(p_Device, 18, 0, 0, 0, false, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Calibri", &pFontSmall); } void render(void) { p_Device->Clear(0, 0, D3DCLEAR_TARGET, 0, 1.0f, 0); p_Device->BeginScene(); D3DXVECTOR2 line[2]; line[0] = D3DXVECTOR2(0, 0); line[1] = D3DXVECTOR2(1000, 1000); p_Line->SetWidth(2); p_Line->Draw(line, 2, D3DCOLOR_RGBA(255, 255, 255, 255)); p_Device->EndScene(); p_Device->PresentEx(0, 0, 0, 0, 0); }
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.