[DirectX // Win 32] DirectX im Fenster?

Nizomi

Mitglied
Hi,
wie lasse ich DirectX im Fenster laufen?
Wie ich mit DirectDraw probiert habe
den Display Mode zu setzen kam ne Fehlermeldung zurück =/
ich hab DDSCL_NORMAL Flag beim Cooperative Level gehabt
und habe bei Display Mode angeben
400,500,8,0

also 400 breit, 500 groß und 8bit
so groß wie das Fenster war...
 
Wenn du DirectDraw im Fenstermodu verwenden willst, dann musst du unbedingt den Clipper für das Fenster aktivieren, da DirectDraw ansonsten nicht weiß, in welchen Bereich gezeichnet werden darf.
Die Erzeugung des Clippers ist denkbar einfach

Code:
lpdd = Zeiger auf das  DirectDrawObjekt;
lpddsP =Zeichenoberfläche

LPDIRECTDRAWCLIPPER lpddClip=NULL; //Zeiger auf den Clipper

//nun das Clipper-Objekt anlegen und Rückgabewert abfangen
if(FAILED(lpdd->CreateClipper(NULL,&lpddClip,NULL)))
{
    //Fehlerbehandlung
}

//nun noch dem Clipper sagen zu welchem Fenster er gehört 
if(FAILED(lpddClip->SetHWnd(0,Handle)))
{
    //Fehlerbehandlung
}

//und als letztes den Clipper mit der Zeichenoberflächer verbinden
if(FAILED(lpddsP->SetClipper(lpddClip)))
{
  //Fehlerbehandlung
}

//und schon ist direct Draw bereit für den Fensterbetrieb
 
hmm
Ja und wohin das ganze?
Ich habe keine Zeicheroberfläche (Surface) wenn ich kein Display Mode setten kann oder?
=/
 
moin


Wie siehts bei dir eigentlich mit den Grundlagen aus?
Oder programmierst du gerade einfach mal drauf los?!


mfg
umbrasaxum
 
Er meint damit, ob du Ahnung von Direct Draw hast. Zum Displaymode. Den Deisplaymode brauchst du nur einstellen wenn du ein Vollbildprogramm machst!
Zeichenoberfläche = Primäre Oberfläche!
 
JA aber bisher nur mit Fullscreen hab bissel rumprobiert habe aber noch ein Problem
meine Files:

bouncy_main.cpp:
Code:
#include <windows.h>
#include <FreeImage.h>
#include <ddraw.h>
#include "bouncy_resource.h"
#include "bouncy_functions.h"
#include "bouncy_classes.h"

BitMapObject bmoBall;
BitMapObject bmoBackground;
HBITMAP hBall;
HWND hWnd;
CBouncyBall BallClass;

LPDIRECTDRAW7 lpDD;
LPDIRECTDRAWSURFACE7 lpDDSPrimary;
LPDIRECTDRAWSURFACE7 lpDDSBack;
LPDIRECTDRAWCLIPPER  lpDDClipper;

int Bouncy_Points;
bool done;
bool bRunGame;

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
	switch(message){
		case WM_SIZE:
		{
			SetWindowPos(hWnd,0,0,0,400,500,SWP_NOMOVE | SWP_NOZORDER);
			return(0);
		}break;
		case WM_COMMAND:
		{
			switch(LOWORD(wParam)){
				case MENUID_CLOSE:
				{
                    PostMessage(hWnd,WM_DESTROY,0,0);
					return(0);
				}break;
			}
		}break;
		case WM_KEYDOWN:
		{
		switch(wParam){
			case VK_ESCAPE:
			{
				PostMessage(hWnd,WM_DESTROY,0,0);
				return(0);
			}break;
		}
		}break;
		case WM_DESTROY:
		{
			done=true;
			return(0);
		}break;
		case WM_ACTIVATE:
		{
			if( LOWORD( wParam ) == WA_INACTIVE )
{
    
    bRunGame = false;
}
else
{
    
    bRunGame = true;
}
		}break;
		default:break;
	}
	return(DefWindowProc(hWnd,message,wParam,lParam));
}
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){
	MSG message;
	WNDCLASSEX bouncyMain;
	bouncyMain.cbSize=sizeof(WNDCLASSEX);
	bouncyMain.style=CS_HREDRAW|CS_VREDRAW;
	bouncyMain.lpfnWndProc=WindowProc;
	bouncyMain.cbClsExtra=0;
	bouncyMain.cbWndExtra=0;
	bouncyMain.hInstance=hinst;
	bouncyMain.hIcon=LoadIcon(NULL,IDI_WINLOGO);
	bouncyMain.hCursor=LoadCursor(NULL,IDC_ARROW);
	bouncyMain.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
	bouncyMain.lpszMenuName=MAKEINTRESOURCE(MAIN_MENU);
	bouncyMain.lpszClassName="BouncyMainClass";
	bouncyMain.hIconSm=LoadIcon(NULL,IDI_WINLOGO);
	if(!RegisterClassEx(&bouncyMain))return(0);
	if(!(hWnd=CreateWindowEx(NULL,
                             "BouncyMainClass",
                             "Bouncy Ball",
                             WS_BORDER | WS_SYSMENU | WS_VISIBLE,
                             200, 200,
                             400, 500,
                             NULL,
                             NULL,
                             hinst,
                             NULL)))return(0);
    ShowWindow(hWnd,SW_SHOWNORMAL);
    UpdateWindow(hWnd);
    if(!Bouncy_Init())return(0);
    FreeImage_Initialise(false);
    done=false;
    while(!done){
    	while(PeekMessage(&message,hWnd,0,0,PM_REMOVE)){
    		TranslateMessage(&message);
    		DispatchMessage(&message);
    	}
    	GameLoop();
    }
    Bouncy_EndDDraw();
    PostQuitMessage(0);
	return(0);
}
bool Bouncy_Init(void){
    if(!Bouncy_InitDDraw())return(false);
    return(true);
}
bool Bouncy_InitDDraw(void){
	HRESULT ddrval;
	ddrval=DirectDrawCreateEx(NULL,(LPVOID *)&lpDD,IID_IDirectDraw7,NULL);
	if(ddrval!=DD_OK){
		return(false);
	}
	ddrval=lpDD->SetCooperativeLevel(hWnd,DDSCL_NORMAL);
	if(ddrval!=DD_OK){
		lpDD->Release();
		return(false);
	}
	DDSURFACEDESC2 ddsd;
	ZeroMemory(&ddsd,sizeof(ddsd));
	ddsd.dwSize=sizeof(ddsd);
	ddsd.dwFlags=DDSD_CAPS;
	ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
	ddrval=lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL);
	if(ddrval!=DD_OK){
		lpDD->Release();
		return(false);
	}
