Fehler bei einfachem winmain Programm
-
Hallo,
-Problem behoben, jedoch ein neues entstanden(siehe post unten)-
-
Du hast vergessen, d3d9.lib zu linken.
-
Vielen dank, jetzt lässt sich das Programm immerhin schonmal Compilieren. Allerdings sollte nun ein blaues Fenster erscheinen. Tatsächlich erscheint jedoch nur kurz ein weißes fenster, welches sich sofort wieder schliest. Weiß da vielleicht zufällig jemand woran das liegt?
-
Hi Programmer,
Ich kenne mich mit DirectX leider (noch) nicht aus, also sorry, falls ich hier irgendwelchen Mist schreibe, aber ich würde sagen, dass erif (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { render(); }
nur ein einziges mal ausführt und danach deine, wenn ich das richtig identifiziert habe, main Funktion beendet. Funktioniert's denn, wenn du
while(true) { if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { render(); } }
oder so was ähnliches schreibst
MfG
DragonRaider
-
Auf die Weiße bleibt das Fenster offen, ja. Leider funtkioniert das ursprünglich geplante jedoch nicht. So ist der Hintergrund leider nicht blau, obwohl diese erste kleine directX Funktion von mir gerade dies bewirken sollte.
Ich habe das Programm jetzt auch auf das Minimum(zumindest glaube ich dass es das Minimum sein müsste) zusammengefasst und zwei Fehlermeldungen zum überprüfen des Programms eingebaut. Diese teilen mir nun somit den Rückgabewert der jeweiligen Funktion indirekt mit, was die Fehlersuche erleichtern sollte. Wenn ich das Programm nun starte erscheint ein ganz normales, leeres Windows-Fenster, jedoch immer noch mit weißem Hintergrund sowie die zweite eingestellte Meldung("Unable to Init Direct3D"). Weiß jemand wo diesmal mein Fehler liegt? Danke an alle die mir bisher geholfen haben.
#include <windows.h> #include <d3d9.h> // global variables HINSTANCE hInst; HWND wndHandle; LPDIRECT3D9 pD3D; LPDIRECT3DDEVICE9 pd3dDevice; bool initWindow(HINSTANCE hInstance); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // DirectX functions bool initDirect3D(); void render(void); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { if (!initWindow(hInstance)) { MessageBox(NULL, "Unable to create window", "ERROR", MB_OK); return false; } if (!initDirect3D()) { MessageBox(NULL, "Unable to init Direct3D", "ERROR", MB_OK); return false; } MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { render(); } } if( pd3dDevice != NULL) pd3dDevice->Release(); if( pD3D != NULL) pD3D->Release(); return (int) msg.wParam; } bool initWindow(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = 0; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "DirectX"; wcex.hIconSm = 0; RegisterClassEx(&wcex); wndHandle = CreateWindow("DirectX", "DirectX", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL); if (!wndHandle) return false; ShowWindow(wndHandle, SW_SHOW); UpdateWindow(wndHandle); return true; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, message, wParam, lParam); } /////////////////////////////////////////////////////////// // function: initDirect3D() /////////////////////////////////////////////////////////// bool initDirect3D() { pD3D = NULL; pd3dDevice = NULL; if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) { return false; } D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.BackBufferCount = 1; d3dpp.BackBufferHeight = 480; d3dpp.BackBufferWidth = 640; d3dpp.hDeviceWindow = wndHandle; if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, wndHandle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pd3dDevice ) ) ) { return false; } return true; } /////////////////////////////////////////////////////////// // function: render() /////////////////////////////////////////////////////////// void render(void) { if( NULL == pd3dDevice ) return; pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 ); pd3dDevice->Present( NULL, NULL, NULL, NULL ); }
-
Hi,
Versuch jetzt malvoid render(void) { if ( NULL == pd3dDevice) return; pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0,0,255 ), 1.0f, 0); pd3dDevice->Present( NULL, NULL, NULL, NULL); }
durch
bool render(void) { if ( NULL == pd3dDevice) return false; pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0,0,255 ), 1.0f, 0); pd3dDevice->Present( NULL, NULL, NULL, NULL); return true; }
und
while(true) { if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { render(); } }
durch
while(render()) { if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
zu erstzen. Stürzt das Programm ab/beendet es sich?
-
Immer diese Leute, die editieren und dabei neue Inhalte einfügen Ich bin raus, da ich, wie ich schon sagte, keine Ahnung von Direct3D habe.
Viel Glück/Erfolg noch, Programmer
-
sry Danke trotzdem dafür dass du mir versucht hast zu helfen
-
NP. Eine (unqualifitierte) Idee hätte ich noch:
pD3D = NULL; pd3dDevice = NULL; if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) { return false; }
zu
pD3D = NULL; pd3dDevice = NULL; pD3D = Direct3DCreate9(D3D_SDK_VERSION); if(pD3D == NULL) { return false; }
Jetzt aber wirklich : Ich bin raus