ZeroMemory(&ddsd, sizeof(ddsd));

ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = 400; 
ddsd.dwHeight = 500; 
ddrval=lpDD->CreateSurface(&ddsd,&lpDDSBack,NULL);
if(ddrval!=DD_OK){
	lpDD->Release();
	lpDDSPrimary->Release();
	return(false);
}
ddrval=lpDD->CreateClipper(0,&lpDDClipper,NULL);
if(ddrval!=DD_OK){
	lpDD->Release();
	lpDDSPrimary->Release();
	lpDDSBack->Release();
	return(false);
}
ddrval=lpDDClipper->SetHWnd(0,hWnd);
if(ddrval!=DD_OK){
	lpDDClipper->Release();
	lpDDSPrimary->Release();
	lpDDSBack->Release();
	lpDD->Release();
	return(false);
}
ddrval=lpDDSPrimary->SetClipper(lpDDClipper);
if(ddrval!=DD_OK){
		lpDDClipper->Release();
	lpDDSPrimary->Release();
	lpDDSBack->Release();
	lpDD->Release();
	return(false);
}
	return(true);
}
bool Bouncy_EndDDraw(void){
	if(lpDDSBack){
		lpDDSBack->Release();
		lpDDSBack=NULL;
	}
	if(lpDDSPrimary){
		lpDDSPrimary->SetClipper(NULL);
		lpDDClipper=NULL;
		lpDDSPrimary->Release();
		lpDDSPrimary=NULL;
	}
	if(lpDD){
		lpDD->Release();
		lpDD=NULL;
	}
	return(true);
}
bool GameLoop(){
    if(bRunGame){
    	DrawAll();
    }
	return(true);
}
bool DrawAll(){
    DDSURFACEDESC2 ddsd;
    UCHAR *VRam;
    int Linewidth;
    int x,y;
    ZeroMemory(&ddsd,sizeof(ddsd));
    ddsd.dwSize=sizeof(ddsd);
    lpDDSBack->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,NULL);
    Linewidth=ddsd.lPitch;
    VRam=(UCHAR *)ddsd.lpSurface;
    for(y=0;y<200;y++){
    for(x=0;x<200;x++){
    	VRam[x+y*Linewidth]=245;
    }
    }
    lpDDSBack->Unlock(NULL);
    Bouncy_Flip();
	return(true);
}
bool Bouncy_Flip(void){
	RECT rect;
	ZeroMemory(&rect,sizeof(rect));
	GetClientRect(hWnd,&rect);
	POINT p1;
	POINT p2;
	p1.x=rect.left;
	p1.y=rect.top;
	p2.x=rect.right;
	p2.y=rect.bottom;
	ClientToScreen(hWnd,&p1);
	ClientToScreen(hWnd,&p2);
	rect.left=p1.x;
	rect.top=p1.y;
	rect.right=p2.x;
	rect.bottom=p2.y;
	lpDDSPrimary->Blt(&rect,lpDDSBack,NULL,DDBLT_WAIT,NULL);
	return(true);
}
bouncy_functions.h:
Code:
bool Bouncy_Init(void);
bool GameLoop();
bool DrawAll();
bool Bouncy_InitDDraw(void);
bool Bouncy_EndDDraw(void);
bool Bouncy_Flip(void);
bouncy_classes.h:
Code:
#include <windows.h>
class BitMapObject
{
	private:
	  HDC hdcMemory;
	  HBITMAP hbmNewBitMap;
	  HBITMAP hbmOldBitMap;
	  int iWidth, iHeight;
    public:
      BitMapObject();
      ~BitMapObject();
      void Load(HDC hdcCompatible, HBITMAP hLoad);
      void Create(HDC hdcCompatible, int width, int height);
      void Destroy();
      int GetWidth();
      int GetHeight();
      operator HDC();
};

BitMapObject::BitMapObject()
{
	hdcMemory=NULL;
	hbmOldBitMap=NULL;
	hbmNewBitMap=NULL;
	iWidth=0;
	iHeight=0;
}
BitMapObject::~BitMapObject(){
	if(hdcMemory)Destroy();
}
void BitMapObject::Load(HDC hdcCompatible, HBITMAP hLoad){
	if(hdcMemory)Destroy();
	hdcMemory=CreateCompatibleDC(hdcCompatible);
	hbmNewBitMap=hLoad;
	hbmOldBitMap=(HBITMAP)SelectObject(hdcMemory,hbmNewBitMap);
	BITMAP bmp;
	GetObject(hbmNewBitMap,sizeof(BITMAP),(LPVOID)&bmp);
	iWidth=bmp.bmWidth;
	iHeight=bmp.bmHeight;
}
void BitMapObject::Create(HDC hdcCompatible, int width, int height){
	if(hdcMemory)Destroy();
	hdcMemory=CreateCompatibleDC(hdcCompatible);
	hbmNewBitMap=CreateCompatibleBitmap(hdcCompatible,width,height);
	hbmOldBitMap=(HBITMAP)SelectObject(hdcMemory,hbmNewBitMap);
	iWidth=width;
	iHeight=height;
}
void BitMapObject::Destroy(){
	SelectObject(hdcMemory,hbmOldBitMap);
	DeleteObject(hbmNewBitMap);
	DeleteDC(hdcMemory);
	hdcMemory=NULL;
	hbmOldBitMap=NULL;
	hbmNewBitMap=NULL;
	iWidth=0;
	iHeight=0;
}
BitMapObject::operator HDC(){
	return(hdcMemory);
}
int BitMapObject::GetWidth(){
	return(iWidth);
}
int BitMapObject::GetHeight(){
	return(iHeight);
}

class CBouncyBall
{
	private:
	float x,y;
	float vx,vy;
	public:
	CBouncyBall();
	~CBouncyBall();
	bool SetX(float nx);
	bool SetY(float ny);
	float GetX();
	float GetY();
	float GetVX();
    float GetVY();
	bool SetVX(float nvx);
	bool SetVY(float nvy);
};
CBouncyBall::CBouncyBall(){
	x=y=0;
	vx=vy=0;
}
CBouncyBall::~CBouncyBall(){
	x=y=0;
	vx=vy=0;
}
float CBouncyBall::GetX(){
	return(x);
}
float CBouncyBall::GetY(){
	return(y);
}
bool CBouncyBall::SetX(float nx){
	x=nx;
	return(true);
}
bool CBouncyBall::SetY(float ny){
	y=ny;
	return(true);
}
bool CBouncyBall::SetVX(float nvx){
	vx=nvx;
	return(true);
}
bool CBouncyBall::SetVY(float nvy){
	vy=nvy;
	return(true);
}
float CBouncyBall::GetVX(){
	return(vx);
}
float CBouncyBall::GetVY(){
	return(vy);
}
bouncy_resource.rc:
Code:
#include "bouncy_resource.h"

MAIN_MENU MENU
{
    MENUITEM "&Close" MENUID_CLOSE
}
bouncy_resource.h:
Code:
#define MENUID_CLOSE 1001
#define MAIN_MENU 1000

so nun hab ich das Problem das aus welchem Grund auch immer ich beim Starten nur komische Grafikverzehrungen sehe =/
 
Zurück